当前位置:   article > 正文

C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现_c++链表的创建与操作

c++链表的创建与操作
  1. /* 链表的操作
  2. * 实现的功能有: 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并
  3. * 实现代码如下:
  4. * */
  5. #include <iostream>
  6. using namespace std;
  7. struct Node {
  8. int data;
  9. Node *next;
  10. Node *pre;
  11. };
  12. class LinkList {
  13. public:
  14. int size;
  15. Node *head = NULL; //链表头结点
  16. LinkList(); //构造方法
  17. ~LinkList(); //析构方法
  18. int length(LinkList *l); //返回链表长度,传入一个链表指针
  19. int getData(LinkList *l, int); //获得链表该位置的内容
  20. Node *Create(int); //创建链表
  21. Node *Insert(int); //向链表头插入数据
  22. Node *Delete(int); //删除链表
  23. void output(); //正向输出链表
  24. void output2(); //反向输出链表
  25. int Find(int); //查找链表中某一节点,返回位置
  26. void changeData(LinkList *l, int a, int index); //改变链表某一位置的值,即将index位置的数据变为a
  27. void sort(LinkList *l); //传入某一链表,对该链表进行排序
  28. LinkList* merge(LinkList *l); //合并两链表,返回新链表
  29. };
  30. LinkList::LinkList() {
  31. }
  32. LinkList *LinkList::merge(LinkList *l) {
  33. LinkList *newlist = new LinkList;
  34. Node *p = head, *q, *m = newlist->head = NULL;
  35. while (p != NULL) {
  36. q = new Node;
  37. q->data = p->data;
  38. if (newlist->head == NULL) {
  39. newlist->head = q;
  40. q->next = NULL;
  41. } else {
  42. m->next = q;
  43. q->pre = m;
  44. q->next = NULL;
  45. }
  46. m = q;
  47. p = p->next;
  48. }
  49. m->next = l->head;
  50. newlist->size = this->size + l->size;
  51. return newlist;
  52. }
  53. void LinkList::changeData(LinkList *list, int a, int index) {
  54. if (index < 0 || index > list->size) {
  55. cout << "Out of Bounds" << endl;
  56. return;
  57. }
  58. Node *current = new Node;
  59. current = list->head;
  60. int j = 1;
  61. if (index == 1) {
  62. current->data = a;
  63. } else {
  64. while (current->next != NULL) {
  65. current = current->next;
  66. j++;
  67. if (j == index)
  68. break;
  69. }
  70. current->data = a;
  71. }
  72. }
  73. int LinkList::getData(LinkList *list, int index) {
  74. if (index < 0 || index > list->size) {
  75. cout << "Out of Bounds" << endl;
  76. return -1;
  77. }
  78. Node *current = new Node;
  79. int result;
  80. current = list->head;
  81. int j = 1;
  82. if (index == 1) {
  83. result = current->data;
  84. } else {
  85. while (current->next != NULL) {
  86. current = current->next;
  87. j++;
  88. if (j == index)
  89. break;
  90. }
  91. result = current->data;
  92. }
  93. return result;
  94. }
  95. void LinkList::sort(LinkList *newlist) {
  96. int temp = 0;
  97. for (int i = 0; i < newlist->size - 1; i++) {
  98. for (int j = i + 1; j < newlist->size; j++) {
  99. if (getData(newlist, i + 1) > getData(newlist, j + 1)) {
  100. temp = getData(newlist, i + 1);
  101. changeData(newlist, getData(newlist, j + 1), i + 1);
  102. changeData(newlist, temp, j + 1);
  103. }
  104. }
  105. }
  106. }
  107. Node* LinkList::Create(int d) {
  108. size = d;
  109. cout << "请输入" << d << "个元素来创建链表" << endl;
  110. Node *p = new Node, *q;
  111. p = head;
  112. for (int i = 0; i < d; i++) {
  113. int input;
  114. cin >> input;
  115. q = new Node;
  116. q->data = input;
  117. if (head == NULL) {
  118. head = q;
  119. q->next = NULL;
  120. } else {
  121. p->next = q;
  122. q->pre = p;
  123. q->next = NULL;
  124. }
  125. p = q;
  126. }
  127. return head;
  128. }
  129. Node *LinkList::Insert(int x) {
  130. Node *p, *q;
  131. p = head;
  132. q = new Node;
  133. q->data = x;
  134. head = q;
  135. q->next = p;
  136. p->pre = q;
  137. size++;
  138. return head;
  139. }
  140. Node *LinkList::Delete(int x) {
  141. Node *p1, *p2;
  142. p1 = head;
  143. if (head == NULL) {
  144. cout << "Null List" << endl;
  145. return head;
  146. }
  147. while (p1->data != x && p1->next != NULL) {
  148. p2 = p1;
  149. p1 = p1->next;
  150. }
  151. if (p1->data == x) {
  152. if (p1 == head) {
  153. head = head->next;
  154. } else {
  155. if (p1->next == NULL) {
  156. p2->next = NULL;
  157. } else {
  158. p1->next->pre = p2;
  159. p2->next = p1->next;
  160. }
  161. }
  162. delete p1;
  163. } else
  164. cout << "Not Found Number:" << endl;
  165. size--;
  166. return head;
  167. }
  168. int LinkList::Find(int x) {
  169. Node *p;
  170. p = head;
  171. int index = 1;
  172. while (p->data != x && p->next != NULL) {
  173. p = p->next;
  174. index++;
  175. }
  176. if (p->data == x)
  177. return index;
  178. else
  179. return 0;
  180. }
  181. void LinkList::output() {
  182. Node *p = head;
  183. while (p != NULL) {
  184. cout << p->data << " ";
  185. p = p->next;
  186. }
  187. cout << endl;
  188. }
  189. void LinkList::output2() {
  190. Node *p = head;
  191. while (p->next != NULL) {
  192. p = p->next;
  193. }
  194. while (p != head) {
  195. cout << p->data << " ";
  196. p = p->pre;
  197. }
  198. cout << p->data << " ";
  199. cout << endl;
  200. }
  201. int main() {
  202. cout << "请输入第一个链表的大小" << endl;
  203. int x;
  204. cin >> x;
  205. LinkList *a = new LinkList;
  206. a->Create(x);
  207. cout << "链表为:" << endl;
  208. a->output();
  209. while (true) {
  210. cout << "您想进行什么操作? 1.向链表头插入数据"
  211. "2.删除某个数据 3.查找链表中数据 4.正向输出链表"
  212. "5.反向输出链表 6.创建新链表并合并" << endl;
  213. int w;
  214. cin >> w;
  215. switch (w) {
  216. case 1: {
  217. cout << "请输入要插入的数据" << endl;
  218. int data;
  219. cin >> data;
  220. a->Insert(data);
  221. cout << "插入后的链表是" << endl;
  222. a->output();
  223. break;
  224. }
  225. case 2: {
  226. cout << "请输入要删除的数据" << endl;
  227. int data;
  228. cin >> data;
  229. a->Delete(data);
  230. cout << "删除后的链表:" << endl;
  231. a->output();
  232. break;
  233. }
  234. case 3: {
  235. cout << "请输入要查找的数据,会输出它的位置" << endl;
  236. int data;
  237. cin >> data;
  238. int index = a->Find(data);
  239. cout << "当前链表为:" << endl;
  240. a->output();
  241. if (index == 0)
  242. cout << "数字" << data << "不存在" << endl;
  243. else
  244. cout << "數字" << data << "的位置是" << index << endl;
  245. break;
  246. }
  247. case 4: {
  248. cout << "正向输出:" << endl;
  249. a->output();
  250. break;
  251. }
  252. case 5: {
  253. cout << "反向输出" << endl;
  254. a->output2();
  255. break;
  256. }
  257. case 6: {
  258. cout << "请输入新链表的数据个数" << endl;
  259. LinkList *b = new LinkList;
  260. int x;
  261. cin >> x;
  262. b->Create(x);
  263. LinkList *c = new LinkList;
  264. a->sort(a);
  265. cout << "第一个链表:" << endl;
  266. a->output();
  267. cout << "第二个链表" << endl;
  268. b->sort(b);
  269. b->output();
  270. c = a->merge(b);
  271. c->sort(c);
  272. cout << "合并并排序后新链表如下:" << endl;
  273. c->output();
  274. cout << "大小:" << c->size << endl;
  275. break;
  276. }
  277. }
  278. }
  279. return 0;
  280. }

  1. 测试样例:
  2. /*
  3. 请输入第一个链表的大小
  4. 5
  5. 请输入5个元素来创建链表
  6. 4 5 7 9 10
  7. 链表为:
  8. 4 5 7 9 10
  9. 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并
  10. 1
  11. 请输入要插入的数据
  12. 6
  13. 插入后的链表是
  14. 6 4 5 7 9 10
  15. 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并
  16. 2
  17. 请输入要删除的数据
  18. 10
  19. 删除后的链表:
  20. 6 4 5 7 9
  21. 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并
  22. 3
  23. 请输入要查找的数据,会输出它的位置
  24. 7
  25. 当前链表为:
  26. 6 4 5 7 9
  27. 數字7的位置是4
  28. 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并
  29. 4
  30. 正向输出:
  31. 6 4 5 7 9
  32. 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并
  33. 5
  34. 反向输出
  35. 9 7 5 4 6
  36. 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并
  37. 6
  38. 请输入新链表的数据个数
  39. 3
  40. 请输入3个元素来创建链表
  41. 19 16 22
  42. 第一个链表:
  43. 4 5 6 7 9
  44. 第二个链表
  45. 16 19 22
  46. 合并并排序后新链表如下:
  47. 4 5 6 7 9 16 19 22
  48. 大小:8
  49. 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并
  50. */

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

闽ICP备14008679号