当前位置:   article > 正文

实现单链表的基本操作(c语言)_c语言实现单链表的基本操作

c语言实现单链表的基本操作

目录

链表介绍

一、实现单链表的具体操作

二、各功能实现函数详解

1.定义链表数据元素

2.创建单链表

①头插法

②尾插法

3.插入结点

4.删除结点

5.查找结点

6. 销毁链表

7.打印链表

总代码



链表介绍

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。


一、实现单链表的具体操作

  1. 定义链表元素
  2. 创建单链表:①头插法 ②尾插法
  3. 按位序插入结点
  4. 按位序删除结点
  5. 按位查找结点
  6. 销毁顺序表
  7. 打印链表

二、各功能实现函数详解

1.定义链表数据元素

代码如下(示例):

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>
  4. //定义结点
  5. typedef struct LNode{
  6. int data; //数据域
  7. struct LNode * next;//指针域
  8. }* LinkList,LNode;

2.创建单链表

头插法

代码如下(示例):

  1. void CreatList(LinkList * L){
  2. LinkList p,s;
  3. p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
  4. p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
  5. int x;
  6. printf("请输入元素,选择0即停止输入\n");
  7. scanf("%d",&x);
  8. while(x){
  9. s=(LinkList)malloc(sizeof(LNode));//创建新的结点
  10. s->data=x; //将数据赋值给新结点的数据域
  11. s->next=p->next;
  12. p->next=s;
  13. scanf("%d",&x);
  14. }
  15. }

②尾插法

代码如下(示例):

  1. void CreatList1(LinkList * L){
  2. LinkList p,s;
  3. *L=(LinkList)malloc(sizeof(LNode)); //创建头结点
  4. p=*L; //创建一直指向表尾的指针
  5. p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
  6. int x;
  7. printf("请输入元素,选择0即停止输入\n");
  8. scanf("%d",&x);
  9. while(x){
  10. s=(LinkList)malloc(sizeof(LNode));//创建新的结点
  11. s->data=x; //将数据赋值给新结点的数据域
  12. p->next=s;
  13. p=s;
  14. scanf("%d",&x);
  15. }
  16. p->next=NULL;
  17. }

3.插入结点

  1. void InsertList(LinkList * L,int i ,int e){
  2. if(i<1)
  3. return;
  4. LNode * p=*L; //p为指向当前结点的指针
  5. int j =0; //p指针指向的当前结点,当前位置为头结点
  6. while(p!=NULL && j<i-1){
  7. p=p->next;
  8. j++;
  9. }
  10. LNode * s=(LNode *)malloc(sizeof(LNode)); //创建新结点
  11. s->data = e;
  12. s->next = p->next;
  13. p->next =s;
  14. }

4.删除结点

  1. void DeleteList(LinkList * L,int i){
  2. if(i<1)
  3. return;
  4. LNode * p=*L; //p为指向当前结点的指针
  5. int j =0; //p指针指向的当前结点,当前位置为头结点
  6. while(p!=NULL && j<i-1){
  7. p=p->next;
  8. j++;
  9. }
  10. if(p->next==NULL)
  11. return;
  12. LNode * s=(LNode *)malloc(sizeof(LNode));
  13. s=p->next;
  14. p->next=s->next;
  15. free(s);
  16. }

5.查找结点

  1. void SearchList(LinkList * L,int i){
  2. if(i<1)
  3. return;
  4. LNode * p=*L; //p为指向当前结点的指针
  5. int j =0; //p指针指向的当前结点,当前位置为头结点
  6. while(p!=NULL && j<i-1){
  7. p=p->next;
  8. j++;
  9. }
  10. printf("该值为%d",p->next->data);
  11. }

6. 销毁链表

  1. void DestoryList(LinkList * L){
  2. LinkList p,temp;
  3. p=(*L)->next;//从第一个结点开始
  4. while(p!=NULL){
  5. temp=p->next;
  6. free(p);
  7. p=temp;
  8. }
  9. (*L)->next=NULL; //让头结点指针指向NULL
  10. }

7.打印链表

  1. void PrintList(LinkList L){
  2. LinkList p=L->next;
  3. while(p!=NULL){
  4. printf("%d ",p->data);
  5. p=p->next;
  6. }
  7. printf("\n");
  8. }

