当前位置:   article > 正文

用结构体实现单链表_结构体链表

结构体链表

链表是指通过链式存储(使用任意不连续的内存空间)存放线性表中的数据元素,其中单链表由于一个结点只含一个指针域只能单向链接,故称单链表。


目录

前言

一、定义结构体

二、头插法

三、尾插法

四、任意结点插入(三种实现方法)

4.1.for循环插入

4.2.在已有链表中插入

4.3.(看代码)

五、删除任意结点


前言

1. 本篇文章通过自定义头插、尾插、任意结点插入、任意结点删除以及打印函数,来实现单链表。

2. 代码中的struct Node* tp1=new Node()(C++写法)也可写为struct Node* tp1=(Node*)malloc(sizeof(struct Node))(C语言写法)。


一、定义结构体

  1. #include"stdlib.h"
  2. #include"stdio.h"//头文件
  3. /*malloc(m)函数,开辟m字节长度的地址空间,并返回这段空间的首地址
  4. sizeof(x)运算,计算变量x的长度
  5. free(p)函数,释放指针p所指变量的存储空间,即彻底删除一个变量
  6. 需要加载头文件:<stdlib.h>*/
  7. struct Node
  8. {
  9. int data;
  10. struct Node* next;
  11. };//结构体
  12. struct Node* head;
  13. struct Node* last;//全局变量

二、头插法

该方法会将每次新接收到的数据都放在链表的最前面。

    struct Node* tp1=new Node();//(C++写法)也可以写成struct Node* tp1=(Node*)malloc(sizeof(struct Node))(C语言写法)
    tp1->data=x;
    tp1->next=head;
    head=tp1;

图解:

红色数字均为假定的地址

总代码如下:

  1. #include"stdlib.h"
  2. #include"stdio.h"
  3. struct Node
  4. {
  5. int data;
  6. struct Node* next;
  7. };
  8. struct Node* head;
  9. struct Node* last;
  10. void Insert_1(int x)
  11. {
  12. struct Node* tp1=new Node();
  13. tp1->data=x;
  14. tp1->next=head;
  15. head=tp1;
  16. }//自定义头插入函数(Insert_1)
  17. void Print()
  18. {
  19. struct Node* tp=head;
  20. printf("\n");//空一行
  21. printf("链表为:\n");
  22. while(tp!=NULL)
  23. {
  24. printf("%d ",tp->data);
  25. tp=tp->next;
  26. }
  27. }//自定义打印函数(Print)
  28. int main()
  29. {
  30. head=NULL;
  31. int i,n,x;
  32. printf("请输入链表长度:\n");
  33. scanf("%d",&n);
  34. printf("\n");//空一行
  35. for(i=0;i<n;i++)
  36. {
  37. printf("请输入链表倒数第%d个元素:\n",i+1);
  38. scanf("%d",&x);
  39. Insert_1(x);
  40. }
  41. Print();
  42. }

三、尾插法

该方法会将每次新接收到的数据都按输入顺序存放在链表里。

    struct Node* tp1=new Node();//(C++写法)也可以写成struct Node* tp1=(Node*)malloc(sizeof(struct Node))(C语言写法)
    if(head==NULL)
    {
    tp1->data=x;
    tp1->next=NULL;
    head=tp1;
    last=tp1;
    }
   else
   {  
       last->next=tp1;
       tp1->data=x;
       tp1->next=NULL;
       last=tp1;
    }

图解:

红色数字均为假定的地址

总代码如下:

  1. #include"stdlib.h"
  2. #include"stdio.h"
  3. struct Node
  4. {
  5. int data;
  6. struct Node* next;
  7. };
  8. struct Node* head;
  9. struct Node* last;
  10. void Insert_2(int x)
  11. {
  12. struct Node* tp1=new Node();
  13. if(head==NULL)
  14. {
  15. tp1->data=x;
  16. tp1->next=NULL;
  17. head=tp1;
  18. last=tp1;
  19. }
  20. else
  21. {
  22. last->next=tp1;
  23. tp1->data=x;
  24. tp1->next=NULL;
  25. last=tp1;
  26. }
  27. }//自定义尾插入函数(Insert_2)
  28. void Print()
  29. {
  30. struct Node* tp=head;
  31. printf("\n");//空一行
  32. printf("链表为:\n");
  33. while(tp!=NULL)
  34. {
  35. printf("%d ",tp->data);
  36. tp=tp->next;
  37. }
  38. }//自定义打印函数(Print)
  39. int main()
  40. {
  41. head=NULL;
  42. int i,n,x;
  43. printf("请输入链表长度:\n");
  44. scanf("%d",&n);
  45. printf("\n");//空一行
  46. for(i=0;i<n;i++)
  47. {
  48. printf("请输入链表第%d个元素:\n",i+1);
  49. scanf("%d",&x);
  50. Insert_2(x);
  51. }
  52. Print();
  53. }

