结构体和链表例题2
1、成绩系统之输入输出
题目描述
陈老师布置同学们完成一个小型的成绩管理系统,据说完成后至少可以有200行以上的代码,这可是课程学习到现在最大的编码量了。一下子写这么大的一个程序你可能会觉得无从着手,所以老师希望你先从输入输出开始。已知有n个学生,每个学生信息包含学号、姓名、性别、3门课程成绩,现在请你设计两个函数,完成学生信息的输入和输出,并在主程序中得到检测。
输入要求
先输入一个整数n表示有n个学生信息。(假设学生最多有50人)。接下来输入这n个学生的学号、姓名(不超过20个字符,可能带空格)、性别、3门课程成绩。每个学生输入中第一行输入学号、姓名,第二行包括性别、3门课成绩,具体见样例。
输出要求
输出n个学生的信息,按照输入的顺序
输入样例
2
15001 Peter Li
m 90 91 92
15002 Susan Wang
f 81 82 83
输出样例
---Student Information---
15001 Peter Li m 90 91 92
15002 Susan Wang f 81 82 83
代码示例:
#include<stdio.h>
typedef struct student
{
int ID;
char Name[20];
char Gender;
int score[3];
}STU;
STU s[50];
void add(STU *p,int n);
void disp(STU st);
int main()
{
int n,i;
scanf("%d",&n);
add(s,n);
printf("---Student Information---\n");
for(i=0;i<n;i++)
{
disp(s[i]);
}
return 0;
}
void add(STU *p,int n)
{
int j;
for(p=s;p<s+n;p++)
{
scanf("%d",&(*p).ID);
gets((*p).Name);
scanf("%c",&(*p).Gender);
for(j=0;j<3;j++)
{
scanf("%d",&(*p).score[j]);
}
}
}
void disp(STU st)
{
int j;
printf("%d ",st.ID);
printf("%-20s ",st.Name);
printf("%c ",st.Gender);
for(j=0;j<3;j++)
{
printf("%d ",st.score[j]);
}
printf("\n");
}
2、成绩系统之平均成绩
题目描述
陈老师布置同学们完成一个小型的成绩管理系统,现在希望你设计其中的一个求平均值的模块。已知有n个学生,每个学生信息包含学号、姓名、性别、3门课程成绩,现在请你设计函数,完成对每个学生3门课程求平均,并输出相应信息。
输入要求
先输入一个整数n表示有n个学生信息。(假设学生最多有50人)。接着输入这n个学生的学号、姓名(不超过20个字符,可能带空格)、性别、3门课程成绩。
输出要求
输出每个学生的学号、姓名、3门课程成绩以及平均成绩(保留1位小数)
输入样例
2
15001 Peter Li m 90 91 92
15002 Susan Wang f 81 82 83
输出样例
---Student Information---
15001 Peter Li m 90 91 92
15002 Susan Wang f 81 82 83
代码示例:
#include<stdio.h>
typedef struct student
{ int ID;
char Name[20];
char Gender;
int score[3];
double ave;
}STU;
void add(STU *p,int size); //函数,实现学生的信息输入
void average(STU *p,int size); //函数,求学生平均成绩
void disp(STU *p,int size); //函数,实现学生的信息输出
int main()
{
STU s[50];
int n;
scanf("%d",&n);
add(s,n);
average(s,n);
disp(s,n);
return 0;
}
void add(STU *p,int size)
{
int i,j;
for(i=0;i<size;i++,p++)
{
scanf("%d",&p->ID);
gets(p->Name);
scanf("%c",&(*p).Gender);
for(j=0;j<3;j++)
{
scanf("%d",&(*p).score[j]);
}
}
}
void average(STU *p,int size)
{
int i,j;
for(i=0;i<size;i++,p++)
{
double sum=0;
for(j=0;j<3;j++)
{
sum+=(*p).score[j];
(*p).ave=sum/3.0;
}
}
}
void disp(STU *p,int size)
{
int i,j;
printf("---Student Information---\n");
for(i=0;i<size;i++)
{
printf("%d ",p->ID);
printf("%-20s ",p->Name);
for(j=0;j<3;j++)
printf("%d ",p->score[j]);
printf("%.1lf ",p->ave);
printf("\n");
p++;
}
}
3、考试之后
题目描述
又是一次期中考。考完之后肯定少不了成绩的排名。可是面对这么多的成绩,老师也觉得累。于是向熟悉编程的你求助。计入排名的考试只有语文数学跟英语三门。按照平均分从高到低输出。
输入要求
先输入一个整数n,表示有n个学生。(0 < n < 300)
接下来n行,每行有4个数据,分别代表学号,语文成绩,数学成绩,英语成绩。
输出要求
按照平均分从大到小输出这n个学生的语文成绩、数学成绩、英语成绩。平均分相同时,按照学号的升序来。
输入样例
4
1023 88 75 65
1033 99 59 70
1187 77 82 83
1054 64 86 92
输出样例
1054 64 86 92
1187 77 82 83
1023 88 75 65
1033 99 59 70
代码示例:
#include<stdio.h>
typedef struct student
{
int num;
int yuwen;
int shuxue;
int yingyu;
double ave;
}STU;
int main()
{
int n,i,j;
scanf("%d",&n);
STU s[n],temp;
for(i=0;i<n;i++)
{
scanf("%d%d%d%d",&s[i].num,&s[i].yuwen,&s[i].shuxue,&s[i].yingyu);
s[i].ave=(s[i].yuwen+s[i].shuxue+s[i].yingyu)/3.0;
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(s[j].ave==s[j+1].ave)
{
if(s[j].num>s[j+1].num)
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
else if(s[j].ave<s[j+1].ave)
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%d %d %d %d\n",s[i].num,s[i].yuwen,s[i].shuxue,s[i].yingyu);
}
return 0;
}
4、动态链表的建立和查询
题目描述
建立一个有若干个学生信息的单向链表,并对链表进行查询和输出,学生信息包括学号、姓名、一门课程成绩
输入要求
从键盘输入若干学生信息,以学号输入0作为结束标记。其中,假设有效分数都在0~100之间。
输出要求
输出所有学生的信息。每个学生的信息占据一行。如果链表为空,则输出“LinkList is Null”,输出不包含双引号。
输入样例
1011
anney
89
1012
frank
91
1013
susan
94
0
输出样例
1011 anney 89
1012 frank 91
1013 susan 94
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define N 21
typedef struct student
{
long ID;
char name[N];
int score;
struct student *next;
}STU;
STU *CreateList()
{
STU *head = NULL, *p, *q, *r;
p = (STU *)malloc(sizeof(STU));
head = p;
if(head == NULL)
{
printf("LinkList is Null\n");
exit(0);
}
q = p;
r = head;
scanf("%ld", &q->ID);
while(q->ID != 0)
{
getchar();
scanf("%s", q->name);
scanf("%d", &q->score);
p = (STU *)malloc(sizeof(STU));
q->next = p;
r = q;
q = p;
scanf("%ld", &q->ID);
}
r->next = NULL;
return head;
}
void PrintList(STU *head)
{
STU *p;
p = head;
if(p->ID == 0)
{
printf("LinkList is Null\n");
exit(0);
}
while(p != NULL)
{
printf("%ld ", p->ID);
printf("%s", p->name);
printf(" %d\n", p->score);
p = p->next;
}
return;
}
void FreeList(STU *head)
{
STU *p = head, *q;
while(p != NULL)
{
q = p -> next;
free(p);
p = q;
}
return;
}
int main()
{
STU *head;
head = CreateList();
PrintList(head);
FreeList(head);
return 0;
}
5、链表插入
题目描述
给定一串数字,用链表结构进行存储。然后给定针对该链表的若干插入操作,要求将执行插入操作后的结果输出。
输入要求
第一行:输入一个整数n,表示这串数字有n个(n大于等于1)。
第二行:输入这n个整数。
第三行:输入一个整数m,表示需要执行m个插入操作。
后面m行:每行输入两个整数a和b,表示在这串数字的当前第a个数字之后插入数字b。(假设链表第一个节点编号为1)
输出要求
输出操作后的n+m个数字。每个数字用空格空开(最后一个数字后面没有空格,直接换行)。
输入样例
3
2 1 3
2
1 5
1 6
输出样例
2 6 5 1 3
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct date
{
int date;
struct date *next;
}DATE;
DATE *CreateList(int n)
{
DATE *head, *p, *q;
int i;
p = (DATE *)malloc(sizeof(DATE));
head = p;
scanf("%d", &p->date);
q = p;
for(i = 1; i < n; i++)
{
p = (DATE *)malloc(sizeof(DATE));
scanf("%d", &p->date);
q->next = p;
q = p;
}
q->next = NULL;
return head;
}
void InsertList(DATE *head, int a, int b)
{
DATE *p, *q, *r;
int i;
p = head;
r = (DATE *)malloc(sizeof(DATE));
r->date = b;
for(i = 1; i < a; i++)
{
p = p->next;
}
q = p->next;
p->next = r;
r->next = q;
return;
}
void PrintList(DATE *head)
{
DATE *p;
int flag = 1;
p = head;
while(p != NULL)
{
if(flag)
{
printf("%d", p->date);
flag = 0;
}
else
printf(" %d", p->date);
p = p->next;
}
printf("\n");
return;
}
void FreeList(DATE *head)
{
DATE *p, *q;
p = head;
while(p != NULL)
{
q = p->next;
free(p);
p = q;
}
return;
}
int main()
{
int n, m, a, b;
DATE *head;
scanf("%d", &n);
head = CreateList(n);
scanf("%d", &m);
while(m--)
{
scanf("%d%d", &a, &b);
InsertList(head, a, b);
}
PrintList(head);
FreeList(head);
return 0;
}