• 链表及其基本操作


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

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

    数据对象集:

    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. }

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

    插入:

     删除:

  • 相关阅读:
    执行日志(2)文件结构
    请问一下就是业务概念模型和业务逻辑模型有啥关系
    右值引用&移动构造函数
    [管理与领导-105]:IT人看清职场中的隐性规则 - 2 - 刷存在感也是管理工作的一部分, 是展现自身和团队价值的一种手段
    监听服务器jar运行,及重启脚本
    clickhouse分页使用mybatis-plus
    线性代数中涉及到的matlab命令-第二章:矩阵及其运算
    【XGBoost】第 10 章:XGBoost 模型部署
    计算机毕业设计Java陕菜食谱网站(源码+系统+mysql数据库+lw文档)
    记一次kafkakerberos认证问题
  • 原文地址:https://blog.csdn.net/qq_62795094/article/details/126905507