双链表是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
#include <stdio.h>
#include <stdlib.h>
//创建双链表中的一个结点的结构体
typedef struct node{
struct node *previous;
int age;
struct node *next;
}Node;
int main(int argc, const char * argv[]) {
//创建头指针
Node *pHead = NULL;
Node *pTail = NULL;
for (int i = 0; i < 5; i++) {
//为结点申请一片内存空间
Node *pTemp = (Node *)malloc(1 * sizeof(Node));
if (pTemp == NULL) {
exit(EXIT_FAILURE);
}
//age
printf("请输入年龄:");
scanf("%d", &pTemp->age);
//next
pTemp->next = NULL;
//previous
if (pHead == NULL) {
//这个是第一个结点,第一个结点的previous指针为空
pTemp->previous = NULL;
//让pTemp指向的结点成为第一个结点
pHead = pTemp;
pTail = pTemp;
} else{
//pTail指向的结点的next指针指向现在创建的pTemp结点
pTail->next = pTemp;
//pTemp的previous指针指向pTail结点
pTemp->previous = pTail;
//让pTail指针指向最后一个结点
pTail = pTemp;
//头结点的previous指针指向最后一个结点
pHead->previous = pTail;
//尾结点的next指针指向头结点
pTail->next = pHead;
}
}
Node *pTemp = pHead;
while (pTemp != NULL) {
printf("%d ", pTemp->age);
pTemp = pTemp->next;
if (pTemp == pHead) {
break;
}
}
printf(" ");
return 0;
}