四、任意结点插入(三种实现方法)

该代码可以实现在链表任意节点插入数据。

    struct Node* tp1=new Node();//(C++写法)也可以写成struct Node* tp1=(Node*)malloc(sizeof(struct Node))(C语言写法)
    tp1->data=data;
    tp1->next=NULL;
    if(n==1)
    {
        tp1->next=head;
        head=tp1;
    }
    else
    {
        struct Node* tp2=head;
        for(int i=0;i<n-2;i++)
        {
            tp2=tp2->next;
        }
        tp1->next=tp2->next;
        tp2->next=tp1;
    }

4.1.for循环插入

  1. #include"stdlib.h"
  2. #include"stdio.h"
  3. struct Node
  4. {
  5. int data;
  6. struct Node* next;
  7. };
  8. struct Node* head;
  9. struct Node* last;
  10. void Insert_3(int data,int n)
  11. {
  12. struct Node* tp1=new Node();//或者struct Node* tp=(Node*)malloc(sizeof(struct Node))(创建一个节点)
  13. tp1->data=data;
  14. tp1->next=NULL;
  15. if(n==1)
  16. {
  17. tp1->next=head;
  18. head=tp1;
  19. }
  20. else
  21. {
  22. struct Node* tp2=head;
  23. for(int i=0;i<n-2;i++)
  24. {
  25. tp2=tp2->next;
  26. }
  27. tp1->next=tp2->next;
  28. tp2->next=tp1;
  29. }
  30. }//自定义任意插入函数(Insert_3)
  31. void Print()
  32. {
  33. struct Node* tp=head;
  34. printf("\n");//空一行
  35. printf("链表为:\n");
  36. while(tp!=NULL)
  37. {
  38. printf("%d ",tp->data);
  39. tp=tp->next;
  40. }
  41. }//自定义打印函数(Print)
  42. int main()
  43. {
  44. head=NULL;
  45. int i,n,x,y,z;
  46. printf("请输入链表长度:\n");
  47. scanf("%d",&n);
  48. printf("\n");
  49. for(i=0;i<n;i++)
  50. {
  51. printf("请插入链表第%d个元素及位置(s)(1≤s≤%d,s∈N*):\n",i+1,i+1);
  52. scanf("%d%d",&x,&y);
  53. Insert_3(x,y);
  54. }
  55. Print();
  56. }

4.2.在已有链表中插入

  1. #include"stdlib.h"
  2. #include"stdio.h"
  3. struct Node
  4. {
  5. int data;
  6. struct Node* next;
  7. };
  8. struct Node* head;
  9. struct Node* last;
  10. void Insert_2(int x)
  11. {
  12. struct Node* tp1=new Node();
  13. if(head==NULL)
  14. {
  15. tp1->data=x;
  16. tp1->next=NULL;
  17. head=tp1;
  18. last=tp1;
  19. }
  20. else
  21. {
  22. last->next=tp1;
  23. tp1->data=x;
  24. tp1->next=NULL;
  25. last=tp1;
  26. }
  27. }//自定义尾插入函数(Insert_2)
  28. void Print()
  29. {
  30. struct Node* tp=head;
  31. printf("\n");//空一行
  32. printf("链表为:\n");
  33. while(tp!=NULL)
  34. {
  35. printf("%d ",tp->data);
  36. tp=tp->next;
  37. }
  38. }//自定义打印函数(Print)
  39. void Insert_3(int data,int n)
  40. {
  41. struct Node* tp1=new Node();//或者struct Node* tp=(Node*)malloc(sizeof(struct Node))(创建一个节点)
  42. tp1->data=data;
  43. tp1->next=NULL;
  44. if(n==1)
  45. {
  46. tp1->next=head;
  47. head=tp1;
  48. }
  49. else
  50. {
  51. struct Node* tp2=head;
  52. for(int i=0;i<n-2;i++)
  53. {
  54. tp2=tp2->next;
  55. }
  56. tp1->next=tp2->next;
  57. tp2->next=tp1;
  58. }
  59. }//自定义任意插入函数(Insert_3)
  60. int main()
  61. {
  62. head=NULL;
  63. int i,n,x,y,z;
  64. printf("请输入链表长度(不包括将要插入数据):\n");
  65. scanf("%d",&n);
  66. printf("\n");//空一行
  67. for(i=0;i<n;i++)
  68. {
  69. printf("请输入链表第%d个元素:\n",i+1);
  70. scanf("%d",&x);
  71. Insert_2(x);
  72. }
  73. printf("请输入要插入链表的数据及位置:\n");
  74. scanf("%d%d",&x,&y);
  75. Insert_3(x,y);
  76. Print();
  77. }

