• 双向链表的创建和遍历


    双向循环链表

    单链表L中,查找ai的后继 Next(L, ai),耗时仅为0(1),因为取ai之后继指针即可。但查找ai的直接前驱 Prior(L, ai),则需从链表的头指针开始,找到结点ai前一结点即是。故运算Prior(L,ai)依赖表长n,耗时为0(n)。

    单链表的缺点

    若链表中有一指针值被破坏,则整个链表脱节。这是单链表的不足,为此,引入双向链表

    双向循环链表结点描述

    先定义双向链表中的结点: 其中,data和next同单链表,增加一指针域prior,其指向本结点的直接前驱。

    结点描述:

    1. typedef int data_t;
    2. typedef struct node{
    3. data_t data;
    4. struct node *prior;
    5. struct node *next;
    6. }dlistnode;

    双向链表的创建

    1. dlistnode* dlist_create(){
    2. dlistnode *H,*r,*p;
    3. int n;
    4. if((H=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    5. {
    6. puts("malloc failed");
    7. return NULL;
    8. }
    9. H->prior = H;
    10. H->next = H;
    11. r = H;
    12. while(1){
    13. printf("please input(-1 exit):");
    14. scanf("%d",&n);
    15. if(n==-1)
    16. break;
    17. if((p=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    18. {
    19. printf("malloc failed\n");
    20. return NULL;
    21. }
    22. p->data=n;
    23. p->prior=r;
    24. p->next=r->next;
    25. r->next=p;
    26. H->prior=p;
    27. r=p;
    28. }
    29. return H;
    30. }

    双向链表的遍历

    1. void dlist_show(dlistnode* H)
    2. {
    3. dlistnode *p;
    4. p=H->next;
    5. while(p!=H)
    6. {
    7. printf("%d ",p->data);
    8. p=p->next;
    9. }
    10. putchar(10);//换行
    11. }

    双向链表的创建和遍历完整代码

    1. #include
    2. #include
    3. typedef int data_t;
    4. typedef struct node{
    5. data_t data;
    6. struct node *prior;
    7. struct node *next;
    8. }dlistnode;
    9. dlistnode* dlist_create(){
    10. dlistnode *H,*r,*p;
    11. int n;
    12. if((H=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    13. {
    14. puts("malloc failed");
    15. return NULL;
    16. }
    17. H->prior = H;
    18. H->next = H;
    19. r = H;
    20. while(1){
    21. printf("please input(-1 exit):");
    22. scanf("%d",&n);
    23. if(n==-1)
    24. break;
    25. if((p=(dlistnode *)malloc(sizeof(dlistnode)))==NULL)
    26. {
    27. printf("malloc failed\n");
    28. return NULL;
    29. }
    30. p->data=n;
    31. p->prior=r;
    32. p->next=r->next;
    33. r->next=p;
    34. H->prior=p;
    35. r=p;
    36. }
    37. return H;
    38. }
    39. void dlist_show(dlistnode* H)
    40. {
    41. dlistnode *p;
    42. p=H->next;
    43. while(p!=H)
    44. {
    45. printf("%d ",p->data);
    46. p=p->next;
    47. }
    48. //putchar输出字符,因为10是整数,所以系统只能将其转换为对应的ASCII字符。
    49. //ASCII中10对应的是,line feed(换行)
    50. putchar(10);
    51. }
    52. int main(int argc, const char *argv[])
    53. {
    54. dlistnode *H;
    55. H=dlist_create();
    56. dlist_show(H);
    57. return 0;
    58. }

  • 相关阅读:
    【C语言】文件输入输出操作
    组态软件和人机界面与plc之间Profinet无线通讯
    SpringBoot配置达梦数据库依赖(达梦8)
    Elasticsearch6.8.12启动常见问题
    RFID技术:钢条加工现场的智能化管理利器
    基于springboot实现数据资产管理系统 项目【项目源码+论文说明】
    java计算机毕业设计企业客户管理系统源码+mysql数据库+系统+lw文档+部署
    Spring MVC
    6000字Locust入门详解
    java 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/132941937