欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-16 10:48:04
...

    题目:定义一个学生信息结构,包括姓名、学号、和总成绩。从键盘上输若干学生信息,学生个数未知,当输入姓名为“#####”时表示输入结束。学生的总成绩为整数,范围是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函数需要头文件<string.h>
			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<stdio.h>
#include<stdlib.h>
#include<string.h>
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语言应用