高级程序设计个人作业第九次
| 这个作业属于哪个课程 | <班级的链接> |
|---|---|
| 这个作业要求在哪里 | <作业链接> |
| 学号 | 092300303 |
| 姓名 | 池博洋 |
@
目录
声明一个结构体类型,用来存放某个学生的姓名、学号、性别、班级、三科成绩,并且打印出来该学生信息
点击查看代码
#include <stdio.h>
#include <string.h>
// 声明结构体类型
struct Student {
char name[50];
int id;
char gender;
char className[20];
float scores[3]; // 三科成绩
};
int main() {
printf("=============== 单个学生信息操作 ===============\n\n");
// 创建并初始化一个学生信息
struct Student s1;
// 手动输入学生信息
printf("请输入学生姓名: ");
scanf("%s", s1.name);
printf("请输入学号: ");
scanf("%d", &s1.id);
printf("请输入性别(M/F): ");
scanf(" %c", &s1.gender); // 注意空格,避免读取上一个回车
printf("请输入班级: ");
scanf("%s", s1.className);
printf("请输入三科成绩(用空格分隔): ");
scanf("%f %f %f", &s1.scores[0], &s1.scores[1], &s1.scores[2]);
// 打印学生信息
printf("\n=============== 学生信息 ===============\n");
printf("姓名: %s\n", s1.name);
printf("学号: %d\n", s1.id);
printf("性别: %c\n", s1.gender);
printf("班级: %s\n", s1.className);
printf("三科成绩: %.1f, %.1f, %.1f\n",
s1.scores[0], s1.scores[1], s1.scores[2]);
printf("平均成绩: %.2f\n",
(s1.scores[0] + s1.scores[1] + s1.scores[2]) / 3);
return 0;
}
结果:

定义一个结构体数组,用来存放班级中N个学生以上信息,编写三个函数进行信息输入、排序和输出。
点击查看代码
#include <stdio.h>
#include <string.h>
// 声明结构体类型
struct Student {
char name[50];
int id;
char gender;
char className[20];
float scores[3];
};
// 使用typedef定义别名
typedef struct Student Student;
int main() {
printf("=============== 使用typedef别名 ===============\n\n");
// 使用别名定义变量
Student s1;
// 初始化学生信息
strcpy(s1.name, "李四");
s1.id = 1002;
s1.gender = 'F';
strcpy(s1.className, "软件工程2班");
s1.scores[0] = 92.0;
s1.scores[1] = 88.5;
s1.scores[2] = 95.0;
// 访问成员
printf("姓名: %s\n", s1.name);
printf("学号: %d\n", s1.id);
printf("性别: %c\n", s1.gender);
printf("班级: %s\n", s1.className);
printf("成绩: %.1f, %.1f, %.1f\n",
s1.scores[0], s1.scores[1], s1.scores[2]);
// 使用指针访问
Student *p = &s1;
printf("\n使用指针访问:\n");
printf("姓名: %s\n", p->name); // 使用箭头运算符
printf("学号: %d\n", p->id);
printf("成绩: %.1f\n", p->scores[0]);
return 0;
}
结果:

设计一个程序以指针和结构体变量名分别访问结构体变量的成员,进行输出。
点击查看代码
#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student s = {"Tom", 18, 95.5};
struct Student *p = &s;
printf("变量名访问: %s %d %.1f\n", s.name, s.age, s.score);
printf("指针访问: %s %d %.1f\n", p->name, p->age, p->score);
return 0;
}
结果:

设计一个程序使用typedef定义结构体类型的别名。
点击查看代码
#include <stdio.h>
typedef struct {
char name[20];
int age;
float score;
} Student;
int main() {
Student s;
scanf("%s %d %f", s.name, &s.age, &s.score);
printf("%s %d %.1f\n", s.name, s.age, s.score);
return 0;
}
结果:

建立一个链表,链表的节点个数为N(>5),使用从链尾到链头的建立方式和从链头到链尾的建立方式。
点击查看代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int id;
float score;
struct Node *next;
} Node;
/*********** 5.1 建链:尾插法 ***********/
Node* create_tail(int n) {
Node *head = NULL, *tail = NULL, *p;
for(int i = 0; i < n; i++) {
p = (Node*)malloc(sizeof(Node));
scanf("%d %f", &p->id, &p->score);
p->next = NULL;
if(head == NULL) head = tail = p;
else {
tail->next = p;
tail = p;
}
}
return head;
}
/*********** 5.1 建链:头插法(可选) ***********/
Node* create_head(int n) {
Node *head = NULL, *p;
for(int i = 0; i < n; i++) {
p = (Node*)malloc(sizeof(Node));
scanf("%d %f", &p->id, &p->score);
p->next = head;
head = p;
}
return head;
}
/*********** 5.2 遍历输出 ***********/
void print(Node* head) {
while(head) {
printf("%d %.1f\n", head->id, head->score);
head = head->next;
}
}
/*********** 5.3 删除一个节点 ***********/
Node* delete_one(Node* head, int key) {
Node *p = head, *pre = NULL;
while(p) {
if(p->id == key) {
if(pre == NULL) head = p->next;
else pre->next = p->next;
free(p);
return head;
}
pre = p;
p = p->next;
}
return head;
}
/*********** 5.4 删除多个节点(条件:score < 60) ***********/
Node* delete_multi(Node* head) {
Node *p = head, *pre = NULL;
while(p) {
if(p->score < 60) { // ← 条件可按作业要求改
if(pre == NULL) head = p->next;
else pre->next = p->next;
Node* tmp = p;
p = p->next;
free(tmp);
} else {
pre = p;
p = p->next;
}
}
return head;
}
/*********** 5.5 插入多个节点(尾插法) ***********/
Node* insert_multi(Node* head, int k) {
Node *p, *tail = head;
while(tail && tail->next) tail = tail->next;
for(int i = 0; i < k; i++) {
p = (Node*)malloc(sizeof(Node));
scanf("%d %f", &p->id, &p->score);
p->next = NULL;
if(head == NULL) head = tail = p;
else {
tail->next = p;
tail = p;
}
}
return head;
}
int main() {
int n, key, k;
printf("请输入链表节点数(>5):");
scanf("%d", &n);
printf("请输入 %d 个节点(id score):\n", n);
Node *head = create_tail(n); // 使用尾插法
printf("\n建立的链表:\n");
print(head);
printf("\n请输入要删除的 id:");
scanf("%d", &key);
head = delete_one(head, key);
printf("\n删除单个节点后的链表:\n");
print(head);
printf("\n删除成绩<60的节点...\n");
head = delete_multi(head);
printf("删除多个节点后的链表:\n");
print(head);
printf("\n请输入要插入的节点数:");
scanf("%d", &k);
printf("请输入要插入的 %d 个节点(id score):\n", k);
head = insert_multi(head, k);
printf("\n最终链表:\n");
print(head);
return 0;
}
结果:



浙公网安备 33010602011771号