上期讲解了静态链表的实例,但是静态链表建立的节点数量有限,毕竟是手工建立,难免也会出问题, 所以这期讲讲怎么使用动态的方式建立链表,也就是 动态链表 !
关键词:动态链表;
01建立链表
1.1、建立动态链表
建立链表所需要的头文件,代母如下:
#include
#include
#include
需要使用宏定义定义相关变量,代码如下:
#define LEN sizeof(struct Student)//宏定义节点长度得命名
#define TYPE struct Student //宏定义结构体变量命名
需创建一个结构体,代码如下:
struct Student //定义一个学生类型结构体,包括学号,分数
{
long num;
float score;
struct Student* next; //next是指针变量,指向结构体变量
};//指向结构体对象得指针变量既可以指向结构体变量,也可以指向结构体数组中得元素
建立链表函数,代码如下:
TYPE* Creat(void) //定义函数,此函数返回一个指向链表头的指针
{
TYPE* head; //定义头指针
TYPE* p1,*p2; //定义两个 指针变量用来相互保存
number = 0; //开始时,结点清零
p1 = p2 = (TYPE*)malloc(LEN); //创建存储空间
printf("请按格式输入学生学号,分数\\n"); //输出提示信息
printf("例如101,1 并以0,0结束\\n");
scanf("%ld,%f", &p1->num, &p1->score);//按格式输入第一个结点的信息
head = NULL; //第一个结点头指针赋空值
while (p1->num!=0) //循环直到输入学生学号为0,就结束
{
number++; //结点自增
if (number == 1) //如果只有一个结点,那么头指针指向第一个输入的结点
head = p1;
else
p2->next = p1;//如果大于1个,那么要用next保存前一个结点的信息
p2 = p1; //保存前一个结点信息
p1 = (TYPE*)malloc(LEN);//开辟新的结点
scanf("%ld,%f", &p1->num, &p1->score);//输入下一个结点信息
}
p2->next = NULL; //循环结束,将指向信息赋空值
return (head); //返回首地址
}
需编写主函数,代码如下:
int main()
{
TYPE* pt; //定义一个结构体指针变量
pt = Creat(); //函数返回链表第一个结点的地址
printf("\\nnum:%ld\\nscore:%5.lf\\n", pt->num,pt->score);
//输出第一个结点的成员值
return 0;
}
运行程序,最终结果显示如图1-1所示:
图1-1 运行结果界面
图1-1中首先按给定的提示方法,输入信息,并以0,0结束输入,最终通过打印的方式显示输出第一个节点的信息!
文中最后结果显示的是第一个结点的内容,作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等!
02建立链表
2.1、链表的输出
链表的的输出可以使用循环打印就可以输出整个链表的数据,输出函数的代码如下:
void print(TYPE * head)
{
TYPE * p; //定义指针
printf("\\nNOW These %d records are:\\n");//输出显示信息
p = head; //使p指向第一个结点
if(head!=NULL) //输出第一个结点后的信息
do {
printf("%ld %5.1f\\n",p->num,p->score);
p = p->next; //指向下个结点
} while (p != NULL);
}
主函数的代码如下:
int main()
{
TYPE * pt; //定义一个结构体指针变量
pt = Creat(); //函数返回链表第一个结点的地址
print(pt); //输出调用
return 0;
}
链表的修改、删除、插入有点理解费劲,所以留给下期讲解,要弄懂链表还是推荐边写边看,下期讲解链表的修改、删除、插入!
评论
查看更多