学校C语言实验——结构2

本文章均为非计算机学院的实验,为最基础的初学者练手与入门的实验题目,请注意甄别。

老规矩,先写上头文件:

cs 复制代码
#include "stdafa.h"   //新版的VS不需要这个,因为是C++环境
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

正文:

一、 编写程序:有3个学生,每个学生的数据包括学号、姓名和三门课的成绩及平均成绩。要求:

(1)编写一个函数indata,用来输入3个学生的数据(学号、姓名、三门课的成绩)。

(2)编写一个函数outdata,用来输出3个学生的记录。

(3)编写一个函数sort按平均分由小到大行排序。

结构定义如下:

typedef struct student{

int no;

char name[10];

int score[3]; //3门课程成绩

float average; //平均分

}STUD;

void indata(STUD *p,int n);

void outdata(STUD *p,int n);

void sort(STUD *p,int n);

int main(){

STUD a[3];

indata(a,3);

outdata(a,3);

sort(a,3);

outdata(a,3);

}

代码如下:

1.1indata函数

cs 复制代码
void indata(STUD* p, int n) {
    int i;
    for (i = 0;i < n;i++) {
        scanf("%d%s%d%d%d", &(p[i].no), p[i].name, &(p[i].score[0]), &(p[i].score[1]), &(p[i].score[2]));
        p[i].average = (p[i].score[0] + p[i].score[1] + p[i].score[2]) / 3.0;
    }
}

1.2outdata函数

cs 复制代码
void outdata(STUD* p, int n) {
    for (int i = 0;i < n;i++)
        printf("%d %s %d %d %d %f\n", p[i].no, p[i].name, p[i].score[0], p[i].score[1], p[i].score[2], p[i].average);
}

1.3sort函数

cs 复制代码
void sort(STUD* p, int n) {
    STUD t;
    for (int i = 0;i < n - 1;i++)
        for (int j = i + 1;j < n;j++)
            if (p[i].average > p[j].average) {
                t = p[i];p[i] = p[j];p[j] = t; //对记录进行交换 
            }
}

1.4完整代码:

cs 复制代码
typedef struct student {
    int no;
    char name[10];
    int score[3];     //3门课程成绩
    float average;   //平均分

}STUD;
void indata(STUD* p, int n);
void outdata(STUD* p, int n);
void sort(STUD* p, int n);
int main() {
    STUD a[3];
    indata(a, 3);
    outdata(a, 3);
    sort(a, 3);
    outdata(a, 3);
}

void indata(STUD* p, int n) {
    int i;
    for (i = 0;i < n;i++) {
        scanf("%d%s%d%d%d", &(p[i].no), p[i].name, &(p[i].score[0]), &(p[i].score[1]), &(p[i].score[2]));
        p[i].average = (p[i].score[0] + p[i].score[1] + p[i].score[2]) / 3.0;
    }
}

void outdata(STUD* p, int n) {
    for (int i = 0;i < n;i++)
        printf("%d %s %d %d %d %f\n", p[i].no, p[i].name, p[i].score[0], p[i].score[1], p[i].score[2], p[i].average);
}

void sort(STUD* p, int n) {
    STUD t;
    for (int i = 0;i < n - 1;i++)
        for (int j = i + 1;j < n;j++)
            if (p[i].average > p[j].average) {
                t = p[i];p[i] = p[j];p[j] = t; //对记录进行交换 
            }
}

运行结果如下:

二、假设输入num的值为0时链表结束。

(1)函数create()创建一个链表,num为0时结束。编程实现之;

(2)函数display()输出该链表。编程实现之;

(3)函数freelink()回收链表的空间。编程实现之。

结构如下:

struct stu{

int num;

int cj;

struct stu *next;

};

struct stu *create();

void display(struct stu * head);

void freelink(struct stu * head);

int main(){

struct stu *head;

head=create();

display(head);

freelink(head);

}

实现代码如下:

2.1创建链表:

cs 复制代码
struct stu* create() {
    struct stu* head, * p1, * p2;
    head = (struct stu*)calloc(1, sizeof(struct stu));
    p1 = head;
    scanf("%d%d", &(p1->num), &(p1->cj));
    printf("%d  %d\n", p1->num, p1->cj);
    if ((p1->num) == 0) { 
        free(p1);
        printf("Error!");
        return NULL; }
    p2 = NULL; //初始化p2
    while (1) {
        p2 = p1;
        p1 = (struct stu*)calloc(1, sizeof(struct stu));
        scanf("%d%d", &(p1->num), &(p1->cj));
        if (p1->num == 0) {
            free(p1);
            break;
        }
        p2->next = p1;
    }
    p2->next = NULL;
    return head;
};

2.2display函数

cs 复制代码
void display(struct stu* head) {
    struct stu* p = head->next;
    while (p != NULL) {
        printf("%d  %d\n", p->num, p->cj);
        p = p->next;
    }
};

2.3freelink函数

cs 复制代码
void freelink(struct stu* head) {
    struct stu* p = head, * q;
    while (p != NULL) {
        q = p->next;
        free(p);
        p = q;
    }
};

2.4完整代码

cs 复制代码
struct stu {
    int num;
    int cj;
    struct stu* next;
};

struct stu* create();
void display(struct stu* head);
void freelink(struct stu* head);

int main() {
    struct stu* head;
    head = create();
    display(head);
    freelink(head);
}

struct stu* create() {
    struct stu* head, * p1, * p2;
    head = (struct stu*)calloc(1, sizeof(struct stu));
    p1 = head;
    scanf("%d%d", &(p1->num), &(p1->cj));
    printf("%d  %d\n", p1->num, p1->cj);
    if ((p1->num) == 0) { 
        free(p1);
        printf("Error!");
        return NULL; }
    p2 = NULL; //初始化p2
    while (1) {
        p2 = p1;
        p1 = (struct stu*)calloc(1, sizeof(struct stu));
        scanf("%d%d", &(p1->num), &(p1->cj));
        if (p1->num == 0) {
            free(p1);
            break;
        }
        p2->next = p1;
    }
    p2->next = NULL;
    return head;
};

void display(struct stu* head) {
    struct stu* p = head->next;
    while (p != NULL) {
        printf("%d  %d\n", p->num, p->cj);
        p = p->next;
    }
};

void freelink(struct stu* head) {
    struct stu* p = head, * q;
    while (p != NULL) {
        q = p->next;
        free(p);
        p = q;
    }
};

运行结果如下:

三、总结

本次的两个实验虽然量少,但却是很重要的重点,第一个时用数组来展示结构,第二个则是指针,利用指针构成了一个链表,以此来展示所有数据,都是非常重要的考点,也是需要理解的,指针终究时C中最重要也是最难的部分

相关推荐
6KE论坛-人皇几秒前
wordpress zibll 2025款新页脚-6ke论坛
开发语言·前端·javascript
知识分享小能手20 分钟前
Java学习教程,从入门到精通,JDBC数据库连接语法知识点及案例代码(92)
java·大数据·开发语言·数据库·学习·java开发·java后端开发
Flocx23 分钟前
联合体(Union)
开发语言·网络·c++·stm32
I_Am_Me_27 分钟前
【专题一 递归】24. 两两交换链表中的节点
算法
迂幵myself31 分钟前
14-1C++STL的初始
开发语言·c++
冰茶_33 分钟前
C# 并发和并行的区别--16
开发语言·学习·c#
Allen Bright35 分钟前
【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例
java·开发语言·jvm
可喜~可乐35 分钟前
STM32 HAL库函数入门指南:从原理到实践
c语言·stm32·单片机·嵌入式硬件
三月七(爱看动漫的程序员)1 小时前
LARGE LANGUAGE MODELS ARE HUMAN-LEVEL PROMPT ENGINEERS
大数据·人工智能·算法·语言模型·自然语言处理·prompt
羑悻的小杀马特1 小时前
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
c++·算法·图论·floyd算法