线性表的顺序与链表实现

线性表
1、定义一个结构体类型,包含学号、姓名、成绩等成员。
2、输入每个同学的三门课成绩。
3、定义一个结构体类型,结构体中含链表指针。
4、将数组改为链表。

typedef struct Student
{
int sno; //学号
char sname[10]; //姓名
float scor[3]; //三门成绩
float avg; //平均成绩
};

顺序实现

#include <stdio.h>

typedef struct Student
{
	int sno;
	char sname[10];
	float score[3];
	float avg;
};

void main(){
	int n,i,j,id;
	float max;
	Student STU[30]={0};
	printf("您要录入几位学生的信息:");
	scanf("%d",&n);
	for(i=0;i<n;i++)       //录入
	{
		printf("\n两位数学号:");  //二位数 学号合法性检查
		scanf("%d",&STU[i].sno);
		while(STU[i].sno > 100 ||STU[i].sno < 1)
		{
			printf("输入学号有误,请重新输入!\n");
			scanf("%d",&STU[i].sno);
		}
		printf("\n姓名:");
		scanf("%s",&STU[i].sname);
		printf("\n三门课的成绩(百分制,空格间隔输入):");
		do
		{
			for(j=0;j<3;j++)
			{
				scanf("%f",&STU[i].score[j]);
			}
			for(j=0;j<3;j++)
			{
				if(STU[i].score[j] >= 0 && STU[i].score[j] <= 100) continue;	//	成绩合法性检查
				printf("数据有误,请重新输入!\n");
				break;
			}
			if(j==3) break;		//不使用goto跳出二重循环
		}while(1);
		STU[i].avg=(STU[i].score[0]+STU[i].score[1]+STU[i].score[2])/3;
	}
	printf("录入完毕\n");
	i--;
	max=STU[i].avg;
	id=0;				//找出成绩最高的同学下标
	while(i>=0)
	{
		if(max<STU[i].avg)
		{
			max=STU[i].avg;
			id=i;
		}
		i--;
	}
	printf("平均成绩最高的学生信息记录是:\n");  //输出
	printf("-----------------------------\n");
	printf("学号:%d,姓名:%s",STU[id].sno,STU[id].sname);
	printf(",各科成绩:%.2f,%.2f,%.2f\n",STU[id].score[0],STU[id].score[1],STU[id].score[2]);
	printf("-----------------------------");
	printf("\n");
}

在这里插入图片描述

链式实现

#include <stdio.h>
#include<malloc.h>

typedef struct Student
{
	int sno;
	char sname[10];
	float score[3];
	float avg;
	Student *next;
};

void DestroyList(Student *L)
{
	Student *pre=L,*p=L->next;
	while(pre!=NULL)
	{
		free(pre);
		pre=p;
		p=p->next;
	}
	free(pre);
}
Student *Find(Student *head)
{
	float max;
	Student *id,*p;
	id=NULL;			//找出成绩最高的同学下标
	p=head;
	max=p->avg;
	while(p!=NULL)
	{
		if(max<p->avg)
		{
			max=p->avg;
			id=p;
		}
		p=p->next;
	}
	return id;
}
void ListInsert(Student *head,int n)
{
	Student *p=head,*q=NULL;
	int i=0,j;
	while(i<n)
	{
		printf("\n两位数 学号:");
		q=(Student *)malloc(sizeof(Student)); //开辟空间
		p->next=q;		//尾插法
		p=q;
		scanf("%d",&q->sno);
		while(q->sno > 100 ||q->sno < 1)
		{
			printf("输入学号有误,请重新输入!\n");
			scanf("%d",&q->sno);
		}
		printf("\n姓名:");
		scanf("%s",&q->sname);
		printf("\n三门课的成绩(百分制,空格间隔输入):");
		do
		{
			for(j=0;j<3;j++)
			{
				scanf("%f",&q->score[j]);
			}
			for(j=0;j<3;j++)
			{
				if(q->score[j] >= 0 && q->score[j] <= 100) continue;	//成绩合法性检查
				printf("数据有误,请重新输入!\n");
				break;
			}
			if(j==3) break;		//不使用goto跳出二重循环
		}while(1);
		q->avg=(q->score[0]+q->score[1]+q->score[2])/3;
		i++;
	}
	p->next=NULL;  //尾插法尾结点指针域置空
}
void DispList(Student *id)
{
	printf("平均成绩最高的学生信息记录是:\n");  //输出
	printf("-----------------------------\n");
	printf("学号:%d,姓名:%s",id->sno,id->sname);
	printf(",各科成绩:%.2f,%.2f,%.2f\n",id->score[0],id->score[1],id->score[2]);
	printf("-----------------------------");
	printf("\n");
}

void main(){
	int n;
	Student *head,*id;
	head=(Student *)malloc(sizeof(Student));  //头节点
	head->next=NULL;
	printf("您要录入几位学生的信息:");
	scanf("%d",&n);
	ListInsert(head,n);  //插入学生信息
	printf("录入完毕\n");
	id=Find(head);
	DispList(id); //输出学生信息
	DestroyList(head);
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值