(1)写函数creat(),使其建立单链表来存放学生的信息及输出各学生的信息; (2)写函数delete(),按学号检索学生信息,如果找到,则删除该学生信息,并输出删除过后的所有学生信息,否则输出“不存在!”。 (3)写函数输出链表中的结点。 (4)释放链表所占内存空间。 struct student{ int id; //学生学号 int score; //考试成绩 struct student *next; };
时间: 2024-03-09 22:50:57 浏览: 49
好的,根据你的要求,我来为你实现这些函数。
首先,我们定义一个结构体 `student`,包含学生的学号和考试成绩,以及一个指向下一个结点的指针。然后,我们定义一个单链表结构体 `List`,包含头结点和链表长度等字段。接着,我们可以实现一个 `creat()` 函数,用于建立单链表并输出各学生的信息,代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
struct student {
int id;
int score;
struct student *next;
};
struct List {
struct student *head;
int length;
};
// 建立单链表并输出各学生的信息
void creat(struct List *list) {
list->head = NULL; // 初始化头结点指针为空
list->length = 0; // 初始化链表长度为0
printf("请输入学生信息,以-1结束\n");
while (1) {
struct student *node = (struct student *) malloc(sizeof(struct student));
scanf("%d", &node->id);
if (node->id == -1) { // 输入-1结束建立链表
free(node);
break;
}
scanf("%d", &node->score);
node->next = NULL; // 将新结点的指针域置为空
if (list->head == NULL) { // 如果链表为空,将该结点作为头结点
list->head = node;
} else { // 如果链表不为空,将该结点插入到链表尾部
struct student *p = list->head;
while (p->next != NULL) {
p = p->next;
}
p->next = node;
}
list->length++; // 链表长度加1
}
printf("学生信息如下:\n");
struct student *p = list->head;
while (p != NULL) { // 遍历链表并输出各学生的信息
printf("学号:%d 成绩:%d\n", p->id, p->score);
p = p->next;
}
}
```
接着,我们实现 `delete()` 函数,按学号检索学生信息,如果找到,则删除该学生信息,并输出删除过后的所有学生信息,否则输出“不存在!”。代码如下:
```c
// 按学号删除学生信息
void delete(struct List *list, int id) {
struct student *p = list->head;
struct student *q = NULL;
while (p != NULL) {
if (p->id == id) {
if (p == list->head) { // 如果要删除的结点是头结点
list->head = p->next;
} else { // 如果要删除的结点不是头结点
q->next = p->next;
}
free(p); // 释放要删除的结点内存
list->length--; // 链表长度减1
printf("删除成功!剩余学生信息如下:\n");
output(list); // 输出删除过后的所有学生信息
return;
}
q = p;
p = p->next;
}
printf("不存在!\n"); // 如果没有找到要删除的结点,则输出“不存在!”
}
```
然后,我们实现 `output()` 函数,输出链表中的结点。代码如下:
```c
// 输出链表中的结点
void output(struct List *list) {
struct student *p = list->head;
while (p != NULL) {
printf("学号:%d 成绩:%d\n", p->id, p->score);
p = p->next;
}
}
```
最后,我们实现 `destroy()` 函数,释放链表所占内存空间。代码如下:
```c
// 释放链表所占内存空间
void destroy(struct List *list) {
struct student *p = list->head;
while (p != NULL) {
struct student *temp = p;
p = p->next;
free(temp);
}
list->head = NULL; // 将头结点指针置为空
list->length = 0; // 将链表长度置为0
}
```
以上就是我根据你的要求为你实现的函数,希望对你有所帮助。
阅读全文