「已注销」 2022-05-26 12:09 采纳率: 100%

# 单链表实现学生成绩统计，并将男女分离为两个单链表

• 写回答

#### 4条回答默认 最新

• qfl_sdu 2022-05-26 14:46
关注

C代码运行结果如下：

代码：

``````#define _CRT_SECURE_NO_WARNINGS 1

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

typedef struct _Student
{
int id; //学号
char name[20];//姓名
char sex; //性别
int score; //成绩
struct _Student* next;
}Student;

//初始化链表头
Student* initList(Student* list)
{
list = (Student*)malloc(sizeof(Student));
list->next = 0;
return list;
}

//头插法创建链表
void createList(Student* list)
{
int i, n;
Student* t,*p;
p = list;
printf("请输入需要插入的学生数量：");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
t = (Student*)malloc(sizeof(Student));
t->next = 0;
printf("请输入第%d个学生的学号：", i + 1);
scanf("%d", &t->id);
printf("请输入第%d个学生的姓名：", i + 1);
scanf("%s", t->name);
getchar();//吸收回车符
printf("请输入第%d个学生的性别(F/M)：", i + 1);
scanf("%c", &t->sex);
printf("请输入第%d个学生的成绩：", i + 1);
scanf("%d", &t->score);

//插入头插法插入链表
p->next = t;
p = t;
}

}

//遍历输出学生信息
void showList(Student* list)
{
Student* p;
if (list == 0) return;
p = list->next;
while (p)
{
printf("%8d  %20s  %c  %3d\n", p->id, p->name, p->sex, p->score);
p = p->next;
}
}

//分隔链表
void splitList(Student* plistA, Student* plistB)
{
Student* pre = plistA;
Student* p = pre->next;
Student* pb = plistB;

while (p)
{
if (p->sex == 'M')
{
pre->next = p->next; //把p从listA中删除

//把p插入listB
p->next = 0;
pb->next = p;
pb = p;
//重置p，继续循环
p = pre->next;
}
else
{
pre = p;
p = p->next;
}
}

}

//根据成绩排序
void sortById(Student* L)
{
Student* p, * tail, * q;
tail = NULL;
while ((L->next->next) != tail)
{
p = L;
q = L->next;
while (q->next != tail)
{
if (q->score > q->next->score) //升序排列 /降序
{
p->next = q->next;
q->next = q->next->next;
p->next->next = q;
q = p->next;
}
q = q->next;
p = p->next;
}
tail = q;
}

}

int main()
{
Student* listA = 0;
Student* listB = 0;
listA = initList(listA);
listB = initList(listB);

//输入数据并创建链表
createList(listA);

showList(listA);

//分成两个链表
splitList(listA, listB);
printf("分隔后的女生链表为：\n");
showList(listA);
printf("分隔后的男生链表为：\n");
showList(listB);
//排序

sortById(listA);
sortById(listB);
printf("排序后的女生链表为：\n");
showList(listA);
printf("排序后的男生链表为：\n");
showList(listB);

return 0;
}

``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论 编辑记录

• 系统已结题 6月3日
• 已采纳回答 5月26日
• 创建了问题 5月26日

#### 悬赏问题

• ¥15 如何通过交互分析得出某高危患者对放疗获益更多
• ¥15 相关性分析中，p<0.05, r=0.29,怎么评价相关性呢
• ¥15 docker部署Mongodb后输入命令报错？
• ¥15 将下列流程图转变成python程序代码
• ¥15 我需要全国每个城市的最新小区名字等数据。
• ¥15 开发一个小区生态的小程序
• ¥15 如何解决Excel中dependent dropdown list 的问题
• ¥15 MddBootstrapInitialize2失败
• ¥15 LCD Flicker
• ¥15 esp32在micropython环境下使用ssl/tls连接mqtt服务器出现以下报错Connected on 192.168.154.223发生意外错误: 5无法连接到 MQTT 代理，如何解决？