C语言之链表增删查改

打印 上一主题 下一主题

主题 1952|帖子 1952|积分 5856

1.知识百科

  链表(Linked List)是计算机科学中一种基础的数据结构,通过节点(Node)的链式连接来存储数据。每个节点包含两部分:存储数据的元素和指向下一个节点的指针(单链表)或前后两个指针(双链表)。


  • 常见操纵
      插入:在头部、尾部或指定位置插入节点。
      删除:删除指定节点(需处理惩罚指针指向)。
      遍历:从头节点依次访问每个节点。
      查找:按值或位置查找节点(需遍历)。
2.链表操纵

2.1 创建链表

  创建一个链表,用于保存学生信息,分别存储姓名、学号和成绩。

  1. typedef struct STU{
  2.         char name[50];
  3.         char id[20];
  4.         float score;
  5.         struct STU *next;
  6. }STU_INFO,*P_STU;
复制代码
  添加节点,每一个节点保存一位学生信息。
  1. /*录入信息*/
  2. void STU_Input(P_STU node)
  3. {
  4.         printf("请输入姓名、学号、成绩:\n");
  5.         scanf("%s%s%f",node->name,node->id,&node->score);
  6.         while(getchar()!='\n');
  7. }
  8. /*
  9. 添加节点(尾插法)
  10. */
  11. void STU_AddNode(P_STU *head)
  12. {
  13.         if(*head==NULL)
  14.         {
  15.                 *head=malloc(sizeof(STU_INFO));//创建链表头
  16.                 (*head)->next=NULL;
  17.                 STU_Input(*head);//录入成员信息
  18.                 return ;
  19.         }
  20.         //链表头已存在
  21.         P_STU phead=*head;
  22.         //偏移指针,将phead指向链表尾
  23.         while(phead->next!=NULL)
  24.         {
  25.                 phead=phead->next;
  26.         }
  27.         //创建节点
  28.         P_STU new_node=malloc(sizeof(STU_INFO));
  29.         printf("添加节点:%p\n",new_node);
  30.         phead->next=new_node;
  31.         phead=phead->next;
  32.         phead->next=NULL;//new_node->next=NULL;
  33.         //录入信息
  34.         STU_Input(new_node);//录入成员信息
  35. }
复制代码
2.2 遍历链表

  遍历链表,查看所有学生信息。
  1. void STU_Output(P_STU head)
  2. {
  3.         P_STU phead=head;//指向链表头
  4.         while(phead!=NULL)
  5.         {
  6.                 printf("姓名:%s  学号:%s  成绩:%.1f\n",phead->name,phead->id,phead->score);
  7.                 phead=phead->next;
  8.         }
  9. }
复制代码
2.3 删除节点

  根据名字查找子节点,并删除。
  当删除的节点为中间节点,删除过程如下:

  当删除的节点为头节点,删除过程如下:

  节点删除代码实现如下,支持删除多个连续的重复节点。
  1. //查找子节点进行删除
  2. P_STU STU_FindNode_Del(P_STU head)
  3. {
  4.         //判断链表头是否为NULL
  5.         P_STU phead=head;
  6.         P_STU temp=head,temp2;
  7.         char name[50];
  8.         printf("请输入要查找的名字:\n");
  9.         scanf("%s",name);
  10.         while(getchar()!='\n');
  11.         while(phead!=NULL)
  12.         {
  13.                 if(strcmp(phead->name,name)==0)
  14.                 {
  15.                         //要删除的数据在链表头
  16.                         if(phead==head)
  17.                         {
  18.                                 temp=phead;
  19.                                 phead=phead->next;
  20.                                 free(temp);
  21.                                 head=phead;
  22.                         }
  23.                         else{
  24.                                 //要删除的数据不在链表头
  25.                                 temp->next=phead->next;
  26.                                 temp2=phead;
  27.                                 phead=phead->next;
  28.                                 free(temp2);//释放节点
  29.                         }
  30.                 }
  31.                 else //继续找下一个成员
  32.                 {
  33.                         temp=phead;
  34.                         phead=phead->next;//继续查找下一个成员
  35.                 }
  36.         }
  37.         return head;//返回链表头
  38. }
复制代码
  测试示例:
  1. int main()
  2. {
  3.         P_STU head=NULL;//定义一个结构体指针
  4.         int i=0;
  5.         //添加节点
  6.         while(1)
  7.         {
  8.                 STU_AddNode(&head);
  9.                 i++;
  10.                 if(i>=4)break;
  11.         }
  12.         printf("遍历链表\n");
  13.         STU_Output(head);
  14.         printf("删除节点\n");
  15.         head=STU_FindNode_Del(head);
  16.         printf("剩余成员信息\n");
  17.         STU_Output(head);
  18.         return 0;
  19. }
复制代码
  运行效果:
  1. wbyq@wbyq-virtual-machine $ ./a.out
  2. 请输入姓名、学号、成绩:
  3. 1 1 1
  4. 请输入姓名、学号、成绩:
  5. 2 2 2
  6. 请输入姓名、学号、成绩:
  7. 2 2 2
  8. 请输入姓名、学号、成绩:
  9. 3 3 3
  10. 遍历链表
  11. 姓名:1  学号:1  成绩:1.0
  12. 姓名:2  学号:2  成绩:2.0
  13. 姓名:2  学号:2  成绩:2.0
  14. 姓名:3  学号:3  成绩:3.0
  15. 删除节点
  16. 请输入要查找的名字:
  17. 2
  18. 剩余成员信息
  19. 姓名:1  学号:1  成绩:1.0
  20. 姓名:3  学号:3  成绩:3.0
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表