链表的简单应用 例一:学生成绩统计

    题目:定义一个学生信息结构,包括姓名、学号、和总成绩。从键盘上输若干学生信息,学生个数未知,当输入姓名为“#####”时表示输入结束。学生的总成绩为整数,范围是0~1600,不会出现非法输入。分别统计出1200以下,1200~1399,1400~1600各分数段学生人数。学生姓名中只能包含大小写字母与空格字符,不会超过20个;学号不超过20个字符,只包含数字字符。完成以下任务:

1,创建单链表,存储学生信息;

2,设计一个函数,函数名为Createlist(),用于建立链表;

3,函数Addlist(),用于向链表为追加结点;

4,函数Deallist(),统计各分数段学生人数;

5,函数Freelist(),释放链表结点,程序结束。

程序:

首先创建用于链表的结构

typedef struct student{
	char name[30];
	char number[30];
	int score;
	struct student* next;
}Stu;
typedef Stu* stu;

函数Createlist():

//创建链表 
stu Createlist()
{
	stu head=NULL;//创建头指针,并初始化为0
	char ch[7]="#####";//用于判断输入结束
	char ah[30];//存储学生姓名
	do {
		gets(ah);
		if (strcmp(ah,ch)){//判断输入是否为“######”,此处为对字符串的处理,不能简单使用“==”判断,注意:调用strcmp函数需要头文件
			head=Addlist(head,ah);//添加链表结点
		}
	}while (strcmp(ah,ch));
	return head;//返回头指针的地址于主函数
}

关于这个函数,也可以调用头指针的地址,此时函数类型可为void,不需要返回值。

函数Addlist()

//添加列表结点 
stu Addlist(stu head , char* ah)//因为姓名在Greatelist()中用来判别结束,所以直接传入,不需在次函数中再次输入
{
	stu last=head;
	stu p=(stu)malloc(sizeof(Stu));
	strcpy(p->name,ah);//初始化构建的链表
	gets(p->number);
	scanf ("%d",&p->score);
	getchar();//用于吸收回车符
	p->next=NULL;
	if (last){//找到链表此时的尾结点
		while (last->next){
			last=last->next;
		}
		last->next=p;//将新建的p连接在最后一位 
	}
	else{//如果p为第一个结点,只需将头指针指向p
		head=p;
	}
	return head;、//返回头指针	
}

函数Deallist()

void Dealist (stu head,int* count)//传入数组count的地址,用于记录学生人数
{
	stu p;
	for (p=head ; p ;p=p->next){
		if ((p->score)<1200)
			count[0]++;
		if (1200<=(p->score)&&(p->score)<=1399)
			count[1]++;
		if (1400<=(p->score)&&(p->score)<=1600)
			count[2]++;
	}
} 
函数 Freelist():
void Freelist (stu head)
{
	stu p,q;//此处需要新建 q ,因为 p 被清除后将没有 p->next 
	for (p=head;p;p=q){
		q=p->next;
		free(p);
	}
} 

总体程序为:

#include
#include
#include
typedef struct student{
	char name[30];
	char number[30];
	int score;
	struct student* next;
}Stu;
typedef Stu* stu;

stu Createlist();//创建链表

stu Addlist (stu head,char* ah);//向链表尾追加结点

void Dealist (stu head,int* count);//统计各分数段学生

void print (int* count);//打印列表 

void Freelist (stu head);//释放列表 

int main(void)
{
	stu head=NULL;
	int count[3]={0,0,0,};
	head = Createlist();
	Dealist (head,count);
	print (count);
	Freelist (head);
	return 0; 
} 
//创建链表 
stu Createlist()
{
	stu head=NULL;
	char ch[7]="#####";
	char ah[30];
	do {
		gets(ah);
		if (strcmp(ah,ch)){
			head=Addlist(head,ah);
		}
	}while (strcmp(ah,ch));
	return head;
}
//添加列表结点 
stu Addlist(stu head , char* ah)
{
	stu last=head;
	stu p=(stu)malloc(sizeof(Stu));
	strcpy(p->name,ah);
	gets(p->number);
	scanf ("%d",&p->score);
	getchar();
	p->next=NULL;
	if (last){
		while (last->next){
			last=last->next;
		}
		last->next=p;//将p连接在最后一位 
	}
	else{
		head=p;
	}
	return head;	
}
//处理链表数据 
void Dealist (stu head,int* count)
{
	stu p;
	for (p=head ; p ;p=p->next){
		if ((p->score)<1200)
			count[0]++;
		if (1200<=(p->score)&&(p->score)<=1399)
			count[1]++;
		if (1400<=(p->score)&&(p->score)<=1600)
			count[2]++;
	}
} 
//打印链表
void print (int* count)
{
	printf ("The statistics result is:\n");
	printf ("There are %d students below 1200.\n",count[0]);
	printf ("There are %d students between 1200 and 1399.\n",count[1]);
	printf ("There are %d students between 1400 and 1600.\n",count[2]);
} 
//释放链表
void Freelist (stu head)
{
	stu p,q;//此处需要新建 q ,因为 p 被清除后将没有 p->next 
	for (p=head;p;p=q){
		q=p->next;
		free(p);
	}
} 

你可能感兴趣的:(C语言)