4.3.(看代码)

  1. //前面的代码就不展示了
  2. int main()
  3. {
  4. head=NULL;
  5. Insert_3(3,1);
  6. Insert_3(1,2);
  7. Insert_3(4,3);
  8. Print();
  9. }
  10. //输出:3 1 4

五、删除任意结点

该代码可以实现删除链表中任意节点里的数据。

    struct Node* tp1=head;
    if(n==1)
    {
        head=tp1->next;
        free(tp1);
    }
    else
    {
        struct Node* tp2;
        int i;
        for(i=0;i<n-2;i++)
        {
            tp1=tp1->next;
        }
        tp2=tp1->next;
        tp1->next=tp2->next;
        free(tp2);
    }

总代码如下:

  1. #include"stdlib.h"
  2. #include"stdio.h"
  3. struct Node
  4. {
  5. int data;
  6. struct Node* next;
  7. };
  8. struct Node* head;
  9. struct Node* last;
  10. void Delect(int n)
  11. {
  12. struct Node* tp1=head;
  13. if(n==1)
  14. {
  15. head=tp1->next;
  16. free(tp1);
  17. }
  18. else
  19. {
  20. struct Node* tp2;
  21. int i;
  22. for(i=0;i<n-2;i++)
  23. {
  24. tp1=tp1->next;
  25. }
  26. tp2=tp1->next;
  27. tp1->next=tp2->next;
  28. free(tp2);
  29. }
  30. }//自定义删除函数(Delect)
  31. void Insert_2(int x)
  32. {
  33. struct Node* tp1=new Node();//或者struct Node* tp=(Node*)malloc(sizeof(struct Node))(创建一个节点)
  34. if(head==NULL)
  35. {
  36. tp1->data=x;
  37. tp1->next=NULL;
  38. head=tp1;
  39. last=tp1;
  40. }
  41. else
  42. {
  43. last->next=tp1;
  44. tp1->data=x;
  45. tp1->next=NULL;
  46. last=tp1;
  47. }
  48. }//自定义尾插入函数(Insert_2)
  49. void Print()
  50. {
  51. struct Node* tp=head;
  52. printf("\n");//空一行
  53. printf("链表为:\n");
  54. while(tp!=NULL)
  55. {
  56. printf("%d ",tp->data);
  57. tp=tp->next;
  58. }
  59. }//自定义打印函数(Print)
  60. int main()
  61. {
  62. head=NULL;
  63. int i,n,x,y;
  64. printf("请输入链表长度:\n");
  65. scanf("%d",&n);
  66. printf("\n");//空一行
  67. for(i=0;i<n;i++)
  68. {
  69. printf("请输入链表第%d个元素:\n",i+1);
  70. scanf("%d",&x);
  71. Insert_2(x);
  72. }
  73. Print();
  74. printf("\n");//空一行
  75. printf("\n请输入需要删除链表元素的位置(s):\n");
  76. scanf("%d",&y);
  77. Delect(y);
  78. Print();
  79. }

感谢各位大佬们的阅读,要是能再点个赞加个关注就更好了\^o^/

如有不妥的地方,请各位大佬移步评论区指正

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

闽ICP备14008679号