编程建立一个学生结构体,包含学号、姓名、性别和成绩。建立一个单链表,从键盘输入5个学生的信息,当输入的学号为0表示输入结束,用单链表组织这些学生的信息。实现单链表中的各结点按照成绩有序排序并输出。
时间: 2023-05-31 08:20:20 浏览: 126
### 回答1:
这段代码建立了一个学生结构体,包括学号、姓名、性别和成绩。建立了一个单链表,从键盘输入5个学生的信息,当输入的学号为0表示输入结束,用单链表组织这些学生的信息。实现单链表中的各节点按照成绩有序排列并输出。
### 回答2:
本题需要用到的数据结构是结构体、链表和排序算法。首先,我们需要定义学生结构体,包括学号、姓名、性别和成绩。
```c
typedef struct student {
int num; // 学号
char name[20]; // 姓名
char sex; // 性别
int score; // 成绩
struct student *next;
}Student;
```
其中,next指针用于指向下一个学生结构体,实现链表。
接下来,我们需要定义链表的操作函数,其中包括添加节点、删除节点和排序节点等功能。
添加节点:
```c
// 添加学生节点
Student* Add(Student *head)
{
Student *p, *q;
p = (Student*)malloc(sizeof(Student)); // 动态分配结构体内存
printf("请输入学号:\n");
scanf("%d",&p->num);
if (p->num == 0) { // 输入0表示结束
return head;
}
printf("请输入姓名:\n");
scanf("%s",p->name);
printf("请输入性别:\n");
scanf(" %c",&p->sex);
printf("请输入成绩:\n");
scanf("%d",&p->score);
p->next = NULL;
if (head == NULL) // 如果链表为空,将p设为头节点
head = p;
else {
q = head;
while (q->next != NULL) // 遍历链表,找到尾节点
q = q->next;
q->next = p;
}
return head;
}
```
删除节点:
```c
// 删除指定学号的节点
Student *Delete(Student *head, int num)
{
Student *p, *q;
p = head;
if (head == NULL) {
printf("该链表为空,无法删除\n");
return head;
}
if (head->num == num) { // 删除头节点
head = head->next;
free(p);
return head;
}
while (p != NULL && p->num != num) {
q = p;
p = p->next;
}
if (p == NULL) {
printf("未找到该学生\n");
return head;
}
q->next = p->next;
free(p); // 释放内存
return head;
}
```
排序节点:
```c
// 按照成绩从小到大排序
Student* Sort(Student* head)
{
Student *p, *q, *tail, *empty;
tail = NULL;
while (head != tail) {
p = head;
// 遍历链表
while (p->next != tail) {
if (p->score > p->next->score) { // 如果p的成绩大于p的下一个节点的成绩,则交换p和p->next的位置
q = p->next;
empty = p->next->next;
p->next = empty;
q->next = p;
if (head == p) // 如果交换的是头节点和头节点的下一个节点的位置,需要将头节点更新为后移的节点
head = q;
else { // 否则,修改p前面的节点的指针
Student *r = head;
while (r->next != p) {
r = r->next;
}
r->next = q;
}
p = q; // 继续比较后面的节点
}
else {
p = p->next;
}
}
tail = p; // 将尾节点后移
}
return head; // 返回排好序的链表
}
```
最后,我们需要在main函数中调用上述的函数来实现从键盘输入学生信息、构建链表和排序节点。
```c
int main()
{
int i, num;
Student *head = NULL;
for (i = 0; i < 5; i++) { // 循环输入5个学生信息
head = Add(head);
}
printf("排序前的链表:\n");
printList(head);
printf("请输入要删除的学生学号:\n"); // 从键盘输入要删除的学号
scanf("%d",&num);
head = Delete(head, num); // 删除指定学生节点
printf("排序后的链表:\n");
head = Sort(head); // 按照成绩从小到大排序
printList(head); // 输出链表
return 0;
}
```
### 回答3:
首先要建立一个学生结构体,包含学号、姓名、性别和成绩。结构体的定义如下:
```
struct Student {
int sno; // 学号
char name[20]; // 姓名
char gender; // 性别
float score; // 成绩
};
```
然后,需要建立一个单链表,用来组织这些学生的信息。单链表有一个头结点和若干个数据结点,每个数据结点包含一个学生结构体和一个指向下一个数据结点的指针。用代码来表示单链表如下:
```
struct ListNode {
Student data;
ListNode* next;
};
ListNode* head = new ListNode; // 头结点
head->next = nullptr;
```
接下来,从键盘输入5个学生的信息,并将这些学生的信息插入到单链表中。输入时,如果遇到学号为0的学生,则表示输入结束。
```
ListNode* p = head;
while (true) {
Student s;
cin >> s.sno;
if (s.sno == 0) break;
cin >> s.name >> s.gender >> s.score;
// 将学生信息插入到单链表中
ListNode* q = new ListNode;
q->data = s;
q->next = nullptr;
p->next = q;
p = q;
}
```
最后,实现单链表中的各结点按照成绩有序排序并输出。排序时可以使用冒泡排序、选择排序等常见的排序算法。
```
// 冒泡排序
int len = 0;
p = head->next;
while (p) {
len++;
p = p->next;
}
for (int i = 0; i < len - 1; i++) {
p = head->next;
for (int j = 0; j < len - i - 1; j++) {
if (p->data.score > p->next->data.score) {
swap(p->data, p->next->data);
}
p = p->next;
}
}
// 输出
p = head->next;
while (p) {
cout << p->data.sno << " " << p->data.name << " " << p->data.gender << " " << p->data.score << endl;
p = p->next;
}
```
完整代码如下:
阅读全文