双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。双向链表的节点定义如下:1 typedef struct node2 {3 int x;4 struct node *prior,*next;5 }DLNode;
双向链表的空间结构如下图所示:
双向链表的创建如下:
[url=][/url]
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 }[url=][/url]
上面绿颜色的字需要注意;
读取双向链表的代码如下:
[url=][/url]
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 }[url=][/url]
注意:①:由于头节点的值为空,所以p = p->next; ②:循环的条件发生了变化,因为这是一个循环链表,链表的尾部指向头部,所以条件是p!=l;
全部代码如下:
[url=][/url]
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 } |