C语言实现动态链表的建立

嵌入式技术

1367人已加入

描述

上期讲解了静态链表的实例,但是静态链表建立的节点数量有限,毕竟是手工建立,难免也会出问题, 所以这期讲讲怎么使用动态的方式建立链表,也就是 动态链表 !

关键词:动态链表;

01建立链表

1.1、建立动态链表

建立链表所需要的头文件,代母如下:

#include//标准输入输出头文件

#include//包含了C、C++语言的最常用的系统函数

#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;

}

链表的修改、删除、插入有点理解费劲,所以留给下期讲解,要弄懂链表还是推荐边写边看,下期讲解链表的修改、删除、插入!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分