当前位置:   article > 正文

2. 数据结构——单链表的主要操作(考研专业课学习)

2. 数据结构——单链表的主要操作(考研专业课学习)

1.内容

单链表的初始化、求长、按位查找、按值查找、插入节点、删除节点、头插法和尾插法建立单链表,以及其部分时间复杂度的分析。

2. 主要功能代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. //函数结果状态代码
  4. #define OK 1
  5. #define OVERFLOW -2
  6. #define ERROR 0
  7. #define MAXSIZE 100
  8. typedef int ElemType; //顺序表每个数据元素存储类型
  9. typedef int Status;
  10. typdef struct LNode{
  11. ElemType data;
  12. struct LNode *next;
  13. }LNode *, LinkList;
  14. //1. 单链表的初始化
  15. Status InitList(LinkList &L){
  16. // L=new LNode; //生成节点作为头节点
  17. L=(LNode*)malloc(sizeof(LNode));
  18. L->next=NULL;
  19. //如果不带头节点
  20. // L=NULL;
  21. return OK;
  22. }
  23. //2.求表长(遍历整个链表)
  24. //时间复杂度O(n)
  25. Status Length(LinkList L){
  26. int len=0;
  27. LinkList p=L;
  28. while(p->next!=null){
  29. p=p->next;
  30. len++;
  31. }
  32. return len;
  33. }
  34. //3. 按序号查找结点(查找第i个位置的指针)
  35. //时间复杂度O(n)
  36. LNode* GetElem(LinkList L,int i){
  37. LinkList p=L;
  38. int j=0; //临时记录位置
  39. while(p!=NULL&&j<i){ //查看当前指针是否指向空
  40. p=p->next;
  41. j++;
  42. }
  43. return p; //返回第i个节点的指针或者NULL(NULL可能是i不合法)
  44. }
  45. //4. 按值查找表节点
  46. //时间复杂度O(n)
  47. LNode *LocateElem(LinkList L,Elemtype e){
  48. LinkList p=L->next;
  49. while(p!=NULL&&p->data!=e){ //从第一个节点开始查找
  50. p=p->next;
  51. }
  52. return p;
  53. }
  54. //5.插入节点操作(在第i个位置插入节点e->前插)
  55. //时间复杂度O(n)
  56. Status ListInsert(LinkList &L,int i,ElemType e){
  57. LinkList p=L;
  58. int j=0; //访问的位置
  59. //找到L的第i-1个位置
  60. while(p!=NULL&&j<i-1){
  61. p=p->next;
  62. j++;
  63. }
  64. if(j==NULL)
  65. return ERROR; //超出范围
  66. LNode *s=(LNode*)malloc(sizeof(LNode)); //重新开辟一个节点
  67. s->data=e;
  68. s->next=p->next;
  69. p->next=s;
  70. return OK;
  71. }
  72. //6.删除节点操作(删除第i个位置节点,并将其值赋值给e)
  73. //时间复杂度O(n)
  74. Status ListDelete(LinkList &L,int i,Elemtype &e){
  75. LinkList p=L;
  76. int j=0;
  77. //找到第i-1节点
  78. while(p!=NULL&&j<i-1){
  79. p=p->next;
  80. j++;
  81. }
  82. if(p==NULL||p->next==NULL)
  83. return ERROR;
  84. LNode * q=p->next;
  85. e=q->data;
  86. p->next=q->next;
  87. free(q); //记得释放q的资源
  88. return OK;
  89. }
  90. //头插法建立单链表->链表生成与输入值呈逆序
  91. //每个结点插入时间O(1),长度为n的链表总时间复杂度为O(n)
  92. Status List_HeadInsert(LinkList &L){
  93. LNode * s;
  94. int x;
  95. //初始化链表
  96. L=(LNode*)malloc(sizeof(LNode));
  97. L->next=NULL;
  98. scanf("%d",&x);
  99. while(x!=9999){ //9999为结束标志
  100. s=(LNode*)malloc(sizeof(LNode));
  101. s->data=x;
  102. s->next=L->next;
  103. L->next=s;
  104. scanf("%d",&x);
  105. }
  106. return OK;
  107. }
  108. //尾插法建立单链表->顺序
  109. //每个结点插入时间O(1),长度为n的链表总时间复杂度为O(n)
  110. Status List_TailInsert(LinkList &L){
  111. LNode *s;
  112. int x;
  113. L=(LNode*)malloc(sizeof(LNode));
  114. L->next=NULL;
  115. LNode *r=L; //r指针用于指向链表的最后一个元素
  116. scanf("%d",&x);
  117. while(x!=9999){
  118. s=(LNode*)malloc(sizeof(LNode));
  119. s->data=x;
  120. s->next=NULL; //防止指针乱指
  121. r->next=s;
  122. r=s; //r指向新的表尾指针
  123. scanf("%d",&x);
  124. }
  125. return OK;
  126. }

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

闽ICP备14008679号