• 单链表的简单使用


    1. #include<stdio.h>
    2. #include <malloc.h>
    3. typedef struct LNode { //定义节点类型
    4. int data; //数据域
    5. struct LNode* next; //指针域
    6. }LNode, * LinkList;
    7. //在链表中获得一个元素
    8. LNode* GetElem(LinkList L, int i) {
    9. int j = 1;
    10. LNode* p = L->next;
    11. if (i == 0) {
    12. return L;
    13. }
    14. if (i < 1) {
    15. return NULL;
    16. }
    17. while (p != NULL && j < i) {
    18. p = p->next;
    19. j++;
    20. }
    21. return p;//返回这个节点
    22. }
    23. //初始化不带头结点的单链表
    24. bool InitList(LinkList &L) {
    25. L = NULL; //防止脏数据
    26. return true;
    27. }
    28. //判断是否为空
    29. bool IsEmpty(LinkList L) {
    30. return (L == NULL);
    31. }
    32. //初始化带有头结点的单链表
    33. bool InitListHasHead(LinkList& L) {
    34. L = (LNode*)malloc(sizeof(LNode));//L指向创建的头结点
    35. if (L == NULL) {
    36. return false;//分配失败,内存不足
    37. }
    38. L->next = NULL;
    39. return true;
    40. }
    41. //判断是否为空
    42. bool IsEmpty(LinkList L) {
    43. return (L->next == NULL);
    44. }
    45. //带头结点的按位序插入
    46. bool InsertListHasHead(LinkList& L, int i, int e) {
    47. if (i < 1) return false;
    48. LNode* p; //p指向当前扫描到的节点
    49. int j = 0; //当前p指向的是第几个节点,头结点为第0个节点
    50. p = L; //L指向头结点
    51. while (p != NULL && j < i - 1) {
    52. //循环找到第i - 1个节点
    53. p = p->next;
    54. j++;
    55. }
    56. if (p == NULL) return false;
    57. //新分配一个节点
    58. LNode* s = (LNode*)malloc(sizeof(LNode));
    59. s->data = e;//赋值
    60. s->next = p->next;
    61. p->next = s;
    62. return true;
    63. }
    64. //不带头结点的插入
    65. bool InsertListNoHead(LinkList& L, int i, int e) {
    66. if (i < 1) return false;
    67. if (i == 1) {
    68. LNode* s = (LNode*)malloc(sizeof(LNode));
    69. s->data = e;
    70. s->next = L;
    71. L = s;
    72. return true;
    73. }
    74. LNode* p; //p指向当前扫描到的节点
    75. int j = 1; //当前p指向的是第几个节点,头结点为第0个节点
    76. p = L; //L指向头结点
    77. while (p != NULL && j < i - 1) {
    78. //循环找到第i - 1个节点
    79. p = p->next;
    80. j++;
    81. }
    82. if (p == NULL) return false;
    83. //新分配一个节点
    84. LNode* s = (LNode*)malloc(sizeof(LNode));
    85. s->data = e;//赋值
    86. s->next = p->next;
    87. p->next = s;
    88. return true;
    89. }
    90. //指定节点的后插操作
    91. bool InsertNextNode(LNode *p,int e) {
    92. if (p == NULL) return false;
    93. LNode* s = (LNode*)malloc(sizeof(LNode));
    94. if (s == NULL) return false; //内存分配失败
    95. s->data = e;
    96. s->next = p->next;
    97. p->next = s;
    98. return true;
    99. }
    100. //指定节点的前插操作
    101. bool InsertPriorNode1(LNode* p, int e) {
    102. if (p == NULL) return false;
    103. LNode* s = (LNode*)malloc(sizeof(LNode));
    104. if (s == NULL) return false;
    105. s->next = p->next;
    106. p->next = s;
    107. s->data = p->data; //p的元素复制到s中
    108. p->data = e; //p中元素覆盖为e
    109. return true;
    110. }
    111. bool InsertPriorNode2(LNode* p, LNode* s) {
    112. if (p == NULL) return false;
    113. s->next = p->next;
    114. p->next = s;
    115. int temp = p->data;
    116. p->data = s->data;
    117. s->data = temp;
    118. return true;
    119. }
    120. //带头结点的按位序删除
    121. bool ListDelete(LinkList& L, int i, int& e) {
    122. if (i < 1) return false;
    123. LNode* p; //p指向当前扫描到的节点
    124. int j = 0; //当前p指向的是第几个节点,头结点为第0个节点
    125. p = L; //L指向头结点
    126. while (p != NULL && j < i - 1) {
    127. //循环找到第i - 1个节点
    128. p = p->next;
    129. j++;
    130. }
    131. if (p == NULL) return false;
    132. if (p->next == NULL) return false;
    133. LNode* q = p->next; //令q指向被删除的节点
    134. e = q->data;//存储被删除的元素
    135. p->next = q->next;
    136. free(q);
    137. return true;
    138. }
    139. //删除指定节点
    140. bool DeleteNode(LNode* p) {
    141. if (p == NULL) return false;
    142. LNode* q = p->next;
    143. p->data = p->next->data;
    144. p->next = q->next;
    145. free(q);
    146. return true;
    147. }
    148. //按位查找,返回第i个 元素
    149. LNode* GetElem(LinkList L, int i) {
    150. if (i < 0) return NULL;
    151. LNode* p; //指针p指向当前扫描到的节点
    152. int j = 0; //当前p指向的是第几个节点
    153. p = L; //L指向的是头结点,头结点为0且不存储数据
    154. while (p != NULL && j < i) {
    155. //循环找到第i个节点
    156. p = p->next;
    157. j++;
    158. }
    159. return p;
    160. }
    161. //按值查找
    162. LNode* LocataElem(LinkList L, int e) {
    163. LNode* p = L->next;
    164. while (p != NULL && p->data != e) {
    165. p = p->next;
    166. }
    167. return p;
    168. }
    169. //求表的长度
    170. int length(LinkList L) {
    171. int len = 0;
    172. LNode* p = L;
    173. while (p->next != NULL){
    174. p = p->next;
    175. len++;
    176. }
    177. return len;
    178. }
    179. //尾插法建立单链表,在p节点后插入元素e
    180. bool InsertNextNode(LNode* p, int e) {
    181. if (p == NULL) return false;
    182. LNode* s = (LNode*)malloc(sizeof(LNode));
    183. if (s == NULL) return false;
    184. s->data = e;
    185. s->next = p->next;
    186. p->next = s;
    187. return false;
    188. }
    189. LinkList ListTailInsert(LinkList& L) {
    190. int x;
    191. L = (LinkList)malloc(sizeof(LNode)); //创建头结点
    192. LNode* s, * r = L; //r为表尾指针
    193. scanf("%d", &x);
    194. while (x != 9999) {
    195. s = (LNode*)malloc(sizeof(LNode));
    196. s->data = x;
    197. r->next = s; //r指向新的节点
    198. r = s;
    199. }
    200. r->next = NULL;
    201. return L;
    202. }
    203. //头插法建立单链表
    204. LinkList ListHeadInsert(LinkList& L) {
    205. LNode* s;
    206. int x;
    207. L = (LinkList)malloc(sizeof(LNode)); //创建头结点
    208. L->next = NULL; //初始为空链表
    209. scanf("%d", &x);
    210. while (x != 9999) {
    211. s = (LNode*)malloc(sizeof(LNode));
    212. s->data = x;
    213. s->next = L->next; //r指向新的节点
    214. L->next = s;
    215. scanf("%d", &x);
    216. }
    217. return L;
    218. }
    219. void test() {
    220. LinkList L; //生命一个指向单链表的指针,即头指针
    221. InitList(L); //初始化一个空表
    222. }

  • 相关阅读:
    AssetBundle检测服务使用指南
    各个厂家的RTSP地址格式
    郑州分销系统开发|如何实现快速分销裂变?
    【前端实例代码】使用html+css+JavaScript实现带有波浪跳跃动画的登录表单页面
    HDLBits: 在线学习 SystemVerilog(三)-Problem 10-14
    软件设计师 计算机系统基础知识
    flask捕获@app.errorhandler/@app.after_request全局异常总结
    Android 沉浸式状态栏
    C++:类和对象(三)
    做测试8年,33岁前只想追求大厂高薪,今年只求稳定收入
  • 原文地址:https://blog.csdn.net/weixin_46272350/article/details/125626881