当前位置:   article > 正文

算法与数据结构(c语言)——线性单链表基本操作_c语言数据结构与算法线性表链表操作

c语言数据结构与算法线性表链表操作
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int Element;
  4. typedef char(*Status)[10];
  5. #define ERROR "error"
  6. #define OK "ok";
  7. // 定义一个线性单链表结构
  8. typedef struct Node{
  9. Element data;
  10. struct Node *next;
  11. }Node,*LinkedList;
  12. // 初始化一个线性单链表
  13. LinkedList init(){
  14. Node *l;
  15. l = (Node *)malloc(sizeof(Node));
  16. l->next = NULL;
  17. return l;
  18. }
  19. // 创建一个线性单链表
  20. void create(LinkedList l){
  21. for(int i = 2; i < 5; i++){
  22. LinkedList p;
  23. p = (LinkedList)malloc(sizeof(Node));
  24. p->data = i;
  25. p->next = l->next;
  26. l->next = p;
  27. }
  28. }
  29. // 插入数据到线性单链表中(头插法)
  30. void insertHead(LinkedList l,Element e){
  31. LinkedList p;
  32. p = (LinkedList)malloc(sizeof(Node));
  33. p->data = e;
  34. p->next = l->next;
  35. l->next = p;
  36. }
  37. // 插入数据到线性单链表中(尾插法)
  38. void insertTail(LinkedList L,Element e){
  39. LinkedList p,r;
  40. //r始终指向终端结点,开始时指向头结点
  41. r = L;
  42. //就是将这个尾指针指向最后一个元素
  43. while(r->next){
  44. r = r->next;
  45. }
  46. //申请新的结点
  47. p = (LinkedList)malloc(sizeof(Node));
  48. p->data = e;
  49. // 将表尾终端节点的指针指向新节点
  50. r->next = p;
  51. // 将当前的新节点定义为表尾终端节点
  52. r = p;
  53. //表示当前链表结束
  54. r->next = NULL;
  55. }
  56. // 从线性单链表中取出指定位置的数据(位置从0开始)
  57. Status LinkedListGet(LinkedList l,int i,Element *e){
  58. LinkedList p = l->next;
  59. int j = 0;
  60. while(p&&j<i){
  61. p = p->next;
  62. j++;
  63. }
  64. if(!p||j>i){
  65. return ERROR;
  66. }
  67. *e = p->data;
  68. return OK;
  69. }
  70. // 线性单链表的指定位置插入数据
  71. Status LinkedListInsert(LinkedList L,int index,Element e){
  72. LinkedList pre,p; //pre为前驱结点
  73. pre = L->next;
  74. int tempi = 1;
  75. while(pre&&tempi<index){
  76. // 就是再寻找第i-1个节点
  77. pre = pre->next;
  78. ++tempi;
  79. }
  80. if(!pre||tempi>index){
  81. // 第index个节点不存在
  82. return ERROR;
  83. }
  84. p = (LinkedList)malloc(sizeof(Node));
  85. p->data = e;
  86. p->next = pre->next;
  87. pre->next = p;
  88. return OK;
  89. }
  90. // 删除线性单链表的指定位置元素
  91. Status LinkedListRemove(LinkedList L,int index,Element *e){
  92. LinkedList pre,p;
  93. //pre为头指针
  94. pre = L->next;
  95. int tempi = 1;
  96. // 就是在寻找第i-1个节点
  97. while(pre&&tempi<index){
  98. pre = pre->next;
  99. ++tempi;
  100. }
  101. if(!(pre->next)||tempi>index){
  102. // 第index个节点不存在
  103. return ERROR;
  104. }
  105. p = pre->next;
  106. pre->next = p->next;
  107. *e = p->data;
  108. //将p的内存进行释放
  109. free(p);
  110. return OK;
  111. }
  112. // 查找线性单链表的指定元素,存在则返回这个元素的地址(不是所在的位置哦),不存在返回NULL;
  113. Node * LinkedListIndexOf(LinkedList L,Element e){
  114. LinkedList p;
  115. if(!L){
  116. return ERROR;
  117. }
  118. p = L;
  119. while(p&&p->data!=e){
  120. p = p->next;
  121. }
  122. return p;
  123. }
  124. // 清空线性表
  125. Status LinkedListClear(LinkedList L){
  126. LinkedList p,q;
  127. p = L->next;
  128. while(p){
  129. q = p->next;
  130. free(p);
  131. p = q;
  132. }
  133. // 将头节点的指针域置为空。
  134. L->next = NULL;
  135. return OK;
  136. }
  137. // 打印出线性单链表的所有数据元素
  138. void toString(LinkedList l){
  139. printf("[");
  140. l = l->next;
  141. while(l){
  142. printf("%d",l->data);
  143. l=l->next;
  144. if(l){
  145. printf(",");
  146. }
  147. }
  148. printf("]\n");
  149. }
  150. int main(){
  151. LinkedList L = init();
  152. create(L);
  153. //insertHead(L,5);
  154. insertTail(L,1);
  155. Element a = -1;
  156. // Element *a = &1;不要干这么傻逼的事情,常数的地址赋值给指针变量没有任何意义,c语言不允许这么做。
  157. // Element *a = 1;表示*a所存储的地址值为1。
  158. // 指针是用来存放地址的!地址就是个常数!虽然这样是能编译通过的!(准确地说,只能赋值0,其他的都不合法)。
  159. // 但是,这样执行会出错(段错误)的!因为指针本来是存放地址的,而你却存放了一个常数(即一个不合法的地址),
  160. // 这样就会使指针指向不确定的内存单元(非法访问),从而出现错误!
  161. Element *intPoint=&a;
  162. // *intPoint=a;等同于:int *intPoint; *intPoint = a;
  163. // 这个指针都没指向任何地址,也就不存在值,取也就会出错
  164. // 取出链表中第0个数据元素(下标从0开始)
  165. Status res = LinkedListGet(L,0,intPoint);
  166. printf("Get() res is :%s,element is %d\n",res,*intPoint);
  167. LinkedListInsert(L,2,5);
  168. res = LinkedListRemove(L,3,intPoint);
  169. printf("remove status :%s,remove Element is %d\n",res,*intPoint);
  170. Node *indexRes = LinkedListIndexOf(L,7);
  171. printf("..index Memory address :%d\n",indexRes);
  172. //LinkedListClear(L);
  173. toString(L);
  174. return 0;
  175. }

不足和错误之处还请多多指正,谢谢!

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

闽ICP备14008679号