当前位置:   article > 正文

数据结构双向循环链表Linux Ubuntu 下的C语言实现_ikunc语言代码

ikunc语言代码

       大家好,我是练习编程时长两年半的昆工第一ikun,昨天咋们聊了单向循环链表,今天咋们来实现双向奔赴,也就是双向循环链表,话不多说,直接上代码;

一、数据结构中的结构

1.逻辑结构

① 集合结构:一个范围内,每一个个体之间没有任何关联

② 线性结构:一对一的关系,有唯一前驱和后继

第一个元素没有前驱,最后一个元素没有后继,中间元素既有唯一前驱,也有唯一后继

③ 树形结构:一对多的关系

第一个元素没有前驱,最后一个元素没有后继,中间元素有唯一前驱,但是可以有多个后继

④ 图形结构:多对多的关系,各个元素之间可能都有关联

2.存储结构

①顺序存储

特点:元素和元素之间依次存放

实现方法:数组、malloc

优点:数据查找和修改比较方便

缺点:浪费资源空间

插入数据、删除数据效率低

②链式存储

特点:在内存中的每一个元素之间用地址进行关联

优点:节省资源空间,插入数据、删除数据效率高

缺点:数据查找和修改效率低,需要遍历全部数据

③ 索引存储

特点:每一个元素都会创建一张索引表,资源开销比较大,

优点:数据查找效率高

④Hash存储(散列存储)

3.算法

(1)算法概念

有穷命令(指令、语句)的有序集合

(2)算法的特性

有穷性:算法执行步骤必须是有限的

可行性:在有效时间得到确定结果

确定性:算法中不能出现歧义

输入:算法有零个或多个外部输入

输出:算法有一个或多个输出

(3)语句频度:

一个语句在算法中循环执行的次数

(4)时间复杂度

算法的时间复杂度定义为算法中可执行语句的频度之和

事后统计法

事前预估法---大O计数法

大O计数法的表示方法:

T(n) = O(f(n))

f(n)是将时间复杂度的表达式中,将规模趋近于无穷或者一个新的表达式

T(n) = 3n^3+2n^2+4n+4

T(n) = O(n^3)

二、dlinklist.h头文件代码

  1. #ifndef _DLINKLIST_
  2. #define _DLINKLIST_
  3. typedef int data_t;
  4. typedef struct dlinklist
  5. {
  6. data_t data;
  7. struct dlinklist *next;
  8. struct dlinklist *prior;
  9. }DLinkList;
  10. DLinkList *Create_DLinklist(); //创建头节点
  11. int DLinklist_Size(DLinkList *head); //链表长度
  12. void DLinklist_Insert(DLinkList *head, data_t data); //头插法插入数据
  13. void DLinklist_Delete_Pos(DLinkList *head, int pos); //按位置删除数据
  14. void DLinklist_Insert_Pos(DLinkList *head, int pos, data_t data); //任意位置插入数据
  15. void DLinkList_Show(DLinkList *head); //打印表
  16. #endif

三、dlinklist.c函数功能实现代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "dlinklist.h"
  4. DLinkList *Create_DLinklist()
  5. {
  6. DLinkList *head = (DLinkList *)malloc(sizeof(DLinkList));
  7. if(head == NULL){
  8. printf("创建失败!\n");
  9. return NULL;
  10. }
  11. head->data = -1;
  12. head->next = head;
  13. head->prior = head;
  14. return head;
  15. }
  16. //****************判断链表长度*****************
  17. int DLinklist_Size(DLinkList *head)
  18. {
  19. DLinkList *p = head;
  20. int len = 0;
  21. while(p->next != head){
  22. p = p->next;
  23. len++;
  24. }
  25. return len;
  26. }
  27. //**************头插法插入数据*****************
  28. void DLinklist_Insert(DLinkList *head, data_t data)
  29. {
  30. DLinkList *new = (DLinkList *)malloc(sizeof(DLinkList));
  31. if(head == NULL){
  32. printf("创建失败!\n");
  33. return;
  34. }
  35. new->data = data;
  36. new->next = NULL;
  37. new->prior = NULL;
  38. head->next->prior =new;
  39. new->next = head->next;
  40. head->next = new;
  41. new->prior = head;
  42. return;
  43. }
  44. //******************任意位置插入数据******************
  45. void DLinklist_Insert_Pos(DLinkList *head, int pos, data_t data)
  46. {
  47. if(pos < 0 || pos > DLinklist_Size(head)-1){ //判断输入的位置是否合法
  48. printf("该位置不存在!!\n");
  49. return;
  50. }
  51. DLinkList *new = (DLinkList *)malloc(sizeof(DLinkList));
  52. if(head == NULL){
  53. printf("创建失败!\n");
  54. return;
  55. }
  56. new->data = data;
  57. new->next = NULL;
  58. new->prior = NULL;
  59. DLinkList *p = head;
  60. while(pos--){
  61. p = p->next;
  62. }
  63. p->next->prior = new;
  64. new->next = p->next;
  65. p->next = new;
  66. new->prior = p;
  67. return;
  68. }
  69. //*******************按位置删除数据*******************
  70. void DLinklist_Delete_Pos(DLinkList *head, int pos)
  71. {
  72. if(pos < 0 || pos > DLinklist_Size(head)-1){ //判断输入的位置是否合法
  73. printf("该位置不存在!!\n");
  74. return;
  75. }
  76. DLinkList *p = head->next;
  77. while(pos--){
  78. p = p->next;
  79. }
  80. p->prior->next = p->next;
  81. p->next->prior = p->prior;
  82. free(p);
  83. p = NULL;
  84. return;
  85. }
  86. //******************打印表*******************
  87. void DLinkList_Show(DLinkList *head)
  88. {
  89. DLinkList *p = head->next;
  90. while(p != head){
  91. printf("%d ", p->data);
  92. p = p->next;
  93. }
  94. printf("\n");
  95. }

四、main.c主函数代码

  1. #include <stdio.h>
  2. #include "dlinklist.h"
  3. int main(int argc, char *argv[])
  4. {
  5. DLinkList * head = Create_DLinklist(); //创建头节点
  6. int n = 10;
  7. while(n--){
  8. DLinklist_Insert(head, n); //头插法插入数据
  9. }
  10. DLinkList_Show(head);
  11. DLinklist_Delete_Pos(head, 3);
  12. DLinkList_Show(head);
  13. DLinklist_Insert_Pos(head, 5, 999);
  14. DLinkList_Show(head);
  15. int len = DLinklist_Size(head);
  16. printf("%d\n", len);
  17. return 0;
  18. }

        好了,今天的分享就到这啦,坤坤今晚出去耍了,所以大家凑活看,明天再更新,我是练习编程时长两年半的昆工第一ikun,咋们明天见。

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

闽ICP备14008679号