当前位置:   article > 正文

c语言实现链表_基于c 实现的链表

基于c 实现的链表

    最近复习到链表,感觉什么都忘了,指针、二级指针,于是今天下午,按照自己想法就手写了一个带头结点的链表,回忆回忆。里面用到了二级指针,实现了链表初的始化,头插法、尾插法创建链表,在链表的第i个位置插入x的元素,单链表的删除,在链表中删除值为x的元素,遍历链表。

    贴码如下:

 

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct Node{
  4. int data;
  5. struct Node* next;
  6. }Node,*Linkedlist;
  7. //链表初始化
  8. //头插法
  9. //尾插法
  10. //单链表的插入,在链表的第i个位置插入x的元素
  11. //单链表的删除,在链表中删除值为x的元素
  12. //遍历链表
  13. //链表初始化
  14. void initList(Linkedlist* pHead){
  15. Node* p;
  16. p = (Node*)malloc(sizeof(Node));
  17. if(p==NULL){
  18. printf("申请内存空间失败!");
  19. }
  20. else{
  21. p->next=NULL;
  22. printf("创建头结点成功!\n");
  23. *pHead=p;
  24. }
  25. }
  26. //头插法创建链表
  27. void NodeHeadCreate(Linkedlist p){
  28. if(p==NULL){
  29. printf("链表未初始化!");
  30. }
  31. int t;
  32. Node* q;
  33. printf("头插法创建链表:");
  34. while(1){
  35. scanf("%d",&t);
  36. if(t==-1){
  37. break;
  38. }
  39. q = (Node*)malloc(sizeof(Node));
  40. q->next = p->next;
  41. q->data = t;
  42. p->next = q;
  43. }
  44. }
  45. //尾插法创建链表
  46. void NodeRearCreate(Linkedlist p){
  47. if(p==NULL){
  48. printf("链表未被初始化!");
  49. }
  50. int t,d;
  51. Node* rear;
  52. Node* q;
  53. printf("尾插法创建链表:");
  54. while(1){
  55. scanf("%d",&t);
  56. if(t==-1){
  57. break;
  58. }
  59. q = (Node*)malloc(sizeof(Node));
  60. q->data = t;
  61. q->next = NULL;
  62. rear->next = q;
  63. rear = q;
  64. }
  65. }
  66. //单链表的插入,在链表的第i个位置插入x的元素
  67. void LinkedlistInsertNode(Linkedlist pHead,int i,int x){
  68. int k=0;
  69. Node* p;
  70. Node* q;
  71. p=pHead;
  72. while(p->next!=NULL){
  73. k++;
  74. if(k==i){
  75. q = (Node*)malloc(sizeof(Node));
  76. q->next=p->next;
  77. q->data=x;
  78. p->next=q;
  79. break;
  80. }
  81. p=p->next;
  82. }
  83. }
  84. //单链表的删除,在链表中删除值为x的元素
  85. void DeleteLinkedValue(Linkedlist p,int x){
  86. Node* q;
  87. q = p;
  88. int k = 0;
  89. bool flag = false;
  90. while(p->next!=NULL){
  91. if(p->next->data==x){
  92. q = p->next;
  93. p->next=q->next;
  94. free(q);
  95. flag = true;
  96. k++;
  97. }
  98. if(p->next!=NULL){//注意空指针异常,也可以放在前面
  99. p = p->next;
  100. }
  101. }
  102. if(flag){
  103. printf("成功删除节点:%d,并且存在:%d个\n",x,k);
  104. }
  105. else
  106. {
  107. printf("链表中不存在节点:%d\n",x);
  108. }
  109. }
  110. //打印链表
  111. void PrintLinklist(Linkedlist p){
  112. if(p->next!=NULL){
  113. printf("打印链表的值:");
  114. }
  115. while(p->next!=NULL){
  116. p=p->next;
  117. printf("%4d",p->data);
  118. }
  119. printf("\n");
  120. }
  121. int main(){
  122. Linkedlist list;
  123. Node* pHead;
  124. initList(&pHead);
  125. // NodeHeadCreate(pHead);
  126. NodeRearCreate(pHead);
  127. if(pHead->next==NULL){
  128. printf("请按头插法或尾插法创建链表失败!");
  129. }
  130. PrintLinklist(pHead);
  131. //请输入要删除的i值
  132. int i;
  133. printf("请输入要删除的i值:");
  134. scanf("%d",&i);
  135. DeleteLinkedValue(pHead,i);
  136. printf("删除后的链表值为:");
  137. PrintLinklist(pHead);
  138. int j,k;
  139. printf("请输入要在第i个位置插入的值x:");
  140. scanf("%d%d",&j,&k);
  141. LinkedlistInsertNode(pHead,j,k);
  142. printf("插入k值后的链表值为:");
  143. PrintLinklist(pHead);
  144. return 0;
  145. }


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

闽ICP备14008679号