双向循环链表为空的条件
发布网友
发布时间:2022-06-09 21:00
我来回答
共2个回答
热心网友
时间:2024-08-13 10:12
双向循环链表为空的判断条件,这里要分为有头节点和无头节点。
有头节点的双向循环链表,当头节点的前向指针和后驱指针都指向头节点时表示此双向循环链表为空。(head->pro==head && head->next==head)
无头节点的双向循环链表,当head为空时,表明此双向循环无头结点链表为空。(head==NULL)
另外,单向循环链表为空的条件是什么呢?
同样要分为有头节点和无头节点。
有头节点:head->next==head
无头节点:head==NULL
总结就是:有头节点的循环链表在任何时候指针都不会为空,当头节点指向自己时,链表为空。
无头结点的循环链表head等于空就表示链表为空。
热心网友
时间:2024-08-13 10:08
/*
看后面的运行结果
*/
# include <stdio.h>
# include <stdlib.h>
typedef int ElemType;
typedef int Status;
//双向链表存储结构
typedef struct DuLNode
{
ElemType data;
DuLNode * prior,* next;
}DuLNode,* DuLinkList;
//产生空的双向循环链表L,
void InitList(DuLinkList * L)
{
* L = (DuLinkList)malloc(sizeof(DuLNode));
if (* L)
{
(* L)->next = (* L)->prior = * L;
}
else
{
exit(-1);
}
}
//将L重置为空表
void ClearList(DuLinkList L)
{
DuLinkList q,p = L->next;//p指向第一个结点
while (p != L)
{
q = p->next;
free(p);
p = q;
}
L->next = L->prior = L;//头结点的两个指针域指向自己
}
//线性表L已经存在,如果L为空表,则返回1,否则返回0
Status ListEmpty(DuLinkList L)
{
if (L->next==L && L->prior==L)
{
return 1;
}
else
{
return 0;
}
}
//L已经存在,返回L中数据元素的个数
int ListLength(DuLinkList L)
{
int i = 0;
DuLinkList p = L->next;//p指向第1个结点
while (p != L)
{
i++;
p = p->next;
}
return i;
}
//返回双向链表L的第i个元素的地址,如果i = 0,则返回头结点的地址
//如果第i个元素不存在,则返回NULL
DuLinkList GetElemP(DuLinkList L,int i)
{
int j;
DuLinkList p = L;//p指向头结点
if (i<0 || i>ListLength(L))
{
return NULL;
}
for (j=1; j<=i; ++j)
{
p = p->next;
}
return p;
}
//在带头结点的双链循环线性表L中的第i个位置之前插入元素e,
//i的合法值是1=<i<=表长+1
Status ListInsert(DuLinkList L,int i,ElemType e)
{
DuLinkList p,s;
if (i<1 || i>ListLength(L)+1)
{
return 0;
}
p = GetElemP(L,i-1);
if (!p)
{
return 0;
}
s = (DuLinkList)malloc(sizeof(DuLNode));
if (!s)
{
return -1;
}
s->data = e;
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
return 1;
}
//由双链循环线性表L的头结点出发,正序对每个元素调用函数visit
//主要是正序
void ListTraverse(DuLinkList L,void(*visit)(ElemType))
{
DuLinkList p = L->next;//p指向头结点
while (p != L)
{
visit(p->data);
p = p->next;
}
printf("\n");
}
void print(ElemType c)
{
printf("%d ",c);
}
int main(void)
{
DuLinkList L;
int i,n;
Status j;
ElemType e;
InitList(&L);
printf("***向双向循环链表中插入5个元素***\n");
for (i=1; i<=5; ++i)
{
ListInsert(L,i,i);
}
printf("正序输出链表元素:");
ListTraverse(L,print);
printf("链表的元素个数为%d\n",ListLength(L));
printf("链表是否空:%d(1:空 0:非空)\n",ListEmpty(L));
ClearList(L);
printf("清空后,链表空吗:%d(1:空 0:非空)\n",ListEmpty(L));
return 0;
}
/*
在vc++6.0中的输出结果:
------------------------
***向双向循环链表中插入5个元素***
正序输出链表元素:1 2 3 4 5
链表的元素个数为5
链表是否空:0(1:空 0:非空)
清空后,链表空吗:1(1:空 0:非空)
Press any key to continue
------------------------------
总结:
*/