• 双向链表的创建和遍历


    双向循环链表

    单链表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. }

  • 相关阅读:
    最小生成树专题1 最小生成树-Prim算法
    IPETRONIK数采与第三方软件集成
    用Git上传项目gitLab(简单笔记)
    5--OpenCV:图形绘制与文字输出
    论文投稿指南——收藏|SCI写作投稿发表全流程
    Lab_1:练习1——理解通过make生成执行文件的过程
    哪个运动耳机比较好用、运动耳机推荐性价比
    【PHP】如何关闭buffer实时输出内容到前端
    vue快速学习03、ant-design
    [Hive] 常见函数
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/132941937