当前位置:   article > 正文

单链表相关操作(头插法和尾插法)_单链表的建立中,头插法建表和尾插法建表分别怎么做?

单链表的建立中,头插法建表和尾插法建表分别怎么做?

目录

1.尾插法建立单链表

带头结点

不带头节点

用户输入建立单链表

带头结点

不带头结点

2.头插法建立单链表

带头结点

用户输入建立单链表

带头结点

不带头结点


头插法和尾插法最大区别在于,尾插法可以顺序输出用户输入的元素,头插法则是逆序输出的

1.尾插法建立单链表

带头结点
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int ElemType;
  4. typedef struct LNode {
  5. ElemType data;
  6. struct LNode* next;
  7. } LNode, *LinkList;
  8. LinkList InitList(LinkList &L) {
  9. L = (LNode*)malloc(sizeof(LNode));
  10. if (L == NULL) {
  11. return NULL;
  12. }
  13. L->next = NULL;
  14. return L;
  15. }
  16. bool ListInsert(LinkList &L, int i, ElemType e) {
  17. if (i < 1) {
  18. return false;
  19. }
  20. LNode* p = L;
  21. int j = 0;
  22. while (p != NULL && j < i - 1) {
  23. p = p->next;
  24. j++;
  25. }
  26. if (p == NULL) {
  27. return false;
  28. }
  29. LNode* s = (LNode*)malloc(sizeof(LNode));
  30. s->data = e;
  31. s->next = p->next;
  32. p->next = s;
  33. return true;
  34. }
  35. int GetLen(LinkList &L) {
  36. int len = 0;
  37. LNode* p = L->next;
  38. while (p != NULL) {
  39. p = p->next;
  40. len++;
  41. }
  42. return len;
  43. }
  44. int main() {
  45. LinkList L=NULL;
  46. if (InitList(L) == NULL) {
  47. printf("链表初始化失败\n");
  48. return 0;
  49. }
  50. int length = GetLen(L);
  51. LNode* p = L;
  52. int e = 3;
  53. ListInsert(L, length, e); // 将e元素插到链表的尾部
  54. printf("链表长度:%d\n", GetLen(L));
  55. // 释放链表所占用的内存
  56. p = L->next; // p指向第一个节点
  57. while (p != NULL) {
  58. LNode* q = p->next; // q指向下一个节点
  59. free(p); // 释放当前节点
  60. p = q; // 将p指向下一个节点
  61. }
  62. return 0;
  63. }
不带头节点

只需要对i=1时做单独判断,即

  1. if (i < 1) {
  2. return false;
  3. }
  4. if (i == 1) {
  5. LNode* s = (LNode*)malloc(sizeof(LNode));
  6. s->data = e;
  7. s->next = L;
  8. L = s;
  9. return true;
  10. }

最终代码为 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int ElemType;
  4. typedef struct LNode {
  5. ElemType data;
  6. struct LNode* next;
  7. } LNode, *LinkList;
  8. LinkList InitList(LinkList &L) {
  9. L = NULL;
  10. return L;
  11. }
  12. bool ListInsert(LinkList &L, int i, ElemType e) {
  13. if (i < 1) {
  14. return false;
  15. }
  16. if (i == 1) {
  17. LNode* s = (LNode*)malloc(sizeof(LNode));
  18. s->data = e;
  19. s->next = L;
  20. L = s;
  21. return true;
  22. }
  23. LNode* p = L;
  24. int j = 1;
  25. while (p != NULL && j < i - 1) {
  26. p = p->next;
  27. j++;
  28. }
  29. if (p == NULL) {
  30. return false;
  31. }
  32. LNode* s = (LNode*)malloc(sizeof(LNode));
  33. s->data = e;
  34. s->next = p->next;
  35. p->next = s;
  36. return true;
  37. }
  38. int GetLen(LinkList &L) {
  39. int len = 0;
  40. LNode* p = L;
  41. while (p != NULL) {
  42. p = p->next;
  43. len++;
  44. }
  45. return len;
  46. }
  47. int main() {
  48. LinkList L=NULL;
  49. if (InitList(L) == NULL) {
  50. printf("链表初始化失败\n");
  51. return 0;
  52. }
  53. int length = GetLen(L);
  54. LNode* p = L;
  55. int e = 3;
  56. ListInsert(L, length+1, e); // 将e元素插到链表的尾部
  57. printf("链表长度:%d\n", GetLen(L));
  58. // 释放链表所占用的内存
  59. p = L;
  60. while (p != NULL) {
  61. LNode* q = p->next; // q指向下一个节点
  62. free(p); // 释放当前节点
  63. p = q; // 将p指向下一个节点
  64. }
  65. return 0;
  66. }
