c/c++语言开发共享C语言数据结构之单链表操作详解

1、插入操作(1)创建一个新的要插入的结点(2)将新结点的 next 指针指向插入位置后的结点(3)将插入位置前的节点指针 next 指向新的结点注意:步骤(2)(3)的顺序不能颠倒,否则会导致插入位

1、插入操作

(1)创建一个新的要插入的结点

(2)将新结点的 next 指针指向插入位置后的结点

(3)将插入位置前的节点指针 next 指向新的结点

 注意:步骤(2)(3)的顺序不能颠倒,否则会导致插入位置后的部分链表丢失。

插入位置一共分三种,分别是头部插入、中间插入和尾部插入。

如图:

C语言数据结构之单链表操作详解

代码:

link* insertelem(link* p,int elem,int pos){      link* temp = p;//创建临时结点temp      //首先找到插入位置的上一个结点      for(int i=1;i<pos;i++){          temp=temp->next;          if(temp==null){              printf("插入位置无效n");              return p;          }      }       //创建插入结点c      link *c=(link*)malloc(sizeof(link));      c->elem=elem;      //向链表中插入结点      c->next = temp->next;      temp->next=c;      return p;   }  

2、删除操作

(1)将结点从链表中摘下

temp->next=temp->next->next

(2)手动释放掉结点,回收被结点占用的存储空间

如图:

C语言数据结构之单链表操作详解

 代码:

link*delelem(link*p,int pos){//p是原链表,pos是要删除的元素值       link* temp=p;      //遍历到被删除结点的上一个结点       for(int i =1;i<pos;i++){          temp=temp->next;          if(temp->next==null){              printf("没有该结点n");              return p;          }      }       link*del=temp->next;//单独开辟一块空间存放被删结点      temp->next=temp->next->next;//从链表中摘除被删结点      free(del);//手动释放该结点防止内存泄漏      return p;   }  

3、查找操作

从头遍历链表。

int searchelem(link* p,int elem){      //新建一个指针t,初始化为头指针 p      link*t=p;      int i=1;      //由于头节点的存在,因此while中的判断为t->next      while(t->next){          t=t->next;          if(t->elem==elem){              return i;          }          i++;      }      //程序执行至此处,表示查找失败      return -1;  }   

4、修改操作

先找到目标位置再更改结点的数据域。

link* changeelem(link* p,int pos,int newelem){      link* temp=p;      temp=temp->next;//在遍历之前,temp指向首元结点      //遍历到待更新结点      for(int i=1;i<pos;i++){          temp=temp->next;      }      temp->elem=newelem;      return p;  }   

5、完整代码

#include<stdio.h>  #include<stdlib.h>     typedef struct link{      int elem;//数据域       struct link *next;//指针域,用来连接后继元素   }link;//link为节点名,每个结点都是一个link结构体      link* initlink(){      link *p=(link*)malloc(sizeof(link));//创建头结点      link*temp = p;//声明一个指针temp指向头结点,也就是头结点的地址赋值给指针变量(注意这不是头指针而是用来连接数组的临时指针变量)      //生成链表      for(int i=1;i<5;i++)      {          link *a=(link*)malloc(sizeof(link));//生成一个结点           a->elem=i;//给结点的数据域赋值          a->next=null;//指针域设置为空           temp->next=a;//上一个结点的指针指向新增结点           temp=temp->next;//临时指针向后移动也可写成temp=a       }       //返回头结点,通过头节点的指针即可找到整个链表      return p;  }      link* insertelem(link* p,int elem,int pos){      link* temp = p;//创建临时结点temp      //首先找到插入位置的上一个结点      for(int i=1;i<pos;i++){          temp=temp->next;          if(temp==null){              printf("插入位置无效n");              return p;          }      }       //创建插入结点c      link *c=(link*)malloc(sizeof(link));      c->elem=elem;      //向链表中插入结点      c->next = temp->next;      temp->next=c;      return p;   }     link* delelem(link*p,int pos){//p是原链表,pos是要删除的元素值       link* temp=p;      //遍历到被删除结点的上一个结点       for(int i =1;i<pos;i++){          temp=temp->next;          if(temp->next==null){              printf("没有该结点n");              return p;          }      }       link*del=temp->next;//单独开辟一块空间存放被删结点      temp->next=temp->next->next;//从链表中摘除被删结点      free(del);//手动释放该结点防止内存泄漏      return p;   }     link* changeelem(link* p,int pos,int newelem){      link* temp=p;      temp=temp->next;//在遍历之前,temp指向首元结点      //遍历到待更新结点      for(int i=1;i<pos;i++){          temp=temp->next;      }      temp->elem=newelem;      return p;  }      int searchelem(link* p,int elem){      //新建一个指针t,初始化为头指针 p      link*t=p;      int i=1;      //由于头节点的存在,因此while中的判断为t->next      while(t->next){          t=t->next;          if(t->elem==elem){              return i;          }          i++;      }      //程序执行至此处,表示查找失败      return -1;  }      void display(link *p){      link*temp=p;//将temp指向头结点      printf("链表中的数据为 : ");       //只要temp指针指向的结点的next不是null,就执行输出语句。      while(temp->next){          temp=temp->next;          printf("%d ",temp->elem);      }       printf("n");  }      int main()  {      //初始化链表      link *p = initlink();      display(p);       printf("在第4的位置插入元素5:n");      p = insertelem(p, 5, 4);      display(p);      printf("删除元素3:n");      p = delelem(p, 3);      display(p);      printf("查找元素2的位置为:n");      int address = searchelem(p, 2);      if (address == -1) {          printf("没有该元素");      }      else {          printf("元素2的位置为:%dn", address);      }      printf("更改第3的位置上的数据为7:n");      p = changeelem(p, 3, 7);      display(p);      return 0;  }  

输出结果:

C语言数据结构之单链表操作详解

以上就是c语言数据结构之单链表操作详解的详细内容,更多关于c语言单链表操作的资料请关注<计算机技术网(www.ctvol.com)!!>其它相关文章!

需要了解更多c/c++开发分享C语言数据结构之单链表操作详解,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1237279.html

(0)
上一篇 2022年9月7日
下一篇 2022年9月7日

精彩推荐