• 【数据结构】双向链表的创建和读取


      双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。双向链表的节点定义如下:

    1 typedef struct node
    2 {
    3     int x;
    4     struct node *prior,*next;
    5 }DLNode;

    双向链表的空间结构如下图所示:

    双向链表的创建如下:

     1 //创建双向链表
     2 DLNode *create_DList()
     3 {
     4     DLNode *p,*h,*l;
     5     int n,i,x;
     6     h = (DLNode *)malloc(sizeof(DLNode));
     7     h->prior = h;    //当空的双向链表就像上图那样前驱和后驱都会指向自己;
     8     h->next = h;
     9     p = h;
    10     printf("请输入需要创建双向链表的长度:");
    11     scanf("%d",&n);
    12     for(i = 0; i < n; i++)
    13     {
    14         printf("请输入第%d个数",i+1);
    15         scanf("%d",&x);
    16         l = (DLNode *)malloc(sizeof(DLNode));
    17         l->x = x;
    18         p->next = l;
    19         l->prior = p;
    20         l->next = h;     //注意,l->next链接的是头节点, 
    21         h->prior = l;    //而头结点的前驱是l。 这样便构成了一个循环的双向链表
    22         p = l;
    23     }
    24     return(h);  //不要忘记返回链表
    25 }

    上面绿颜色的字需要注意;

    读取双向链表的代码如下:

     1 void out_DList(DLNode *l)
     2 {
     3     DLNode *p;
     4     int i;
     5     p = l;
     6     p = p->next;
     7     while(p!=l)  //注意条件发生了变化
     8     {
     9         printf("%5d",p->x);
    10         p = p->next;  //不要忘记让p指向下一个节点;
    11     }
    12 }

    注意:①:由于头节点的值为空,所以p = p->next; ②:循环的条件发生了变化,因为这是一个循环链表,链表的尾部指向头部,所以条件是p!=l; 

    全部代码如下:

    View Code
     1 #include<stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct node
     5 {
     6     int x;
     7     struct node *prior,*next;
     8 }DLNode;
     9 
    10 //函数声明
    11 DLNode *create_DList();
    12 void out_DList(DLNode *l);
    13 
    14 main()
    15 {
    16     DLNode *l;
    17     l = create_DList();
    18     printf("创建成功!");
    19     out_DList(l);
    20 }
    21 
    22 //读取双向链表
    23 void out_DList(DLNode *l)
    24 {
    25     DLNode *p;
    26     int i;
    27     p = l;
    28     p = p->next;
    29     while(p!=l)
    30     {
    31         printf("%5d",p->x);
    32         p = p->next;
    33     }
    34 }
    35 
    36 
    37 //创建双向链表
    38 DLNode *create_DList()
    39 {
    40     DLNode *p,*h,*l;
    41     int n,i,x;
    42     h = (DLNode *)malloc(sizeof(DLNode));
    43     h->prior = h;
    44     h->next = h;
    45     p = h;
    46     printf("请输入需要创建双向链表的长度:");
    47     scanf("%d",&n);
    48     for(i = 0; i < n; i++)
    49     {
    50         printf("请输入第%d个数",i+1);
    51         scanf("%d",&x);
    52         l = (DLNode *)malloc(sizeof(DLNode));
    53         l->x = x;
    54         p->next = l;
    55         l->prior = p;
    56         l->next = h;
    57         h->prior = l;
    58         p = l;
    59     }
    60     return(h);
    61 }

     

  • 相关阅读:
    HRMSYS项目源码分析(二)
    HRMSYS项目源码分析(一)
    SQL类型转换以及自动在前面补0满足10位工号标示法
    android—资源文件(res)的引用
    SQL serve创建与调用存储过程
    .wsdl文件生成.cs文件
    android 文件操作类简易总结
    android EncodingUtils
    FTP创建与操作
    如何调试框架中的app
  • 原文地址:https://www.cnblogs.com/ngnetboy/p/2701774.html
Copyright © 2020-2023  润新知