C语言编写程序实现:使用后插法建立一个带头结点的存储学生信息的单链表,并将建立后的学生链表中的信息输出到屏幕上,学生的结构体类型可自行定义。” 具体要求 1.单链表的建立和单链表的品示分别使用函数实现,学号为 0,结束输入。 2.在 main 函数中完成初始化工作并调用上述两个函数。
时间: 2024-03-22 07:41:00 浏览: 61
好的,以下是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
/* 定义学生信息结构体 */
typedef struct student {
int id; /* 学号 */
char name[20]; /* 姓名 */
int age; /* 年龄 */
char gender[10]; /* 性别 */
struct student *next; /* 指向下一个学生结点的指针 */
} Student;
/* 函数声明 */
void create(Student *head); /* 创建并初始化带头结点的单链表 */
void display(Student *head); /* 输出带头结点的单链表中的学生信息 */
/* 主函数 */
int main() {
Student *head; /* 定义头结点 */
head = (Student *)malloc(sizeof(Student)); /* 动态分配头结点内存空间 */
head->next = NULL; /* 初始化头结点指针域为空 */
create(head); /* 创建并初始化带头结点的单链表 */
display(head); /* 输出带头结点的单链表中的学生信息 */
return 0;
}
/* 创建并初始化带头结点的单链表 */
void create(Student *head) {
Student *p, *q;
int id;
p = head;
printf("请输入学生信息(学号为0时输入结束):\n");
while (1) {
q = (Student *)malloc(sizeof(Student)); /* 动态分配新结点内存空间 */
printf("请输入学号:");
scanf("%d", &id);
if (id == 0) {
break; /* 学号为0时输入结束 */
}
q->id = id; /* 存储学号信息 */
printf("请输入姓名:");
scanf("%s", q->name); /* 存储姓名信息 */
printf("请输入年龄:");
scanf("%d", &q->age); /* 存储年龄信息 */
printf("请输入性别:");
scanf("%s", q->gender); /* 存储性别信息 */
q->next = NULL; /* 初始化新结点指针域为空 */
p->next = q; /* 将新结点插入到链表尾部 */
p = q; /* 将指针 p 移动到链表尾部 */
}
}
/* 输出带头结点的单链表中的学生信息 */
void display(Student *head) {
Student *p;
printf("学号\t姓名\t年龄\t性别\n");
p = head->next;
while (p != NULL) { /* 遍历链表并输出学生信息 */
printf("%d\t%s\t%d\t%s\n", p->id, p->name, p->age, p->gender);
p = p->next;
}
}
```
在 main 函数中,首先动态分配头结点内存空间,然后将头结点的指针域指向 NULL,接着调用 create 函数创建并初始化带头结点的单链表,最后调用 display 函数输出链表中的学生信息。
在 create 函数中,定义两个指针变量 p 和 q,其中 p 指向当前已经插入到链表尾部的结点,q 指向新分配的结点。在输入学生信息时,先动态分配新结点内存空间,然后分别输入学号、姓名、年龄和性别信息,最后将新结点插入到链表尾部并将指针 p 移动到链表尾部。
在 display 函数中,定义一个指针变量 p,初始时指向链表中的第一个结点,然后遍历链表并输出学生信息。
注意:本代码实现中,输入学生信息时,学号必须为正整数,姓名和性别必须为字符串,年龄必须为整数。如果输入的格式不正确,程序可能会出现错误。
阅读全文