当前位置:   article > 正文

C语言实现单链表_*p=l

*p=l
  1. /*
  2. * @Author: zyx
  3. * @Date: 2020-11-01 22:22:22
  4. * @Last Modified by: zyx
  5. * @Last Modified time: 2020-11-02 17:57:58
  6. * @title: 单链表(LinkList)
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. typedef struct LNode // 定义单链表结点类型
  11. {
  12. int data; // 每个结点存放一个数据元素
  13. struct LNode *next; // 指针指向下一节点
  14. }LNode,*LinkList;
  15. // LNode *L; // 声明一个指向单链表第一个结点的指针
  16. // LinkList L; // 声明一个指向单链表第一个结点的指针
  17. // 这两个效果等价,这种命名方式增加可读性
  18. // LNode 强调结点, 而LinkList强调单链表,
  19. // 返回值是LNode *强调返回单链表的一个结点
  20. // 返回值是LinkList 强调返回一个单链表
  21. // 初始化一个单链表(无头结点)
  22. // bool InitList(LinkList L){ // 注意L是指针类型
  23. // L = NULL; // 空表,暂时无任何数据
  24. // return true;
  25. // }
  26. bool InitList(LinkList L){
  27. // 生成新节点作为头结点,用头指针L指向头结点
  28. L = (LNode *)malloc(sizeof(LNode));
  29. if(L==NULL) return false;
  30. L->next = NULL; // 头结点的指针域置空
  31. return true;
  32. }
  33. bool ListInsert(LinkList L,int i,int e){
  34. // 注意前提是头结点存在
  35. if(i<1) return false;
  36. LNode *p; // 指针p指向扫描到的结点
  37. int j = 0; //当前p指向的是第几个结点
  38. p = L; // L指向头结点,头结点是第0个结点(不存在数据)
  39. while(p!=NULL && j<i-1){// 扫描到第i-1个元素且当前节点不为空
  40. p = p->next;
  41. j++
  42. }
  43. if(p==NULL) return false; // i值不合法
  44. LNode *s = (LNode *)malloc(sizeof(LNode)); // 为新节点申请空间
  45. s->data = e;
  46. s->next = p->next;
  47. p->next = s;
  48. return true;
  49. }
  50. bool InsertNextNode(LNode *p,int e){
  51. if(p==NULL) return false;
  52. LNode *s = (LNode *)malloc(sizeof(LNode));
  53. if (s==NULL) return false;
  54. s->data = e;
  55. s->next = p->next;
  56. p->next = s;
  57. return true;
  58. }
  59. // 在结点p前插入节点s ,
  60. bool InsertPriorNode(LNode *p,LNode *s){
  61. if(p==NULL||s==NULL) return false;// 1.验证有效
  62. s->next = p->next; // 2. 先进行后插
  63. p->next = s;
  64. int temp = p->data; // 3. 将p结点数据与s结点数据交换
  65. p->data = s->data;
  66. s->data = temp;
  67. return true
  68. }
  69. // 按位序删除(带头结点)
  70. bool ListDelete(LinkList L,int i,int *e){
  71. if (i<1) return false;
  72. LNode *p; // 指针p扫描到当前节点
  73. int j = 0; // j表示到第几个结点
  74. P = L;
  75. // 找到要删除结点的前驱结点
  76. while(p!=NULL && j<i-1){
  77. p = p->next;
  78. j++;
  79. }
  80. if(p==NULL) return false;
  81. // 将前驱结点与后继结点连接
  82. LNode *q = p->next; //令q指向被删除结点
  83. *e = q->data; // e返回删除的值
  84. p->next = q->next; // 将前驱结点与后继结点相连
  85. free(q); // 释放删除结点内存
  86. return true;
  87. }
  88. // 删除指定节点p
  89. bool DeleteNode(LNode *p){
  90. if(p==NULL) return false;
  91. LNode *q = p->next; // 用q指向后继结点
  92. if(q==NULL){//如果p是尾结点,那么p->next==NULL
  93. p = NULL;
  94. return true;
  95. }
  96. p->data = p->next->data; // 和后继节点交换数据
  97. p->next = q->next; // 将后继结点从链表中剔除
  98. free(q); // 释放后继结点的存储空间;
  99. return true;
  100. }
  101. // 按位查找,返回第i个元素(带头结点)
  102. LNode *GetElem(LinkList L,int i){
  103. if(i<0) return NULL;
  104. LNode *p;
  105. j = 0;
  106. p = L;
  107. while(p!=NULL && j<i-1){
  108. p = p->next;
  109. j++;
  110. }
  111. return p;
  112. }
  113. // 按值查找,找到数据域==e的结点
  114. LNode *LocateElem(LinkList L,int e){
  115. LNode *p = L;
  116. while(p!=NULL && p->data != e){
  117. p = p->next;
  118. }
  119. return p;
  120. }
  121. // 求表长
  122. int Length(LinkList L){
  123. int len = 0;
  124. LNode *p = L;
  125. while(p->next!=NULL){
  126. p = p->next
  127. len++;
  128. }
  129. return len;
  130. }
  131. // 尾插法建立单链表,正向建立单链表
  132. LinkList ListTailInsert(LinkList L){
  133. int x;// 新节点的数据
  134. L = (LinkList)malloc(sizeof(LNode));//建立头结点 初始化空表
  135. L->next = NULL;
  136. // LNode *s,*t = L;//s表示新的结点,t表示尾结点
  137. LNode *s;
  138. LNode *t = L;
  139. scanf("%d",&x);
  140. while(x!=-1){
  141. s = (LNode *)malloc(sizeof(LNode));// 为新节点分配空间
  142. t->next = s;
  143. s->data = x;
  144. t = s;
  145. scanf("%d",&x);
  146. }
  147. t->next = NULL; //尾结点置空
  148. return L;
  149. }
  150. //头插法
  151. LinkList ListHeadInsert(LinkList L){
  152. int x;
  153. LNode *s;
  154. L = (LinkList)malloc(sizeof(LNode));
  155. L->next = NULL;
  156. scanf("%d",&x);
  157. while(x!=-1){
  158. s = (LNode *)malloc(sizeof(LNode));//为新节点分配空间
  159. s->data = x;
  160. s->next = L->next;
  161. L->next = s;
  162. scanf("%d",&x);
  163. }
  164. return L;
  165. }
  166. // 逆序单链表(带头结点)
  167. LinkList ListReverse(LinkList L){
  168. // 1. 空链表,或者只有头结点的链表
  169. if(L==NULL||L->next==NULL) return NULL;
  170. // 2. 按顺序将所有剩下的结点对【头结点的后一个结点L->next】进行头插
  171. // 直到剩余结点为空
  172. LNode *s = L->next;// 当前头结点的下一节点,之后的标志,不变
  173. LNode *r = s->next; // 当前待头插的结点,一直成为L->next
  174. while(s->next!=NULL){
  175. s->next = r->next; // H->A->B->C->D变成H->A->C->D,B
  176. r->next = L->next; // 再变成H->B->A->C->D
  177. L->next = r;
  178. // 下次循环H-B-A-C-D变成H-B-A-D,C
  179. // 再变成H-C-B-A-D
  180. }
  181. return L;
  182. }
  183. int main() {
  184. return 0;
  185. }

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

闽ICP备14008679号