• 链表及其基本操作


    不要求逻辑上相邻的元素物理上也相邻,通过“链”建立其逻辑关系

    插入,删除元素只需要修改“链”。

    数据对象集:

    n个结点(每个结点包括两部分:该节点存储的数据,指向下一结点的指针)

    操作集:

    插入,删除,尾部插入,打印,返回表长,查找元素(按序号,按元素)

    1. #include
    2. #include
    3. typedef struct LNode* List;
    4. struct LNode{
    5. int data;
    6. List next;
    7. };
    8. //返回表长
    9. int Length(List Ptr){
    10. int len=0;
    11. List temp=Ptr;
    12. while(temp!=NULL){
    13. len++;
    14. temp=temp->next;
    15. }
    16. return len;
    17. }
    18. //查找(按序号)
    19. List Find(int K,List Ptr){
    20. List temp=Ptr;
    21. int i=1;
    22. while(temp!=NULL&&i
    23. temp=temp->next;
    24. i++;
    25. }
    26. if(i==K)return temp;//找到,返回对应指针
    27. else return NULL;//没找到,返回NULL
    28. }
    29. //查找(按元素)
    30. List Find_2(int x,List Ptr){
    31. List temp=Ptr;
    32. while(temp!=NULL&&temp->data!=x){
    33. temp=temp->next;
    34. }
    35. return temp;//找到则返回对应指针,未找到则返回NULL
    36. }
    37. //插入
    38. List Insert(int x,int i,List Ptr){
    39. List pre,now;//pre表示第i-1个结点,now表示要插入的新结点。
    40. //如果要在表头插入
    41. if(i==1){
    42. now=(List)malloc(sizeof(struct LNode));
    43. now->data=x;
    44. now->next=Ptr;
    45. return now;
    46. }
    47. //查找第i-1个结点
    48. pre=Find(i-1,Ptr);
    49. if(pre==NULL){
    50. return NULL;
    51. }//未找到,无法插入
    52. else{
    53. now=(List)malloc(sizeof(struct LNode));
    54. now->data=x;
    55. now->next=pre->next;
    56. pre->next=now;
    57. return Ptr;
    58. }
    59. }
    60. //删除
    61. List Delete(int i,List Ptr){
    62. List pre,now;
    63. //要删除头结点
    64. if(i==1){
    65. now=Ptr;
    66. if(Ptr!=NULL){
    67. Ptr=Ptr->next;
    68. }else{
    69. return NULL;
    70. }
    71. free(now);//释放原头结点空间
    72. return Ptr;//返回新头结点
    73. }
    74. pre=Find(i-1,Ptr);
    75. if(pre==NULL){
    76. return NULL;//查找不到第i-1个结点,返回NULL
    77. } else if(pre->next==NULL){
    78. return NULL;//元素i-1后无结点,即第i个结点不存在,返回NULL
    79. }else{
    80. now=pre->next;
    81. pre->next=now->next;
    82. free(now);
    83. return Ptr;
    84. }
    85. }
    86. void Print(List Ptr){
    87. List temp=Ptr->next;
    88. while(temp!=NULL){
    89. printf("%d ",temp->data);
    90. temp=temp->next;
    91. }
    92. }
    93. //创建一个结点
    94. List Creat_Node(int x){
    95. List n=(List)malloc(sizeof(struct LNode));
    96. n->data=x;
    97. n->next=NULL;
    98. return n;
    99. }
    100. //尾部插入
    101. void insert_tail(List Ptr,int x)
    102. {
    103. List n=Creat_Node(x);
    104. List temp=Ptr;
    105. while(NULL!=temp->next){
    106. temp=temp->next;
    107. }
    108. temp->next=n;
    109. }

    附上逻辑图帮助理解插入和删除:

    插入:

     删除:

  • 相关阅读:
    iTOP-RK3588开发板使用 tensorflow框架
    JSON——数组语法
    k8s1.25版本集群部署(亲测有效)
    SSH客户端常用工具SecureCRT操作
    MoviePy视频编辑
    phpcms V9实战标签代码记录 - list
    Nodejs 应用编译构建提速建议
    GaussDB(DWS)运维利刃:TopSQL工具解析
    【云原生】Kubernetes PDB(Pod Disruption Budget)介绍与简单使用
    will be initialized after [-Werror=reorder]
  • 原文地址:https://blog.csdn.net/qq_62795094/article/details/126905507