//解决这种问题很简单,如果链表带头结点的话,那么判空就是 p=head->next; p == NULL
如果不带头结点的话 那么就是 head == NULL
按照你题目的要求那么就是带有头结点。
下面我给你写个创建链表和打印链表的程序。
#include
#include
#include
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;//链表中数值最小的元素,跟据需要可删除
}
这样在所有对链表的操作函数中都应该加上对此操作符的修改和访问等内容
其实指针,比如这里的struct M_node *next; 就是一个标识内存地址的数字。
如果你初始化的时候不给它设一个值,比如最常用的是0,也就是NULL(0就是NULL),用途就是标明这个指针还没有分配内存空间。
一般链表由一个head或tail指针标识。
同样,在没有分配地址的时候,必须把这个指针设为0,否则就无法知道到底有没有东西。
总结:
每次新开一个指针的时候如果不是一声明就分配地址,就一定要记得设成NULL,举手之劳。
p=head->next; p == NULL