1.双向循环链表和双链表类似,只需把链表的头尾结点连通起来即可。(本文讨论的链表都是带头结点的)
2.空的双向循环链表其头结点的指针域都指向头结点自己。
非空的双向循环链表其头结点的直接前驱的指针域指向链表尾结点,其尾结点的直接后继的指针域指向链表的头结点,这样就可以把链表形成一个’‘环’。
3.双向循环链表的具体代码实现
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct LinkNode{
ElemType data;
struct LinkNode *pNext;
struct LinkNode *pPrior;
}LinkNode;
LinkNode *pHead = NULL; //双向循环链表的头指针
LinkNode *pEnd = NULL; //双向循环链表的尾指针
//创建双向循环链表节点
void CreateNode(LinkNode *pNode)
{
if(NULL != pNode)
{
printf("请输入结点数据:");
scanf("%d", &pNode->data);
}
pNode->pNext = NULL;
pNode->pPrior = NULL;
}
//创建双向循环链表(带头节点),可以理解为创建一个空表,创建的链表中只包含一个头结点
void CreateLinkList()
{
LinkNode *pNew = malloc(sizeof(LinkNode));
pNew->data = NULL; //头结点不放元素
pNew->pNext = pNew;
pNew->pPrior = pNew;
pHead = pNew;//将头、尾指针都指向头结点
pEnd = pNew;
printf("创建链表成功!\n");
}
//添加结点,结点后面依次按顺序添加,注意与后面的插入结点区分开
void AddNode()
{
LinkNode *pTemp = pEnd;
LinkNode *pNew = malloc(sizeof(LinkNode));
CreateNode(pNew);
pEnd->pNext = pNew;
pEnd = pNew;
pEnd->pPrior = pTemp;
pEnd->pNext