发布时间:2025-01-04 15:01
目录
一、背景介绍
二、题目分析
三、代码实现
最近遇到一道面试题,要求使用链表来存储学生的相关信息,并且按照分数从低到高排序。题目细节如下:
写一个程序,用来存储学生的学号和成绩,并按分数从低到高排序。请使用链表实现。
例如用户输入:1,90<回车>、2,100<回车>、3,80<回车>、OK<回车>。输出则是:3=80<换行>、1=90<换行>、2=100<换行>
说明:OK表示录入学生学号和成绩完成,<回车>表示输入时按下了Enter键,<换行>表示输出了换行符
从这道题目的要求可以看出,这道题目主要是考察关于链表和排序相关的知识点。我觉得这道题目的考察点还是不错的,题目不是太难,又考察了应聘者的基本功。题目并没有要求使用双链表还是单链表,排序算法也没有特定要求。所以我下意识就想到用单链表和冒泡排序实现,具体实现代码如下。
#include
#include
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; ipstNext;
for (j=0; jgrade > 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函数从字符串中获取用户输入的数据(想了很久才想到^_^)。如果以上内容有错误,或者小伙伴们有更好的实现方法,欢迎交流指正!