【数据结构】双向链表的创建和读取
双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。双向链表的节点定义如下:
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 }