高级程序设计个人作业第九次

这个作业属于哪个课程 <班级的链接>
这个作业要求在哪里 <作业链接>
学号 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;
}

结果:

image

定义一个结构体数组,用来存放班级中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;
}

结果:

image

设计一个程序以指针和结构体变量名分别访问结构体变量的成员,进行输出。

点击查看代码
#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;
}

结果:

image

设计一个程序使用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;
}

结果:

image

建立一个链表,链表的节点个数为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;
}

结果:

image

image

image

posted @ 2025-12-12 15:47  aaa(zzz)  阅读(0)  评论(0)    收藏  举报