基于C语言实现单链表(附有两份完整的详细代码+仿真效果) ...

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

用模块化的方式借助C语言实现数据结构中的单链表(附有两份完整的详细代码)
  目次
前言
一、何为链表?
二、单链表
1.代码
2.仿真
 二、单链表的简朴应用---学生管理系统
1.代码
2.仿真
总结


前言

        链表是同数据范例的集合,不占用连续内存空间。适合分类存放空间上不连续但须要大量的连续存储空间(雷同档案馆),缺点就是检索速度慢且耗费的时间不固定。本文以单链表来阐明链表的利用,包罗创建链表表头、创建节点、指定位置删除节点、遍历打印节点、头插法插入节点、尾插法插入节点的利用。

提示:以下是本篇文章正文内容,写文章实属不易,盼望能资助到各位,转载请附上链接。
一、何为链表?

         链表说白了就是结构体的集合,是同数据范例的集合,不占用连续内存空间,通过动态内存申请将结构体指针变为结构体变量,用结构体变量去操纵链表。适合分类存放空间上不连续但须要大量的连续存储空间(雷同档案馆),缺点就是检索速度慢且耗费的时间不固定。
二、单链表

1.代码

代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Node
  4. {
  5.     int data;
  6.     struct Node *next;
  7. };
  8. //创建链表表头
  9. struct Node *creatlist()//结构指针经动态内存申请变成结构体变量
  10. {
  11.     struct Node *headNode=(struct Node*)malloc(sizeof(struct Node));
  12.     headNode->next=NULL;
  13.     return headNode;
  14. };
  15. //创建节点,要插入节点得先有节点
  16. struct Node *creatNode(int data)
  17. {
  18.     struct Node *newNode=(struct Node*)malloc(sizeof(struct Node));
  19.     newNode->data=data;
  20.     newNode->next=NULL;
  21.     return newNode;
  22. };
  23. //打印,除去表头,从第二个节点开始遍历打印
  24. void printList(struct Node *headNode)
  25. {
  26.     struct Node *Pmove=headNode->next;
  27.     while(Pmove)
  28.     {
  29.         printf("%d\t",Pmove->data);
  30.         Pmove=Pmove->next;
  31.     }
  32.     printf("\n");
  33. }
  34. //插入节点 头插法
  35. void insert_Node_By_HeadNode(struct Node *headNode,int data)
  36. {
  37.     struct Node *newNode=creatNode(data);//首先创建要插入的节点
  38.     newNode->next=headNode->next;//创建完后插入
  39.     headNode->next=newNode;
  40. }
  41. //尾插法
  42. void insertNodebyRear(struct Node *headNode, int data)
  43. {
  44.         struct Node *newNode=creatNode(data);
  45.         while(headNode->next)
  46.         {
  47.                 headNode = headNode->next;
  48.         }
  49.         headNode->next = newNode;
  50.         newNode->next = NULL;
  51. }
  52. //指定位置删除
  53. void deleteNoteByAppoin(struct Node *headNode,int posData)
  54. {
  55.         struct Node *posNode=headNode->next;
  56.         struct Node *posNodeFront=headNode;
  57.         if(posNode==NULL)
  58.         {
  59.                 printf("无法删除链表为空\n");
  60.         }
  61.         else
  62.         {
  63.                 while(posNode->data!=posData)
  64.                 {
  65.                         posNodeFront=posNode;
  66.                         posNode=posNodeFront->next;
  67.                         if(posNode==NULL)
  68.                         {
  69.                                 printf("没有找到相关信息无法删除\n");
  70.                                 return;
  71.                         }
  72.                 }
  73.                 posNodeFront->next=posNode->next;
  74.                 free(posNode);
  75.         }
  76. }
  77. int main()
  78. {
  79.     struct Node *list=creatlist();
  80.     insert_Node_By_HeadNode(list,1);
  81.     insert_Node_By_HeadNode(list,2);
  82.     insert_Node_By_HeadNode(list,3);
  83.     printList(list);
  84.     deleteNoteByAppoin(list,1);
  85.     printList(list);
  86.     insertNodebyRear(list,4);
  87.     insertNodebyRear(list,5);
  88.     printList(list);
  89.     system("pause");
  90.     return 0;
  91. }
