当前位置:   article > 正文

数据结构实验之单链表----单链表的基本操作_单链表的基本操作的调试分析

单链表的基本操作的调试分析

先上干货:

单链表是一种常见的数据结构,它由节点(Node)组成,每个节点包含两个部分:数据域(Data)和指针域(Next)。数据域用于存储数据,指针域用于指向下一个节点。通过节点之间的指针连接,形成一个链式结构。

单链表的基本思想是利用节点之间的指针来建立节点之间的关系。链表的头节点作为入口点,通过头节点可以访问到链表中的所有节点。每个节点通过指针域指向下一个节点,最后一个节点的指针域指向空(NULL),表示链表的尾部。

对于链表的操作,主要包括以下几种:

  1. 创建链表:生成头节点,将其他节点按需插入到链表中。
  2. 插入节点:在链表的指定位置或者链表末尾插入一个新节点。
  3. 删除节点:将链表中指定位置或者指定数值的节点删除。
  4. 查找节点:根据节点的位置或者数值查找节点。
  5. 遍历链表:按顺序输出链表中的所有节点数据。
  6. 修改节点:修改链表中指定位置或者指定数值的节点的数据。

相比于数组,链表的大小可以动态调整,插入和删除节点的时间复杂度为O(1)。但是链表的访问时间复杂度较高,需要从头节点开始顺序查找,时间复杂度为O(N)。

单链表在实际应用中经常用来解决需要频繁插入、删除和动态大小的问题,例如实现队列、栈、图等数据结构,以及处理大数据集合。

一、实验目的

1、掌握链表的建立、插入元素、删除表中某元素的算法。

2、对线链表相应算法的时间复杂度进行分析。

二、实验要求

1.实验前做好充分准备,包括复习第二章所学内容,事先预习好本次实验内容。

2.实验时记录实验结果,按要求完成各题。

3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。

三、实验内容

1.完成并实现如下链表的基本操作。要求:编写测试函数运行程序,给出结果每个基本操作的运行截图。

(1)顺序表的定义

#include <stdio.h>

#include <assert.h>

#include <malloc.h>

typedef int ElemType;  //定义类型

typedef struct LNode  //定义结点

{

    ElemType data;   //数据域

    struct LNode *next;  //指向后继结点的指针域

}LNode,*PNode;  //PNode为节点类型指针

typedef struct LinkList  //定义链表

{

    PNode first;  //头指针

    PNode last;  //尾指针

    int list_size;  //链表中有效元素个数

}LinkList;

(2)顺序表的基本操作:

void InitLinkList(LinkList *list);//初始化顺序表

代码:

void InitLinkList(LinkList *list)

{

    PNode head = _buyNode(-1);

    list->first = list->last = head;

    list->list_size=0;

}

LNode *_buyNode(ElemType Item);//新增结点

代码:

LNode *_buyNode(ElemType Item)

{

    PNode p =(PNode)malloc(sizeof(LNode));

    p->data = Item;

    p->next = NULL;

}

运行截图:

 

void push_front(LinkList *list,ElemType x);//向链表中头插结点

代码:

void push_front(LinkList *list,ElemType x)

{

    PNode p = _buyNode(x);

    p->next = list->first->next;

    list->first->next= p;

    list->list_size++;

}

运行截图:

 

void push_back(LinkList *list,ElemType x);//向链表中尾插结点

代码:

void push_back(LinkList *list,ElemType x)

{

    while(list->last->next!=NULL)

    {

        list->last=list->last->next;

    }

     PNode p = _buyNode(x);

     list->last->next=p;

    list->list_size++;

}

运行截图:

 

void showList(LinkList *list);//显示链表元素

代码:

void showList(LinkList *list)

{

    PNode p = list->first->next;

    while(p!=NULL)

    {

        printf("%d ",p->data);

        p=p->next;

    }

    printf("\n");

}

运行截图:

 

void pop_back(LinkList *list);//尾部删除结点

代码:

void pop_back(LinkList *list)

{

    free(list->last->next);

    list->last->next=NULL;

    list->list_size--;

}

运行截图:

 

void pop_front(LinkList *list);//头部删除节点

代码:

void pop_front(LinkList *list)

{

    list->first->next=list->first->next->next;

    list->list_size--;

}

运行截图:

 

int length_list(LinkList *list);//返回链表长度

代码:

int length_list(LinkList *list)

{

    printf("%d\n",list->list_size);

}

运行截图:

 

void insertLinklist_pos(LinkList *list,int pos,ElemType key);//按照pos指定的位置插入元素

代码:

void insertLinklist_pos(LinkList *list,int pos,ElemType key)

{

    PNode r=_buyNode(key);

    PNode p=_buyNode(NULL);

    p->next=list->first;

    for(int i=0;i<pos;i++)

    {

        p=p->next;

    }

    r->next=p->next;

    p->next=r;

    list->list_size++;

}

运行截图:

 

void delete_LinkList_val(LinkList *list,ElemType x);//删除第一个值为x的元素

代码:

void delete_LinkList_val(LinkList *list,ElemType x)

{

    PNode  p=_buyNode(NULL);

    p=list->first;

    while(p->next->data!=x)

    {

        p=p->next;

    }

        p->next=p->next->next;

    list->list_size--;

}

运行截图:

 

void sortLinkList(LinkList *list); //排序