用户输入建立单链表
带头结点
  1. LinkList(LinkList &L)
  2. {
  3. int x;
  4. L=(LinkList)malloc(sizeof(LNode));
  5. LNode=*s,*r=L;
  6. scanf("%d",&x);
  7. while(x!=100)
  8. {
  9. s=(LNode*)malloc(sizeof(LNode));
  10. s->data=x;
  11. r->next=s;
  12. r=s;
  13. scanf("%d",&x);
  14. }
  15. r->next=NULL;
  16. return L;
  17. }

r总是指向表尾节点,每输入一个新值,就存入s指向的新开辟的空间,即r指向的尾节点的后面当再输入下一个值时,令r=s;将r指向这个新开辟的空间作为新的尾节点,重复上一操作

不带头结点
  1. LinkList ListInsert(LinkList &L) {
  2. int x;
  3. LNode *s, *r;
  4. scanf("%d", &x);
  5. if (x == 100) {
  6. L = NULL; // 若输入第一个元素为 100,则直接返回空链表
  7. return L;
  8. }
  9. L = (LNode*)malloc(sizeof(LNode));
  10. L->data = x;
  11. r = L;
  12. scanf("%d", &x);
  13. while (x != 100) {
  14. s = (LNode*)malloc(sizeof(LNode));
  15. s->data = x;
  16. r->next = s;
  17. r = s;
  18. scanf("%d", &x);
  19. }
  20. r->next = NULL;
  21. return L;
  22. }

2.头插法建立单链表

头插法建立单链表其实是对头节点做尾插法

带头结点
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int ElemType;
  4. typedef struct LNode {
  5. ElemType data;
  6. struct LNode* next;
  7. } LNode, *LinkList;
  8. LinkList InitList(LinkList &L) {
  9. L = (LNode*)malloc(sizeof(LNode));
  10. if (L == NULL) {
  11. return NULL;
  12. }
  13. L->next = NULL;
  14. return L;
  15. }
  16. bool InsertNextNode(LNode *p, ElemType e) {
  17. if (p == NULL)
  18. return false;
  19. LNode *s = (LNode*)malloc(sizeof(LNode));
  20. if (s == NULL)
  21. return false;
  22. s->data = e;
  23. s->next = p->next;
  24. p->next = s;
  25. return true;
  26. }
  27. int main() {
  28. LinkList L = NULL;
  29. if (InitList(L) == NULL) {
  30. printf("链表初始化失败\n");
  31. return 0;
  32. }
  33. LNode* p = L; // 指向头节点
  34. int e = 3;
  35. InsertNextNode(p, e); // 将元素3插入到头节点
  36. p = L->next; // p指向第一个节点
  37. while (p != NULL) {
  38. printf("%d ", p->data); // 打印节点数据
  39. p = p->next; // 将p指向下一个节点
  40. }
  41. printf("\n");
  42. // 释放链表所占用的内存
  43. p = L->next; // p指向第一个节点
  44. while (p != NULL) {
  45. LNode* q = p->next; // q指向下一个节点
  46. free(p); // 释放当前节点
  47. p = q; // 将p指向下一个节点
  48. }
  49. return 0;
  50. }
用户输入建立单链表
带头结点
  1. LinkList ListInsert(LinkList &L) {
  2. L = (LNode*)malloc(sizeof(LNode)); // 创建头节点
  3. L->next = NULL; // 头节点的next指针置为空
  4. LNode *s;
  5. int x;
  6. scanf("%d", &x);
  7. while (x != 100) {
  8. s = (LNode*)malloc(sizeof(LNode));
  9. s->data = x;
  10. s->next = L->next;
  11. L->next = s;
  12. scanf("%d", &x);
  13. }
  14. return L;
  15. }
不带头结点
  1. LinkList ListInsert(LinkLinst &L)
  2. {
  3. LNode *s;
  4. L=(LinkList)malloc(sizeof(LNode));
  5. L->next=NULL;//在这里必须初始化
  6. int x;
  7. scanf("%d",&x);
  8. while(x!=100)
  9. {
  10. s=(LNode*)malloc(sizeof(LNode));
  11. s->data=x;
  12. s->next=L->next;
  13. L->next=s;
  14. scanf("%d",&x);
  15. }
  16. return L;
  17. }

若不执行 L->next=NULL;

头插法插入的结果

可以看到头插法输入的元素是逆序输出的,尾插法则是顺序输出的 

如有错误请大佬们不吝赐教!

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