总代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>
  4. //定义结点
  5. typedef struct LNode{
  6. int data; //数据域
  7. struct LNode * next;//指针域
  8. }* LinkList,LNode;
  9. //函数声明
  10. void CreatList(LinkList * L);//头插法建立链表
  11. void CreatList1(LinkList * L);//尾插法建立链表
  12. void InsertList(LinkList * L,int i ,int e);//插入结点
  13. void DeleteList(LinkList * L,int i);//删除结点
  14. void SearchList(LinkList * L,int i);//按位序查找结点
  15. void DestoryList(LinkList * L);//销毁链表
  16. void DestoryList(LinkList * L);//打印链表
  17. //头插法建立单链表
  18. void CreatList(LinkList * L){
  19. LinkList p,s;
  20. p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
  21. p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
  22. int x;
  23. printf("请输入元素,选择0即停止输入\n");
  24. scanf("%d",&x);
  25. while(x){
  26. s=(LinkList)malloc(sizeof(LNode));//创建新的结点
  27. s->data=x; //将数据赋值给新结点的数据域
  28. s->next=p->next;
  29. p->next=s;
  30. scanf("%d",&x);
  31. }
  32. }
  33. //尾插法创建单链表
  34. void CreatList1(LinkList * L){
  35. LinkList p,s;
  36. *L=(LinkList)malloc(sizeof(LNode)); //创建头结点
  37. p=*L; //创建一直指向表尾的指针
  38. p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
  39. int x;
  40. printf("请输入元素,选择0即停止输入\n");
  41. scanf("%d",&x);
  42. while(x){
  43. s=(LinkList)malloc(sizeof(LNode));//创建新的结点
  44. s->data=x; //将数据赋值给新结点的数据域
  45. p->next=s;
  46. p=s;
  47. scanf("%d",&x);
  48. }
  49. p->next=NULL;
  50. }
  51. //插入结点
  52. void InsertList(LinkList * L,int i ,int e){
  53. if(i<1)
  54. return;
  55. LNode * p=*L; //p为指向当前结点的指针
  56. int j =0; //p指针指向的当前结点,当前位置为头结点
  57. while(p!=NULL && j<i-1){
  58. p=p->next;
  59. j++;
  60. }
  61. LNode * s=(LNode *)malloc(sizeof(LNode)); //创建新结点
  62. s->data = e;
  63. s->next = p->next;
  64. p->next =s;
  65. }
  66. //按位序查找结点
  67. void SearchList(LinkList * L,int i){
  68. if(i<1)
  69. return;
  70. LNode * p=*L; //p为指向当前结点的指针
  71. int j =0; //p指针指向的当前结点,当前位置为头结点
  72. while(p!=NULL && j<i-1){
  73. p=p->next;
  74. j++;
  75. }
  76. printf("该值为%d\n",p->next->data);
  77. }
  78. //删除结点
  79. void DeleteList(LinkList * L,int i){
  80. if(i<1)
  81. return;
  82. LNode * p=*L; //p为指向当前结点的指针
  83. int j =0; //p指针指向的当前结点,当前位置为头结点
  84. while(p!=NULL && j<i-1){
  85. p=p->next;
  86. j++;
  87. }
  88. if(p->next==NULL)
  89. return;
  90. LNode * s=(LNode *)malloc(sizeof(LNode));
  91. s=p->next;
  92. p->next=s->next;
  93. free(s);
  94. }
  95. //销毁链表
  96. void DestoryList(LinkList * L){
  97. LinkList p,temp;
  98. p=(*L)->next;//从第一个结点开始
  99. while(p!=NULL){
  100. temp=p->next;
  101. free(p);
  102. p=temp;
  103. }
  104. (*L)->next=NULL; //让头结点指针指向NULL
  105. //free(*L); 销毁头结点;
  106. }
  107. //打印链表
  108. void PrintList(LinkList L){
  109. LinkList p=L->next;
  110. while(p!=NULL){
  111. printf("%d ",p->data);
  112. p=p->next;
  113. }
  114. printf("\n");
  115. }
  116. int main(){
  117. printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t请输入下列你想要的操作\t\t\n");
  118. printf("\t\t1.创建链表\t\t\t2.插入结点\t\t\t3.删除结点\t\t\t\n\t\t4.按位查找\t\t\t5.销毁链表\t\t\t6.打印链表\n\t\t0.退出程序\n ");
  119. int command,num;
  120. int e;//输入的所需要查找的数值
  121. int i,a,b,c;//a为输入插入的位置,b为插入的数值,c为需要删除的位置
  122. LinkList L;
  123. do{
  124. scanf("%d",&command);
  125. switch(command)
  126. {
  127. case 1:
  128. printf("请选择头插法(1)还是尾插法(2)\n<1-2>\n");
  129. scanf("%d",&num);
  130. if(num==1) CreatList(&L);
  131. else if(num==2) CreatList1(&L);
  132. else printf("输入有误,请重新输入:");
  133. break;
  134. case 2: printf("请输入您需要插入的序列:\n");
  135. scanf("%d",&a);
  136. printf("请输入需要插入的元素:\n");
  137. scanf("%d",&b);
  138. InsertList(&L,a,b);
  139. break;
  140. case 3: printf("请输入您需要删除的内容的序号:");
  141. scanf("%d",&c);
  142. DeleteList(&L,c);
  143. break;
  144. case 4: printf("请输入需要查找的位置:");
  145. scanf("%d",&i);
  146. SearchList(&L,i);
  147. break;
  148. case 5: DestoryList(&L); break;
  149. case 6: PrintList(L); break;
  150. case 0: printf("退出成功"); break;
  151. }
  152. }while(command);
  153. }

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

闽ICP备14008679号