• 【数据结构】单链表基本操作的实现


    【单链表的头插和尾插】//无头结点

    1. #include
    2. #include
    3. typedef struct LNode
    4. {
    5. int date;
    6. struct LNode *next;
    7. }LNode,*LinkList;
    8. LinkList great_LinkList(LinkList L)//头部插入
    9. {
    10. LinkList s;
    11. int x,j=1;
    12. scanf("%d",&x);
    13. while(x!=0)
    14. {
    15. s=(LNode*)malloc(sizeof(LNode));
    16. s->date=x;
    17. s->next=L;
    18. L=s;
    19. scanf("%d",&x);
    20. if(s->next)
    21. {
    22. s=s->next;
    23. j++;
    24. }
    25. }
    26. printf("表长:");
    27. printf("%d\n",j);
    28. return L;
    29. }
    30. LinkList great_LinkList2(LinkList L)//尾部插入
    31. {
    32. LinkList s,r=NULL;
    33. int x;
    34. scanf("%d",&x);
    35. while(x!=0)
    36. {
    37. s=(LNode*)malloc(sizeof(LNode));
    38. s->date=x;
    39. if(L==NULL)
    40. L=s;
    41. else
    42. r->next=s;
    43. r=s;
    44. scanf("%d",&x);
    45. }
    46. r->next=NULL;//必须要有,不然会死循环
    47. return L;
    48. }
    49. LinkList printLink(LinkList L)//链表输出
    50. {
    51. if(L==NULL)
    52. printf("表空\n");
    53. while(L!=NULL)
    54. {
    55. printf("%4d",L->date);
    56. L=L->next;
    57. }
    58. printf("\n");
    59. return L;
    60. }
    61. int main()
    62. {
    63. LinkList a=NULL,b=NULL;
    64. printf("你要输入的数据:\n");
    65. a=great_LinkList(a);
    66. printf("头插法:");
    67. printLink(a);
    68. printf("你要输入的数据:\n");
    69. b=great_LinkList2(b);
    70. printf("尾插法:");
    71. printLink(b);
    72. return 0;
    73. }

    【带头结点的尾插法】

    1. #include
    2. #include
    3. typedef struct LNode
    4. {
    5. int date;
    6. struct LNode* next;
    7. }LNode,*LinkList;
    8. LinkList Great_LinkList3()//带头结点的尾插法
    9. {
    10. LinkList L=NULL;//头结点
    11. LNode *R=NULL;//尾结点
    12. int x;
    13. L=(LNode*)malloc(sizeof(LNode));//给头结点申请空间
    14. L->next=NULL;//置空表
    15. R=L;
    16. scanf("%d",&x);
    17. while(x!=0)
    18. {
    19. R->next=(LNode*)malloc(sizeof(LNode));//为插入元素申请空间
    20. R->next->date=x;
    21. R=R->next;
    22. scanf("%d",&x);
    23. }
    24. R->next=NULL;
    25. return L;
    26. }
    27. void printLink(LinkList L)//有头结点的输出
    28. {
    29. if(L->next==NULL)
    30. printf("表空!");
    31. else
    32. while(L->next!=NULL)
    33. {
    34. printf("%4d",L->next->date);
    35. L=L->next;
    36. }
    37. printf("\n");
    38. }
    39. int main()
    40. {
    41. LinkList a=NULL;
    42. printf("请输入数据:");
    43. a=Great_LinkList3();
    44. printLink(a);
    45. return 0;
    46. }

    注:加入头结点的目的是操作方便,使得第一个结点的问题不再存在,并使“空表”与“非空表”的处理一致,以下代码段没说有无头结点的都是带头结点的

    【带头结点表长】

    int length_LinkList(LinkList L)
    {
        LinkList p=L;
        int j=0;
        while(p->next)
        {
            p=p->next;
            j++;
        }
        return j;
    }

    【不带头结点表长】

    int Length_LinkList2(LinkList L)
    {
        LinkList p=L;
        int j;
        if(p==NULL)
        return 0;
        j=1;
        while(p->next)
        {
            p=p->next;
            j++;
        }
        return j;
    }

    【按序号查找元素值】

    int Locate_LinkList(LinkList L,int i)
    {
        LinkList p=L;
        int j=0,x;
        while(p->next!=NULL&&j     {
            p=p->next;
            j++;
        }
        if(j==i)
        return p->date;

    【按序号查找结点的位置】

    LinkList Get_LinkList(LinkList L,int i)
    {
        LinkList p=L;
        int j=0;
        while(p->next!=NULL&&j     {
            p=p->next;
            j++;
        }
        if(j==i) return p;
        else return NULL;

    【后插结点】 

    将s结点插入p结点的后面

    (1)s->next=p->next;

    (2)p->next=s;

    【前插结点】 

    将s结点插到p的前面,与后插不同的是,先要找到 p的前驱q,然后在q之后插入,相当于q的后插

    (1)while(q->next!=p)

                    q=q->next;

    (2)s->next=q->next;

    (3)q->next=s;

     注:后插结点与前插结点的顺序不能颠倒 ,前插必须先(1)后(2),后插同理

    【单链表的插入算法】

    void insert_LinkList(LinkList L)//在第i个位置插入x
    {
        LinkList p,s;
        int i,x;
        printf("请输入要插入的位置:");
        scanf("%d",&i); 
        p=Get_LinkList(L,i-1);
        printf("请输入要插入的数据:"); 
        scanf("%d",&x);
        if(p==NULL)
        {
            printf("参数i错误");
        }
        else
        {
            printf("11");
            s=(LinkList)malloc(sizeof(LNode));
            s->date=x;
            s->next=p->next;
            p->next=s;
        }
    }

     【删除结点】

    实现对结点*p的删除,找到*p的前继结点*q

    q->next=p->next;

    free(p);

    【单链表的删除算法】 

    void Del_LinkList(LinkList L)//删除算法 
    {
        LinkList p,s;
        int i;
        printf("请输入要删除的第i个结点:");
        scanf("%d",&i); 
        p=Get_LinkList(L,i-1);
        if(p==NULL)
        {
            printf("第i-1个结点不存在:"); 
        }
        else if(p->next==NULL)
        {
            printf("第i个结点不存在:"); 
        }
        else
        {
            s=p->next;
            p->next=s->next;
            free(s);
        }

    例:实现对单链表的插入、求表长、按序号查找值、按序号查找结点的位置 、在链表中随机插入以及删除链表中的任意值

    1. #include
    2. #include
    3. typedef struct LNode
    4. {
    5. int date;
    6. struct LNode* next;
    7. }LNode,*LinkList;
    8. LinkList Great_LinkList3()//带头结点的尾插法
    9. {
    10. LinkList L=NULL;//头结点
    11. LNode *R=NULL;//尾结点
    12. int x;
    13. L=(LNode*)malloc(sizeof(LNode));//给头结点申请空间
    14. L->next=NULL;//置空表
    15. R=L;
    16. scanf("%d",&x);
    17. while(x!=0)
    18. {
    19. R->next=(LNode*)malloc(sizeof(LNode));//为插入元素申请空间
    20. R->next->date=x;
    21. R=R->next;
    22. scanf("%d",&x);
    23. }
    24. R->next=NULL;
    25. return L;
    26. }
    27. void printLink(LinkList L)//有头结点的输出
    28. {
    29. if(L->next==NULL)
    30. printf("表空!");
    31. else
    32. while(L->next!=NULL)
    33. {
    34. printf("%4d",L->next->date);
    35. L=L->next;
    36. }
    37. printf("\n");
    38. }
    39. int length_LinkList(LinkList L)//表长
    40. {
    41. LinkList p=L;
    42. int j=0;
    43. while(p->next)
    44. {
    45. p=p->next;
    46. j++;
    47. }
    48. return j;
    49. }
    50. int Locate_LinkList(LinkList L,int i)//按序号查找值
    51. {
    52. LinkList p=L;
    53. int j=0,x;
    54. while(p->next!=NULL&&j
    55. {
    56. p=p->next;
    57. j++;
    58. }
    59. if(j==i)
    60. return p->date;
    61. }
    62. LinkList Get_LinkList(LinkList L,int i)//按序号查找结点位置
    63. {
    64. LinkList p=L;
    65. int j=0;
    66. while(p->next!=NULL&&j
    67. {
    68. p=p->next;
    69. j++;
    70. }
    71. if(j==i) return p;
    72. else return NULL;
    73. }
    74. void insert_LinkList(LinkList L)//在第i个位置插入x
    75. {
    76. LinkList p,s;
    77. int i,x;
    78. printf("请输入要插入的位置:");
    79. scanf("%d",&i);
    80. p=Get_LinkList(L,i-1);
    81. printf("请输入要插入的数据:");
    82. scanf("%d",&x);
    83. if(p==NULL)
    84. {
    85. printf("参数i错误");
    86. }
    87. else
    88. {
    89. printf("11");
    90. s=(LinkList)malloc(sizeof(LNode));
    91. s->date=x;
    92. s->next=p->next;
    93. p->next=s;
    94. }
    95. }
    96. void Del_LinkList(LinkList L)//删除算法
    97. {
    98. LinkList p,s;
    99. int i;
    100. printf("请输入要删除的第i个结点:");
    101. scanf("%d",&i);
    102. p=Get_LinkList(L,i-1);
    103. if(p==NULL)
    104. {
    105. printf("第i-1个结点不存在:");
    106. }
    107. else if(p->next==NULL)
    108. {
    109. printf("第i个结点不存在:");
    110. }
    111. else
    112. {
    113. s=p->next;
    114. p->next=s->next;
    115. free(s);
    116. }
    117. }
    118. int main()
    119. {
    120. LinkList a=NULL;
    121. int b=0,c=0;
    122. printf("请输入数据:");
    123. a=Great_LinkList3();
    124. printLink(a);
    125. b=length_LinkList(a);
    126. printf("表长:%d\n",b);
    127. printf("请输入要查找的元素序号:\n");
    128. scanf("%d",&c);
    129. printf("%d\n",Locate_LinkList(a,c));
    130. insert_LinkList(a);
    131. printf("插入后的链表:");
    132. printLink(a);
    133. Del_LinkList(a);
    134. printf("删除后的链表:");
    135. printLink(a);
    136. return 0;
    137. }

  • 相关阅读:
    武汉轻工大学计算机考研资料汇总
    微服务框架 SpringCloud微服务架构 12 DockerCompose 12.2 部署微服务集群
    认识非托管动态链接库
    MongoDB聚合运算符:$cosh
    从理论走向实战!阿里高工熬夜整理出的 Spring 源码速成笔记太香了
    自己动手写乞丐版线程池
    B+树索引(11)之索引挑选(上)
    Ubuntu搭建DNS服务器-2
    Java内存泄露与内存溢出详解(InsCode AI 创作助手)
    初入算法(2)—— 进入算法世界
  • 原文地址:https://blog.csdn.net/weixin_74154742/article/details/134419524