使用链表存储学生的学号和成绩,并按分数从低到高排序

目录

一、背景介绍

二、题目分析

三、代码实现


一、背景介绍

最近遇到一道面试题,要求使用链表来存储学生的相关信息,并且按照分数从低到高排序。题目细节如下:

写一个程序,用来存储学生的学号和成绩,并按分数从低到高排序。请使用链表实现。
例如用户输入:1,90<回车>、2,100<回车>、3,80<回车>、OK<回车>。输出则是:3=80<换行>、1=90<换行>、2=100<换行>
说明:OK表示录入学生学号和成绩完成,<回车>表示输入时按下了Enter键,<换行>表示输出了换行符

二、题目分析

从这道题目的要求可以看出,这道题目主要是考察关于链表和排序相关的知识点。我觉得这道题目的考察点还是不错的,题目不是太难,又考察了应聘者的基本功。题目并没有要求使用双链表还是单链表,排序算法也没有特定要求。所以我下意识就想到用单链表和冒泡排序实现,具体实现代码如下。

三、代码实现

#include <stdio.h>
#include <stdlib.h>


typedef struct student {
	int num;
	int grade;
	struct student *pstNext;
} STUDENT_S, *pSTUDENT_S;

/* 创建学生信息,保存在链表中 */
pSTUDENT_S create_list(void)
{
	char tmpBuff[10];
	
	pSTUDENT_S pstHead = (pSTUDENT_S)malloc(sizeof(STUDENT_S));
	if (NULL == pstHead)
	{
		printf("malloc err\n");
		return NULL;
	}
	
	pstHead->pstNext = NULL;
		
	for ( ; ; )
	{
		/* 获取输入的字符串 */
		scanf("%s", tmpBuff);
		
		/* 如果输入OK,则跳出循环 */
		if (tmpBuff[0] == 'O' && tmpBuff[1] == 'K')
			break;
		
		/* 创建新节点 */
		pSTUDENT_S pstNew = (pSTUDENT_S)malloc(sizeof(STUDENT_S));
		if (NULL == pstHead)
		{
			printf("malloc err\n");
			return NULL;
		}
		
		/* 填充新节点数据 */
		sscanf(tmpBuff, "%d,%d", &pstNew->num, &pstNew->grade);
		
		/* 新节点插入链表(头插法) */
		pstNew->pstNext = pstHead->pstNext;
		pstHead->pstNext = pstNew;
	}
	
	return pstHead;
}

/* 学生成绩从低到高排序 */
void sort_list(pSTUDENT_S pstHead)
{
	int len = 0;
	int i, j, temp;
	pSTUDENT_S pstTemp = pstHead->pstNext;
	
	/* 获取链表长度(头节点不计入) */
	while (pstTemp)
	{
		len++;
		pstTemp = pstTemp->pstNext;
	}
	
	/* 分数从低到高排序 */
	for (i=0; i<len-1; i++)
	{
		/* 每排序完一次就要把pstTemp指向第一个节点 */
		pstTemp = pstHead->pstNext;
		
		for (j=0; j<len-1-i; j++)
		{
			if (pstTemp->grade > pstTemp->pstNext->grade)
			{
				/* 交换学号 */
				temp = pstTemp->num;
				pstTemp->num = pstTemp->pstNext->num;
				pstTemp->pstNext->num = temp;
				
				/* 交换成绩 */
				temp = pstTemp->grade;
				pstTemp->grade = pstTemp->pstNext->grade;
				pstTemp->pstNext->grade = temp;
			}
			/* 指向下一个节点 */
			pstTemp = pstTemp->pstNext;
		}	
	}
}

/* 打印输出学生信息 */
void print_list(pSTUDENT_S pstHead)
{
	pSTUDENT_S pstTemp = pstHead->pstNext;
	
	while (pstTemp)
	{
		printf("%d=%d\n", pstTemp->num, pstTemp->grade);
		pstTemp = pstTemp->pstNext;
	}
}

int main(void)
{
	pSTUDENT_S pstHead = NULL;
	
	printf("请输入学生的信息:\n");
	pstHead = create_list();
	sort_list(pstHead);
	printf("分数从低到高输出学生信息如下:\n");
	print_list(pstHead);
	
	return 0;
}

最后代码运行输出结果如下(在Ubuntu终端下编译运行):

以上就是我对这道题目的代码实现。实现过程中难住我的是用户输入的情况有:1,90、OK等内容,也就是说输入的内容是包含数字和字符串的,那么我该如何分辨输入的是数字还是字符串呢?最后,我想到了把用户输入的内容全部当成是字符串来对待,然后再使用sscanf函数从字符串中获取用户输入的数据(想了很久才想到^_^)。如果以上内容有错误,或者小伙伴们有更好的实现方法,欢迎交流指正!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值