• 数据结构-单链表存储


            如果说,顺序表的所占用的内存空间是连续的,那么链表则是随机分配的不连续的,那么为了使随机分散的内存空间串联在一起形成一种前后相连的关系,指针则起到了关键性作用。

            

    单链表的基本结构:

     

    头指针:永远指向链表第一个节点的位置。

     头结点:不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题。

    首元结点:首个带有元素的结点。

    其他结点:链表中其他的节点。

    1、定义一个链表结点:

            包括数据域和指针域

    1. typedef struct Link{
    2. char elem;//数据域
    3. struct Link *next;//指针域,用来连接后继元素
    4. }link;//link为节点名,每个结点都是一个link结构体

    2、初始化单链表:

    (1)创建一个头结点

    (2)声明一个临时指针指向头结点

    (3)用循环创建新的结点并赋值且依次相连

            newLink a;

            a->data=i;

            a->next=null;

            temp->next=a;

            temp=a;

    过程如下:

     带头结点:

    1. link * initLink(){
    2. link *p=(link*)malloc(sizeof(link));//创建头结点
    3. link*temp = p;//声明一个指针temp指向头结点,也就是头结点的地址赋值给指针变量(注意这不是头指针而是用来连接数组的临时指针变量)
    4. //生成链表
    5. for(int i=1;i<5;i++)
    6. {
    7. link *a=(link*)malloc(sizeof(link));//生成一个结点
    8. a->elem=i;//给结点的数据域赋值
    9. a->next=NULL;//指针域设置为空
    10. temp->next=a;//上一个结点的指针指向新增结点
    11. temp=temp->next;//临时指针向后移动也可写成temp=a
    12. }
    13. //返回头结点,通过头节点的指针即可找到整个链表
    14. return p;
    15. }

    无头结点的单链表初始化:

    1. link * initLink2(){
    2. link *p=NULL;//创建头指针
    3. link*temp=(link*)malloc(sizeof(link));//创建首元结点
    4. //首元结点初始化
    5. temp->elem=1;
    6. temp->next=NULL;
    7. p=temp;//头结点指向首元结点
    8. //接下来从第二个结点开始创建
    9. for(int i=2;i<5;i++){
    10. //创建一个新结点并初始化
    11. link *a=(link*)malloc(sizeof(link));
    12. a->elem=i;
    13. a->next=NULL;
    14. //将temp结点与新建的a结点建立逻辑关系
    15. temp->next=a;
    16. temp=a;
    17. }
    18. //返回建立的节点,只返回头指针 p即可,通过头指针即可找到整个链表
    19. return p;
    20. }

     

    3、输出链表数据:

            带头结点:

    1. void display(link *p){
    2. link*temp=p;//将temp指向头结点
    3. //只要temp指针指向的结点的next不是Null,就执行输出语句。
    4. while(temp->next){
    5. temp=temp->next;
    6. printf("%d ",temp->elem);
    7. }
    8. printf("\n");
    9. }

              不带头结点:

    1. void display2(link *p){
    2. link* temp=p;//将temp指针重新指向头结点
    3. //只要temp指针指向的结点的next不是Null,就执行输出语句。
    4. while (temp) {
    5. printf("%d ",temp->elem);
    6. temp=temp->next;
    7. }
    8. printf("\n");
    9. }

    4、完整代码:

    1. #include
    2. #include
    3. typedef struct Link{
    4. int elem;//数据域
    5. struct Link *next;//指针域,用来连接后继元素
    6. }link;//link为节点名,每个结点都是一个link结构体
    7. //带头结点
    8. link * initLink(){
    9. link *p=(link*)malloc(sizeof(link));//创建头结点
    10. link*temp = p;//声明一个指针temp指向头结点,也就是头结点的地址赋值给指针变量(注意这不是头指针而是用来连接数组的临时指针变量)
    11. //生成链表
    12. for(int i=1;i<5;i++)
    13. {
    14. link *a=(link*)malloc(sizeof(link));//生成一个结点
    15. a->elem=i;//给结点的数据域赋值
    16. a->next=NULL;//指针域设置为空
    17. temp->next=a;//上一个结点的指针指向新增结点
    18. temp=temp->next;//临时指针向后移动也可写成temp=a
    19. }
    20. //返回头结点,通过头节点的指针即可找到整个链表
    21. return p;
    22. }
    23. //不带头结点
    24. link * initLink2(){
    25. link *p=NULL;//创建头指针
    26. link*temp=(link*)malloc(sizeof(link));//创建首元结点
    27. //首元结点初始化
    28. temp->elem=1;
    29. temp->next=NULL;
    30. p=temp;//头结点指向首元结点
    31. //接下来从第二个结点开始创建
    32. for(int i=2;i<5;i++){
    33. //创建一个新结点并初始化
    34. link *a=(link*)malloc(sizeof(link));
    35. a->elem=i;
    36. a->next=NULL;
    37. //将temp结点与新建的a结点建立逻辑关系
    38. temp->next=a;
    39. temp=a;
    40. }
    41. //返回建立的节点,只返回头指针 p即可,通过头指针即可找到整个链表
    42. return p;
    43. }
    44. //带头结点
    45. void display(link *p){
    46. link*temp=p;//将temp指向头结点
    47. //只要temp指针指向的结点的next不是Null,就执行输出语句。
    48. while(temp->next){
    49. temp=temp->next;
    50. printf("%d ",temp->elem);
    51. }
    52. printf("\n");
    53. }
    54. //不带头结点
    55. void display2(link *p){
    56. link* temp=p;//将temp指针重新指向头结点
    57. //只要temp指针指向的结点的next不是Null,就执行输出语句。
    58. while (temp) {
    59. printf("%d ",temp->elem);
    60. temp=temp->next;
    61. }
    62. printf("\n");
    63. }
    64. int main()
    65. {
    66. display(initLink());
    67. return 0;
    68. }

    输出结果:

     

  • 相关阅读:
    如何优雅重启 kubernetes 的 Pod
    微信小程序(原生)使用Swiper实现(商品详情)视频和图片轮播(仿京东/淘宝商品详情头部视频+图片轮播)
    阿里技术2022年最新学习思路:高性能+微服务+分布式+spring全家桶
    el-tree横向纵向滚动条
    JVM学习——1——虚拟机基础概念
    图像分类MMClassification
    linux apt-get安装Jenkins
    Javase --- 多线程复习
    Word控件Spire.Doc 【文本】教程(19) ;如何在 C#、VB.NET 中通过 Word 中的正则表达式查找和替换文本
    高并发技巧-流量聚合和高并发写入处理技巧
  • 原文地址:https://blog.csdn.net/qq_51701007/article/details/126006737