不太全面,可以作为参考看一下。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct Students /*学生结构体*/
{
char ID[20];
char Name[20];
float Mark1;
float Mark2;
float Mark3;
float Average;
}Student;
typedef struct Points /*一个节点*/
{
Student date;
struct Points* next;
}Point;
void stuput(Point*H) //输入数据
{
Point* r = H;
Point* p;
p = (Point*)malloc(sizeof(Point));
while (r->next)
r = r->next;
r->next = p;
p->next = NULL;
printf("请输入学生的ID,名字,Mark1 ,Mark2 ,Mark3 \n");
scanf("%s%s%f%f%f", p->date.ID, p->date.Name, &p->date.Mark1, &p->date.Mark2, &p->date.Mark3);
p->date.Average = (p->date.Mark1 + p->date.Mark2 + p->date.Mark3) / 3.0;
printf("成绩录入成功!\n");
}
void shu(Point* H) //遍历链表
{
Point* p;
p = H->next;
do
{
printf("%s %s %.2f %.2f %.2f %.2f\n", p->date.ID, p->date.Name, p->date.Mark1, p->date.Mark2, p->date.Mark3, p->date.Average);
p = p->next;
} while (p != NULL);
Sleep(3000); //延迟3秒
}
void search(Point*H) //按名字查询
{
Point* p = H->next;
char mz[20];
printf("请输入你要查询的名字:\n");
scanf("%s", mz);
while (strcmp(mz, p->date.Name) != 0)
p = p->next;
printf("%s %s %.2f %.2f %.2f %.2f\n", p->date.ID, p->date.Name, p->date.Mark1, p->date.Mark2, p->date.Mark3, p->date.Average);
Sleep(2000);
}
void last(Point* H) //单链表排序
{
void xu(Point * low, Point * high);
Point* lt = H;
Point* h = H->next;
while (lt->next != NULL)
lt = lt->next;
xu(h, lt);
}
void xu(Point* low, Point* high)
{
if (low == high || low == NULL)
return;
Point* i, * j, * k;
float pi, change;
k = low;
i = low->next;
j = low->next;
pi = low->date.Average;
while (j)
{
if (j->date.Average < pi)
{
change = j->date.Average;
j->date.Average = i->date.Average;
i->date.Average = change;
k = i;
i = i->next;
}
j = j->next;
}
change = low->date.Average;
low->date.Average = k->date.Average;
k->date.Average = change;
xu(low, k);
xu(i, high);
}
void xiu(Point* H) //按名字修改
{
Point* p = H->next;
char mz[20];
int n, i;
printf("请输入你要查询的名字:\n");
scanf("%s", mz);
while (strcmp(mz, p->date.Name) != 0)
p = p->next;
printf("请输入你要修改的内容:");
scanf("%f%f%f", &p->date.Mark1, &p->date.Mark2, &p->date.Mark3);
p->date.Average = (p->date.Mark1 + p->date.Mark2 + p->date.Mark3) / 3;
printf("修改成功\n");
}
void del(Point* H) //删除节点
{
Point* p = H->next;
Point* o = p->next;
char mz[20];
int n, i;
printf("请输入你要删除的名字:\n");
scanf("%s", mz);
while (strcmp(mz, p->next->date.Name) != 0)
p = p->next;
p->next = p->next->next;
free(o);
printf("删除成功\n");
}
int occur(Point*& H) //初始化
{
H = (Point*)malloc(sizeof(Point));
H->next = NULL;
return 0;
}
void start_t(Point* H)
{
system("cls");
void start1(Point * H);
printf("1.增加学生信息 2.修改学生信息\n");
printf("3.删除学生信息 4.按姓名查询\n");
printf("5.按平均成绩排序 6.输出\n");
printf("0.退出 \n");
int n;
scanf("%d", &n);
while (n)
{
switch (n)
{
case 1:stuput(H); break;
case 2:xiu(H); break;
case 3:del(H); break;
case 4:search(H); break;
case 5:last(H); break;
case 6:shu(H); break;
}
system("cls");
printf("1.增加学生信息 2.修改学生信息\n");
printf("3.删除学生信息 4.按姓名查询\n");
printf("5.按平均成绩排序 6.输出\n");
printf("0.退出 \n");
scanf("%d", &n);
}
}
void start_s(Point* H)
{
system("cls"); //清屏
void start1(Point * H);
printf("1.输入名字以查询 0.退出 \n");
int n;
scanf("%d", &n);
while (n)
{
switch (n)
{
case 1:search(H); break;
}
system("cls");
printf("1.输入名字以查询 0.退出 \n");
scanf("%d", &n);
}
}
void start1(Point* H)
{
printf("1.教师系统 2.学生系统\n");
printf("0.退出\n");
int n;
scanf("%d", &n);
while (n)
{
switch (n)
{
case 1:start_t(H); break;
case 2:start_s(H); break;
}
system("cls");
printf("1.教师系统 2.学生系统\n");
printf("0.退出\n");
scanf("%d", &n)
;
}
}
int main()
{
Point* H;
occur(H);
start1(H);
return 0;
}