当前位置:   article > 正文

头插法和尾插法建立单链表详解与实现_1、当前的创建单链是采用的头插法,请另在编写一个函数完成尾插法产生单链。 2、在

1、当前的创建单链是采用的头插法,请另在编写一个函数完成尾插法产生单链。 2、在

写在前面:本文使用C语言和C++引用,学C和C++的同学都是可以看懂的,C++毕竟向下兼容C。很详细,一篇能搞懂代码和原理。

先来了解几个简单概念

单链表就是线性表的链式存储;

头结点:单链表在第一个结点之前附加了一个结点,这个结点里面没有存放我们要使用的数据,只是头结点方便我们对链表进行操作而设立的;

头指针:用来标识一个单链表,头指针为NULL的话就是一个空表,本文的头指针就是LinkList L;

头插法:从一个空表开始,生成一个新的结点之后,将这个数据插在头结点和头结点指向的数据(原来的第一个数据)之间,此时这个新结点就变成了第一个数据,简单说就是把数据插入在表头。最终数据是倒序输出来的;

尾插法:也就是把数据从表尾插入进去,最后数据是你怎么输入的他就怎么输出;

头插法过程:申请好空间,输入我们要插入的数据之后,我们申请的新的结点的指针(s->next)指向后一个数据的空间(L->next),头部的指针(L->next)指向新生成的空间(s),就这么简单!

 第一步:先创建结构体,结构体里面一个存放数据的变量,一个存放指向下一个元素的指针的变量

  1. /*:第一步:定义结构体*/
  2. typedef int ElemType;//可随时修改数据的类型
  3. typedef struct LNode {
  4. ElemType data;
  5. struct LNode* next;
  6. }LNode,*LinkList;

第二步:创建变量和初始化

  1. /*第二步:创建变量和初始化*/
  2. int main()
  3. {
  4.     LinkList L;
  5.     Fore_insert(L);
  6.     Print_list(L);
  7.     return 0;
  8. }

第三步:编写头插法函数

  1. /*第三步:头插法*/
  2. LinkList Fore_insert(LinkList &L)
  3. {
  4. L = (LinkList)malloc(sizeof(LNode));//申请链表空间,最开始是空链表
  5. L->next = NULL;//链表的结构体指针赋值为空
  6. int x;//我们要插入的数据
  7. LinkList s;
  8. scanf("%d", &x);
  9. while (x != 9999) {//输入9999就停下了
  10. s = (LinkList)malloc(sizeof(LNode));//申请新结点的空间
  11. s->data = x;//把x放到结点里面去
  12. s->next = L->next;
  13. L->next = s;
  14. scanf("%d", &x);
  15. }
  16. return L;
  17. }

尾插法的过程:最开始链表是空的,申请空间之后,r表示链表尾部,链表尾部的结构体指针(r->next)指向新结点的空间(s),然后链表尾部变成了新空间s,要把r移向链表尾部(r=s),方便对接下来插入的数据进行操作,对于最后一个插入的数据,它的结构体指针要赋值成NULL。

第四步:编写尾插法函数

  1. /*第四步:尾插法*/
  2. LinkList Final_insert(LinkList& L)
  3. {
  4. L = (LinkList)malloc(sizeof(LNode));
  5. int x;
  6. LinkList s;//新结点的指针
  7. LinkList r = L;//r指向链表尾部,插入一个数据就要移动到链表尾部哦!
  8. scanf("%d", &x);
  9. while (x != 9999) {
  10. s = (LinkList)malloc(sizeof(LNode));
  11. s->data = x;
  12. r->next = s;
  13. r = s;//r移动到链表尾部
  14. scanf("%d", &x);
  15. }
  16. r->next = NULL;//一定不要忘记把最后一个结点的指针赋值为NULL
  17. return L;
  18. }

第五步:把结构体打印出来看看

  1. /*第五步:打印结构体数据*/
  2. void Print_list(LinkList L)//注意前面的头插和尾插都是传址调用,这里是传值调用
  3. {
  4. L = L->next;//L是头结点,L->next指向第一个数据
  5. while (L != NULL) {//遍历到NULL也就是最后一个数据的指针就是NULL,循环结束
  6. printf("%d ", L->data);
  7. L = L->next;
  8. }
  9. printf("\n");
  10. }

总的代码在这里:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /*:第一步:定义结构体*/
  4. typedef int ElemType;
  5. typedef struct LNode {
  6. ElemType data;
  7. struct LNode* next;
  8. }LNode,*LinkList;
  9. /*第三步:头插法*/
  10. LinkList Fore_insert(LinkList &L)
  11. {
  12. L = (LinkList)malloc(sizeof(LNode));
  13. L->next = NULL;
  14. int x;
  15. LinkList s;
  16. scanf("%d", &x);
  17. while (x != 9999) {
  18. s = (LinkList)malloc(sizeof(LNode));
  19. s->data = x;
  20. s->next = L->next;
  21. L->next = s;
  22. scanf("%d", &x);
  23. }
  24. return L;
  25. }
  26. /*第四步:尾插法*/
  27. LinkList Final_insert(LinkList& L)
  28. {
  29. L = (LinkList)malloc(sizeof(LNode));
  30. int x;
  31. LinkList s;
  32. LinkList r = L;
  33. scanf("%d", &x);
  34. while (x != 9999) {
  35. s = (LinkList)malloc(sizeof(LNode));
  36. s->data = x;
  37. r->next = s;
  38. r = s;
  39. scanf("%d", &x);
  40. }
  41. r->next = NULL;//一定不要忘记把最后一个结点的指针赋值为NULL
  42. return L;
  43. }
  44. /*第五步:打印结构体数据*/
  45. void Print_list(LinkList L)
  46. {
  47. L = L->next;//L是头结点,L->next指向第一个数据
  48. while (L != NULL) {//遍历到NULL也就是最后一个数据的指针就是NULL,循环结束
  49. printf("%d ", L->data);
  50. L = L->next;
  51. }
  52. printf("\n");
  53. }
  54. /*第二步:创建变量和初始化*/
  55. int main()
  56. {
  57. LinkList L;
  58. Fore_insert(L);
  59. Print_list(L);
  60. //Final_insert(L);
  61. //Print_list(L);
  62. return 0;
  63. }

最后的控制台输出结果如图所示:

头插法结果:

 尾插法结果:

 

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

闽ICP备14008679号