#include <stdio.h>
#include <malloc.h> //用于动态分配函数malloc
#include <stdlib.h> //用于exit()函数, 用来终止整个程序
struct node
{
int data; //用来存放数据
struct node * next; //指向struct node结构体指针
};
struct node * create_list(); //函数声明, 这个函数用来创建链表
void tra_list(struct node *); //函数声明, 这个函数用来输出链表中的值
int main(void)
{
struct node * phead; //定义一个指向struct node结构体的指针用来存放
//create_list的返回值
phead = create_list(); //调用函数
tra_list(phead); //调用输出函数, 参数为头结点
return 0;
}
//*******************************create_list()函数*****************************************************
struct node * create_list()
{
int len; //用来存放链表的个数
int val; //用来存放用户所输入的数据
struct node * phead; //头结点
struct node * pend; //我们定义一个结构体指针pend, 让它始终都指向最后一个节点
struct node * pnew; //用于新开辟的链表
phead = (struct node *)malloc(sizeof(struct node));
if(pnew == NULL)
{
printf("内存空间分配失败, 程序将要退出!\n");
exit(-1); //分配空间失败, 程序异常终止
}
pend = phead; //刚开始时, 头结点与pend都指向同一个结构体, 一个不存放数据的结构体
pend->next = NULL; //防止当输入的链表个数是0个时
printf("请输入你要创建的链表的个数: ");
scanf("%d", &len);
//动态存放所输入的数据
for(int i = 0; i < len; ++i)
{
printf("请输入第%d个链表中的数据: ", i+1);
scanf("%d", &val);
//输入了数据, 那就要用链表来存放
//生成一个链表, 用来存放val的值
pnew = (struct node *)malloc(sizeof(struct node)); //分配空间来存放val
if(pnew == NULL)
{
printf("内存空间分配失败, 程序将要退出!\n");
exit(-1);
}
pnew->data = val; //用来存放输入的数值
//当链表创建还没有结束时, 再执行下面的代码, 用来创建新的链表
pend->next = pnew;
pnew->next = NULL;
pend = pnew; //这三行代码, 能让pend一直都是指向最后一个链表
}
return phead; //返回头结点, 这个结点不存放任何数据, 目的是为了方便控制链表
}
//*************************************void tra_list()函数*****************************************
void tra_list(struct node * phead)
{
struct node * p;
p = phead->next; //使p指向头结点指向的第一个节点
if (p == NULL)
{
printf("链表为空, 没有可打印的数据!\n");
exit(0); //正常终程序
}
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}