author:Carlton
book:谭浩强 《C语言程序设计 第五版》
tag:C语言、数据结构
topic:链表
time:2023 年 7 月 1 日
目录
链表简介
一种常见的数据结构,包含:
头指针(head)
结点(囊括 ①用户需要的实际数据 ②下一个结点的地址 ,可用结构体数据类型)
表尾(最后指向空指针NULL,链表结束)
特点是环环相扣,有动态进行存储分配内存的功能,与其有关的应用涉及指针的应用,使用十分灵活、便捷。
例子:用链表搭建学生信息系统
内容
建立一个有两个学生数据(学号和分数)的单向动态链表,实现其建立与输出功能。
重要限定
约定学生的学号不为0,输入0表示链表的建立完毕,该结点不应该链接到链表中。
动态链表的建立
算法的核心为利用两个指向结构体数据类型的指针p1,p2,让p1指向新开辟的结点并输入数据,此时p2指向的是先前的结点,引用其next成员指向p1新开辟的结点,建立链接关系
头文件和链表建立creat函数:
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student) //结构体Student的长度
//声明结构体Student
struct Student
{
long num;
float score;
struct Student *next; //指向结构体Student的指针
};
int n; //定义全局变量n
struct Student* creat(void) //返回结构体Student类型数据(头指针head)
{
struct Student *head;
struct Student *p1,*p2;
p1=p2=(struct Student*)malloc(LEN); //强制转换,长度为结构体Student长度
printf("input student's number and score:\n");
scanf("%ld%f",&p1->num,&p1->score);
head=NULL;
n=0;
while(p1->num) //若学号不为0
{
n+=1;
if(n==1)
{
head=p1; //head指向第一个结点
}
else
{
p2->next=p1; //上一个结点指向此结点
}
p2=p1;
p1=(struct Student*)malloc(LEN);
scanf("%ld%f",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
输出链表
链表输出print函数:
void print(struct Student* head)
{
struct Student *p;
p=head; //指向该链表
printf("\nNow,these %d records are:\n",n);
if(head!=NULL)
{
//注意表尾的数据也需输出
while(p!=NULL)
{
printf("%ld %5.1f\n",p->num,p->score);
p=p->next; //指向下一个结点
}
}
else
{
printf("list NULL!\n");
}
}
反思与总结
编程学习的过程一开始依靠模仿,但自主思考的过程也很必要,体现于:
①初见题目时的独立算法设计
②独立实现代码的过程
③发现问题后去思考解决的过程
问题的解决除了算法的思考与设计外,程序代码的实现也很关键:
①适当用注释附上自己的理解
②发现问题,难题,花时间研究与解决
还有一点至关重要:对问题清楚的认知,联系实际做出合理必要的假设来简化问题。比如本例的约定学号不为0。
欢迎指正与分享,谢谢!