复制代码
2.仿真


      
       仿真效果        二、单链表的简朴应用---学生管理系统

1.代码

代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct student
  4. {
  5.         char name[20];//姓名
  6.         int num;//学号
  7.         int math;//成绩
  8. };
  9. struct Node
  10. {
  11.     struct student date;
  12.     struct Node *next;
  13. };
  14. //创建链表表头
  15. struct Node *creatlist()//结构指针经动态内存申请变成结构体变量
  16. {
  17.     struct Node *headNode=(struct Node*)malloc(sizeof(struct Node));
  18.     headNode->next=NULL;
  19.     return headNode;
  20. };
  21. //创建节点,要插入节点得先有节点
  22. struct Node *creatNode(struct student date)
  23. {
  24.     struct Node *newNode=(struct Node*)malloc(sizeof(struct Node));
  25.     newNode->date=date;
  26.     newNode->next=NULL;
  27.     return newNode;
  28. };
  29. //打印,除去表头,从第二个节点开始遍历打印
  30. void printList(struct Node *headNode)
  31. {
  32.         printf("name\tnum\tmath\n");
  33.     struct Node *Pmove=headNode->next;
  34.     while(Pmove)
  35.     {
  36.         printf("%s\t%d\t%d\n",Pmove->date.name,Pmove->date.num,Pmove->date.math);
  37.         Pmove=Pmove->next;
  38.     }
  39.     printf("\n");
  40. }
  41. //插入节点 头插法
  42. void insert_Node_By_HeadNode(struct Node *headNode,struct student date)
  43. {
  44.     struct Node *newNode=creatNode(date);//首先创建要插入的节点
  45.     newNode->next=headNode->next;//创建完后插入
  46.     headNode->next=newNode;
  47. }
  48. //尾插法
  49. void insertNodebyRear(struct Node *headNode, struct student data)
  50. {
  51.         struct Node *newNode=creatNode(data);
  52.         while(headNode->next)
  53.         {
  54.                 headNode = headNode->next;
  55.         }
  56.         headNode->next = newNode;
  57.         newNode->next = NULL;
  58. }
  59. //指定位置删除,通过学号删除
  60. void deleteNoteByAppoinNum(struct Node *headNode,int num)
  61. {
  62.         struct Node *posNode=headNode->next;
  63.         struct Node *posNodeFront=headNode;
  64.         if(posNode==NULL)
  65.         {
  66.                 printf("无法删除链表为空\n");
  67.         }
  68.         else
  69.         {
  70.                 while(posNode->date.num!=num)
  71.                 {
  72.                         posNodeFront=posNode;
  73.                         posNode=posNodeFront->next;
  74.                         if(posNode==NULL)
  75.                         {
  76.                                 printf("没有找到相关信息无法删除\n");
  77.                                 return;
  78.                         }
  79.                 }
  80.                 posNodeFront->next=posNode->next;
  81.                 free(posNode);
  82.         }
  83. }
  84. int main()
  85. {
  86.     struct Node *list=creatlist();
  87.         struct student info;
  88.         while(1)
  89.         {
  90.                 printf("学生的姓名 学号 数学成绩:");
  91.                 setbuf(stdin,NULL);//清除缓存
  92.                 scanf("%s%d%d",info.name,&info.num,&info.math);
  93.                 insertNodebyRear(list,info);
  94.                 printf("continue(1/0)?\n");
  95.                 setbuf(stdin,NULL);
  96.                 int choice=0;
  97.                 scanf("%d",&choice);
  98.                 if(choice==0)
  99.                 {
  100.                         break;
  101.                 }
  102.         }
  103.     printList(list);
  104.     printf("要删除学生的学号:");
  105.     int a;
  106.     setbuf(stdin,NULL);
  107.     scanf("%d",&a);
  108.     deleteNoteByAppoinNum(list,a);
  109.     printList(list);
  110.     system("pause");
  111.     return 0;
  112. }
复制代码
2.仿真

      
       仿真效果        参考链接:

1个小时学会单链表,C语言数据结构专题_哔哩哔哩_bilibili

总结

        以上就是本日要讲的内容,本文介绍了单链表的利用方法,盼望对大家有所资助。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表