问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

双向循环链表为空的条件

发布网友 发布时间: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
------------------------------
总结:
*/
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请帮忙查iphone4手机的序列号dx3hnchpdp0n DX3J481PDP0N帮忙查一下 是真的吗 我不会查 大神们是翻新的? 苹果4激活日期查询 猫猫一直发情怎么办呢 如何帮助猫咪度过发情期呢? 本科英语都要过4级吗 车子中间的踏板是什么 高考400分能考哪些军事类二本 联通3g双卡双待智能导航手机 ...可以一个卡装移动2g的卡,专打电话,一个卡装联通3g流量卡吗 带头结点的循环双链表L中只有一个元素结点的条件是? QQ除了悄悄话,还有什么好玩的功能 做麻婆豆腐怎样才能做的没有豆腥味 做豆片(干豆腐)如何去掉豆腥味。 做豆腐加上什么就没有豆醒问味了? 人去世银行账户的钱怎么办 QQ加群怎么加??为什么找不到想要加的群呢? 2018年个人所得税改革最新消息? qq加入的群怎么不见了 肝硬化导致的胃出血糖尿病吃什么好 nova 7 SE 5G如何qq发送截图? 因为肝硬化引起的胃出血住院了,胆也不好,出院后 饮食上应该注意些什么... 眼角出无缘无故出现了一块黑斑,,,什么磕碰都没有过,,这是怎么回事... 拿公积金买房了以后,还在还款期内,可以卖掉吗? 眼角黑,怎么造成的?应该怎么办? 胃出血肝硬化吃什么好 肝硬化晚期加上胃出血,一直吃低盐白粥,单调到恶心,也没什么营养,请医生... 肝硬化,胃出血,吃什么好,要忌口些什么?最好具体些! 显示未检测到游戏是什么情况? 我妻子得了阴道炎症 一个带头结点的双向循环链表,现在交换任意两个结点p、q(p、q不一定... 带头结点的双循环链表L为空表的条件是:___。 大学生就业难,我想就业,怎么办? 求全角片假名转换 大学专业选择测试 ...设以带头结点的双向循环链表L=(a1,a2,...,an).试写一个时 大学生求职就业前应做好哪些方面准备 带头结点的双循环链表head为空的判定条件是? 好猪都被烂白菜拱了的什么意思 ...的耳机,卖家以拆封后影响二次销售,拒绝七天无理由退货,这样合理吗... 好白菜都被猪给拱了?凡是猪能吃到的白菜都不是好白菜? 京东不支持无理由退货的售后申请通过了真能退回吗 用和密码能在电脑上登陆微信吗? 微信能用电脑上吗 喝康比特乳清蛋白粉会胖吗? 微信能在电脑上用吗 生命如意宝一号年金保险详情 木工师父们铺木地板加工费多少钱一平方米? 一般铺木地板工钱要多少钱 工行如意宝一号年金保险靠谱吗,银行说是新的理财产品,涉及到保险怎么感 ...