代码:

void sortLinkList(LinkList *list)

{

    int i,j;

    PNode p=_buyNode(NULL);

    for(i=0;i<list->list_size;i++)

    {

        p=list->first->next;

        for(j=0;j<list->list_size-1;j++)

        {

            if(p->next->data<p->data)

            {

                int a;

                a=p->data;p->data=p->next->data;p->next->data=a;

            }

            p=p->next;

        }

    }

}

运行截图:

 

void reverseLinkList(LinkList *list);//逆置链表元素

代码:

void reverseLinkList(LinkList *list)

{

    int i,j;

    PNode p=_buyNode(NULL);

    for(i=0;i<list->list_size;i++)

    {

        p=list->first->next;

        for(j=0;j<list->list_size-1;j++)

        {

            if(p->next->data>p->data)

            {

                int a;

                a=p->data;p->data=p->next->data;p->next->data=a;

            }

            p=p->next;

        }

    }

}

运行截图:

 

int findval_val(LinkList *list,ElemType key);//查找链表中首个值为key的元素位置 

代码:

int findval_val(LinkList *list,ElemType key)

{

    int i=0;

    PNode p=_buyNode(NULL);

    p=list->first->next;

    while(p->data!=key)

    {

        p=p->next;

        i++;

    }

    if(p->data==key)

    printf("%d\n",i+1);

    else printf("没有找到\n");

}

运行截图:

 

int countX(LinkList *list,ElemType x) // 统计大于某个值的节点个数代码:

int countX(LinkList *list,ElemType x)

{

    PNode p=_buyNode(NULL);

    p=list->first->next;int a=0;

    for(int i=0;i<list->list_size;i++)

    {

        if(p->data>x)a++;

        p=p->next;

    }

    printf("%d\n",a);

}

运行截图:

 

void clearLinkList(LinkList *list);//清空单链表

代码:

void clearLinkList(LinkList *list)

{

    PNode p=_buyNode(NULL);

while (list->first->next) {

p = list->first->next;

list->first->next = p->next;

p=NULL;

}

}

运行截图:

 

void destroyLinkList(LinkList *list);//销毁单链表

代码:

void destroyLinkList(LinkList *list)

{

        free(list->first->next);

}

运行截图:

 

  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <malloc.h>
  4. typedef int ElemType; //定义类型
  5. typedef struct LNode //定义结点
  6. {
  7. ElemType data; //数据域
  8. struct LNode *next; //指向后继结点的指针域
  9. }LNode,*PNode; //PNode为节点类型指针
  10. typedef struct LinkList //定义链表
  11. {
  12. PNode first; //头指针
  13. PNode last; //尾指针
  14. int list_size; //链表中有效元素个数
  15. }LinkList;
  16. void InitLinkList(LinkList *list);//初始化链表
  17. LNode *_buyNode(ElemType Item);//新增结点
  18. void push_front(LinkList *list,ElemType x);//向链表中头插结点
  19. void push_back(LinkList *list,ElemType x);//向链表中尾插结点
  20. void showList(LinkList *list);//显示链表元素
  21. void pop_back(LinkList *list);//尾部删除结点
  22. void pop_front(LinkList *list);//头部删除节点
  23. int length_list(LinkList *list);//返回链表长度
  24. void insertLinklist_pos(LinkList *list,int pos,ElemType key);//按照pos指定的位置插入元素
  25. void delete_LinkList_val(LinkList *list,ElemType x);//删除第一个值为x的元素
  26. void sortLinkList(LinkList *list); //排序
  27. void reverseLinkList(LinkList *list);//逆置链表元素
  28. int findval_val(LinkList *list,ElemType key);//查找链表中首个值为key的元素位置
  29. int countX(LinkList *list,ElemType x); //统计大于某个值的节点个数
  30. void clearLinkList(LinkList *list);//清空单链表
  31. void destroyLinkList(LinkList *list);//销毁单链表
  1. #include "LinkList.h"
  2. void InitLinkList(LinkList *list)
  3. {
  4. }
  5. LNode *_buyNode(ElemType Item)
  6. {
  7. }
  8. void push_front(LinkList *list,ElemType x)
  9. {
  10. }
  11. void push_back(LinkList *list,ElemType x)
  12. {
  13. }
  14. void showList(LinkList *list)
  15. {
  16. }
  17. void pop_back(LinkList *list)
  18. {
  19. }
  20. void pop_front(LinkList *list)
  21. {
  22. }
  23. int length_list(LinkList *list)
  24. {
  25. }
  26. void insertLinklist_pos(LinkList *list,int pos,ElemType key)
  27. {
  28. }
  29. void delete_LinkList_val(LinkList *list,ElemType x)
  30. {
  31. }
  32. void sortLinkList(LinkList *list)
  33. {
  34. }
  35. void reverseLinkList(LinkList *list)
  36. {
  37. }
  38. int findval_val(LinkList *list,ElemType key)
  39. {
  40. }
  41. int countX(LinkList *list,ElemType x)
  42. {
  43. }
  44. void clearLinkList(LinkList *list)
  45. {
  46. }
  47. void destroyLinkList(LinkList *list)
  48. {
  49. }

#include <stdio.h>
#include "LinkList.h"

int main()
{

}
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/590860
推荐阅读
相关标签
  

闽ICP备14008679号