C++怎么确定一个链表是否是空的?
在程序中,我想用一个链表.但是在使用前,我想知道这个链表是不是空的.我应该怎么处理这个问题??这个能判断链表是不是空的的信息一定要包括在这个表里而.这个起来链表的头一个结...
在程序中,我想用一个链表.但是在使用前,我想知道这个链表是不是空的.
我应该怎么处理这个问题??
这个能判断链表是不是空的的信息一定要包括在这个表里而.
这个起来链表的头一个结点所保存的信息可以不同于链表后面的其他对点所保存的信息.比如说头一个对点保存的信息可以是这个链表的长度\个数等等信息.
链表中保存的信息最好不要是什么INT 型的或是CHAR型单个的信息.最好能是一个结构体.
下面是定义的结构体信息和一个链表的结点形式.
对下面的定义最好不要进行更改.如果更改了一点也行.
最好是能够在了Microsoft Visual C++上运行好了的程序.
如果可以最好还能加上一些注释(关键的部分一定要有).
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;
谢谢您的帮忙!!!!!!!
答案通过可以另外多加分!!!!!!!!!!! 展开
我应该怎么处理这个问题??
这个能判断链表是不是空的的信息一定要包括在这个表里而.
这个起来链表的头一个结点所保存的信息可以不同于链表后面的其他对点所保存的信息.比如说头一个对点保存的信息可以是这个链表的长度\个数等等信息.
链表中保存的信息最好不要是什么INT 型的或是CHAR型单个的信息.最好能是一个结构体.
下面是定义的结构体信息和一个链表的结点形式.
对下面的定义最好不要进行更改.如果更改了一点也行.
最好是能够在了Microsoft Visual C++上运行好了的程序.
如果可以最好还能加上一些注释(关键的部分一定要有).
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;
谢谢您的帮忙!!!!!!!
答案通过可以另外多加分!!!!!!!!!!! 展开
8个回答
展开全部
//解决这种问题很简单,如果链表带头结点的话,那么判空就是 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);
}
如果不带头结点的话 那么就是 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 struct LNode{
char* elem;
struct LNode* next;
}LNode,*LinkList;
bool IsEmpty(LinkList L){
return !L->next?1:0;
}
还需要什么尽管提,我极力帮忙
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以单独定义一个表示链表信息的链表描述符
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;//链表中数值最小的元素,跟据需要可删除
}
这样在所有对链表的操作函数中都应该加上对此操作符的修改和访问等内容
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实指针,比如这里的struct M_node *next; 就是一个标识内存地址的数字。
如果你初始化的时候不给它设一个值,比如最常用的是0,也就是NULL(0就是NULL),用途就是标明这个指针还没有分配内存空间。
一般链表由一个head或tail指针标识。
同样,在没有分配地址的时候,必须把这个指针设为0,否则就无法知道到底有没有东西。
总结:
每次新开一个指针的时候如果不是一声明就分配地址,就一定要记得设成NULL,举手之劳。
如果你初始化的时候不给它设一个值,比如最常用的是0,也就是NULL(0就是NULL),用途就是标明这个指针还没有分配内存空间。
一般链表由一个head或tail指针标识。
同样,在没有分配地址的时候,必须把这个指针设为0,否则就无法知道到底有没有东西。
总结:
每次新开一个指针的时候如果不是一声明就分配地址,就一定要记得设成NULL,举手之劳。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p=head->next; p == NULL
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |