学校C语言实验——结构2
本文章均为非计算机学院的实验,为最基础的初学者练手与入门的实验题目,请注意甄别。
老规矩,先写上头文件:
#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函数
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函数
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函数
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完整代码:
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创建链表:
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函数
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函数
void freelink(struct stu* head) {
struct stu* p = head, * q;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
};
2.4完整代码
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中最重要也是最难的部分