C++怎么确定一个链表是否是空的?
3个回答
展开全部
链表区分带头节点和不带头结点两种。假定链表节点指向下一节点的指针变量名为next。那么区分情况,判断空链表的方法为:
1
带头节点。
对于带头节点的链表,存在有不变的头结点head,这个节点并不保存任何数据,仅提供链表起始的一个标识。对于此类链表,判断为空的条件为head->next==NULL。当head的next值为NULL,这时链表为空。
2
不带头结点。
不带头结点的情况,链表的起始节点是可能变化的,但无论如何变化,必须有一个节点指针类型的变量保存实际上的第一个节点first。
当first为空时,链表即为空。这时判断为空的条件为first==NULL。
1
带头节点。
对于带头节点的链表,存在有不变的头结点head,这个节点并不保存任何数据,仅提供链表起始的一个标识。对于此类链表,判断为空的条件为head->next==NULL。当head的next值为NULL,这时链表为空。
2
不带头结点。
不带头结点的情况,链表的起始节点是可能变化的,但无论如何变化,必须有一个节点指针类型的变量保存实际上的第一个节点first。
当first为空时,链表即为空。这时判断为空的条件为first==NULL。
展开全部
//解决这种问题很简单,如果链表带头结点的话,那么判空就是
p=head->next;
p
==
NULL
如果不带头结点的话
那么就是
head
==
NULL
按照你题目的要求那么就是带有头结点。
下面我给你写个创建链表和打印链表的程序。
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
typedef
struct
M_cargo
{
int
M_num;
char
M_name[20];
int
M_stocks;
char
M_stock_date[7];
char
M_provider[20];
}Mcargo;
typedef
struct
M_node
{
struct
M_node
*next;
Mcargo
Mc;
}*MList;
void
CreateLink(MList
L)
{
MList
p,
q;
M_cargo
Mc;
printf("请输入结点号[-1]退出:");
scanf("%d",
&Mc.M_num);
printf("请输入名字:");
scanf("%s",
Mc.M_name);
printf("请输入股票:");
scanf("%d",
&Mc.M_stocks);
printf("请输入日期:");
scanf("%s",
Mc.M_stock_date);
printf("请输入供应商:");
scanf("%s",
Mc.M_provider);
while(Mc.M_num
!=
-1)
{
//创建新结点并赋值
p
=
new
M_node
;
p->Mc.M_num
=
Mc.M_num;
strcpy(p->Mc.M_name,Mc.M_name);
p->Mc.M_stocks
=
Mc.M_stocks;
strcpy(p->Mc.M_stock_date,
Mc.M_stock_date);
strcpy(p->Mc.M_provider,
Mc.M_provider);
p->next
=
NULL;
//如果只有头结点,直接连在头结点后面
if
(L->next
==
NULL)
L->next
=
p;
else//如果存在其他的结点,则循环连接在q后面,q是指向链表中最后一个结点。
q->next
=
p;
q
=
p;
printf("请输入结点号[-1]退出:");
scanf("%d",
&Mc.M_num);
if
(Mc.M_num
<
0)
break;
printf("请输入名字:");
scanf("%s",
Mc.M_name);
printf("请输入股票:");
scanf("%d",
&Mc.M_stocks);
printf("请输入日期:");
scanf("%s",
Mc.M_stock_date);
printf("请输入供应商:");
scanf("%s",
Mc.M_provider);
}
}
void
PrintLink(MList
L)
{
MList
p
=
L->next;
while(p)
{
printf("%d
",
p->Mc.M_num);
p
=
p->next;
}
printf("\n");
}
void
main()
{
MList
plist
=
(MList)malloc(sizeof(MList));
//这里可以设置plist的头信息,比如plist->mc.num
=
??????
plist->Mc.M_num
=
123;
plist->next
=
NULL;
//////////////////////////////////////////////////////////////////////////
CreateLink(plist);
PrintLink(plist);
}
p=head->next;
p
==
NULL
如果不带头结点的话
那么就是
head
==
NULL
按照你题目的要求那么就是带有头结点。
下面我给你写个创建链表和打印链表的程序。
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
typedef
struct
M_cargo
{
int
M_num;
char
M_name[20];
int
M_stocks;
char
M_stock_date[7];
char
M_provider[20];
}Mcargo;
typedef
struct
M_node
{
struct
M_node
*next;
Mcargo
Mc;
}*MList;
void
CreateLink(MList
L)
{
MList
p,
q;
M_cargo
Mc;
printf("请输入结点号[-1]退出:");
scanf("%d",
&Mc.M_num);
printf("请输入名字:");
scanf("%s",
Mc.M_name);
printf("请输入股票:");
scanf("%d",
&Mc.M_stocks);
printf("请输入日期:");
scanf("%s",
Mc.M_stock_date);
printf("请输入供应商:");
scanf("%s",
Mc.M_provider);
while(Mc.M_num
!=
-1)
{
//创建新结点并赋值
p
=
new
M_node
;
p->Mc.M_num
=
Mc.M_num;
strcpy(p->Mc.M_name,Mc.M_name);
p->Mc.M_stocks
=
Mc.M_stocks;
strcpy(p->Mc.M_stock_date,
Mc.M_stock_date);
strcpy(p->Mc.M_provider,
Mc.M_provider);
p->next
=
NULL;
//如果只有头结点,直接连在头结点后面
if
(L->next
==
NULL)
L->next
=
p;
else//如果存在其他的结点,则循环连接在q后面,q是指向链表中最后一个结点。
q->next
=
p;
q
=
p;
printf("请输入结点号[-1]退出:");
scanf("%d",
&Mc.M_num);
if
(Mc.M_num
<
0)
break;
printf("请输入名字:");
scanf("%s",
Mc.M_name);
printf("请输入股票:");
scanf("%d",
&Mc.M_stocks);
printf("请输入日期:");
scanf("%s",
Mc.M_stock_date);
printf("请输入供应商:");
scanf("%s",
Mc.M_provider);
}
}
void
PrintLink(MList
L)
{
MList
p
=
L->next;
while(p)
{
printf("%d
",
p->Mc.M_num);
p
=
p->next;
}
printf("\n");
}
void
main()
{
MList
plist
=
(MList)malloc(sizeof(MList));
//这里可以设置plist的头信息,比如plist->mc.num
=
??????
plist->Mc.M_num
=
123;
plist->next
=
NULL;
//////////////////////////////////////////////////////////////////////////
CreateLink(plist);
PrintLink(plist);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以单独定义一个表示链表信息的链表描述符
typedef
M_LISTDESC
{MLIST
headNode;
//指向链表的头元素
MLIST
endNode;//指向链表的尾元素,适合双向链表逆序查找
char
listName[20];//链表的名称
int
listCount;
//链表的个数,0表示空链表
int
attrib;//链表的属性,可根据需要自定义,比如允许增加,删除,排序等属性,或者是表示单向链表还是双向链表等
M_node
biggest;//链表中数值最大的元素
M_node
smallist;//链表中数值最小的元素,跟据需要可删除
}
这样在所有对链表的操作函数中都应该加上对此操作符的修改和访问等内容
typedef
M_LISTDESC
{MLIST
headNode;
//指向链表的头元素
MLIST
endNode;//指向链表的尾元素,适合双向链表逆序查找
char
listName[20];//链表的名称
int
listCount;
//链表的个数,0表示空链表
int
attrib;//链表的属性,可根据需要自定义,比如允许增加,删除,排序等属性,或者是表示单向链表还是双向链表等
M_node
biggest;//链表中数值最大的元素
M_node
smallist;//链表中数值最小的元素,跟据需要可删除
}
这样在所有对链表的操作函数中都应该加上对此操作符的修改和访问等内容
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询