#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
struct student *head=NULL;
struct student //学生信息结构体
{
int number;
char name[20];
int chinese;
int math;
int sum;
struct student *next;
};
struct student *add()//录入学生信息
{
printf("已进入学生信息录入界面!\n");
int mark; int jshu = 1;
struct student *head,*New, *p;
head = (struct student*)malloc(sizeof(struct student));
if (head != NULL)
{
printf("请输入第%d个学生的学号:", jshu); scanf("%d", &head->number);
printf("请输入第%d个学生的姓名:", jshu); scanf("%s", head->name);
printf("请输入第%d个学生的语文:", jshu); scanf("%d", &head->chinese);
printf("请输入第%d个学生的数学:", jshu); scanf("%d", &head->math);
jshu++;
head->next = NULL;
p = head;
printf("录入成功!\n");
}
else
{
printf("空间已满,录入失败!\n"); return ;
}
printf("是否继续录入学生信息(输入1:继续 或者0:放弃):");
scanf("%d", &mark);
while (mark)
{
New = (struct student*)malloc(sizeof(struct student));
if (New != NULL)
{
printf("请输入第%d个学生的学号:", jshu); scanf("%d", &New->number);
printf("请输入第%d个学生的姓名:", jshu); scanf("%s", New->name);
printf("请输入第%d个学生的语文成绩:", jshu); scanf("%d", &New->chinese);
printf("请输入第%d个学生的数学成绩:", jshu); scanf("%d", &New->math);
jshu++;
New->next = NULL;
p->next = New;
p = New;
printf("录入成功!\n");
}
else
{
printf("空间已满,录入失败!\n"); return 0;
}
printf("是否继续录入学生信息(输入1:继续 或者0:放弃):");
scanf("%d", &mark);
}
return (head);
}
void zshu(struct student *head)//求每一个学生的总分数(语文,数学)
{
struct student *p;
p = head;
while (p != NULL)
{
p->sum = p->chinese + p->math;
p = p->next;
}
}
void showALL(struct student *head)//显示学生信息
{
struct student *p;
p = head;
zshu(head);
printf(" 已显示所有学生信息\n");
printf("学号 姓名 语文成绩 数学成绩 总分\n");
while (p != NULL)
{
printf("%d ",p->number);
printf("%s ", p->name);
printf("%d ", p->chinese);
printf("%d ", p->math);
printf("%d ", p->sum);
p = p->next;
printf("\n");
}
}
void moddify(struct student *head)//修改学生信息
{
showALL(head);
printf("已进入学生信息录入界面!\n");
char c[20]; int b,k;
struct student *p;
p = head;
printf("请选择要修改的学生姓名:");
scanf("%s",&c);
while (p != NULL)
{
k = strcmp(p->name, c);//知识点:一定要注意字符串是靠函数判断相等strcmp(字符串1,字符串2)只有当返回值为0的时候才是相等
if (k == 0)
{
printf("找到了!\n");
printf("学号:%d ", p->number);
printf("名字:%s ", p->name);
printf("语文成绩:%d ", p->chinese);
printf("数学成绩:%d ", p->math);
printf("总分:%d ", p->sum);
printf("\n是否修改该学生的信息(1:是,0:否):");
scanf("%d", &b);
if (b == 1)
{
printf("请输入修改的学生的学号:"); scanf("%d", &p->number);
printf("请输入修改的学生的姓名:"); scanf("%s", p->name);
printf("请输入修改的学生的语文成绩:"); scanf("%d", &p->chinese);
printf("请输入修改的学生的数学成绩:"); scanf("%d", &p->math);
}
else
{
printf("已经取消该学生的修改!"); return;
}
}
else
{
p = p->next;
}
}
if (p == NULL)
{
printf("没有找到该学生的信息!"); return;
}
}
struct student *del(struct student *head)//删除学生信息
{
zshu(head);
struct student *p,*p1;
int a, b, k;
printf("请输入要删除学生的学号");
scanf("%d",&a);
if (head->number == a)
{
printf("找到了!\n");
printf("学号:%d ", head->number);
printf("名字:%s ", head->name);
printf("语文成绩:%d ", head->chinese);
printf("数学成绩:%d ", head->math);
printf("总分:%d ", head->sum);
printf("\n是否删除该学生的信息(1:是,0:否):");
scanf("%d", &b);
if (b == 1)
{
p = head;
head = head->next;
free(p);
printf("删除成功!\n");
return(head);
}
else
{
printf("已经取消该学生的删除!\n"); return(head);
}
}
p = head;
p1 = head->next;
while (p1 != NULL&&p1->number != a)
{
p = p->next;
p1 = p1->next;
}
if (p1 !=NULL)
{
printf("找到了!\n");
printf("学号:%d ", p1->number);
printf("名字:%s ", p1->name);
printf("语文成绩:%d ", p1->chinese);
printf("数学成绩:%d ", p1->math);
printf("总分:%d ", p1->sum);
printf("\n是否删除该学生的信息(1:是,0:否):");
scanf("%d", &b);
if (b == 1)
{
p->next = p1->next;//知识点:以后面为基础
free(p1);
printf("删除成功!\n");
return(head);
}
else
{
printf("已经取消该学生的删除!\n"); return(head);
}
}
else
{
printf("没有找到该学生的信息!\n"); return(head);
}
}
void search(struct student *head)//查找学生信息
{
zshu(head);
printf("已进入查找学生信息界面!\n");
char c[20]; int k;
struct student *p;
p = head;
printf("请选择要查找的学生姓名:");
scanf("%s", &c);
while (p != NULL&&strcmp(p->name, c)!=0)
{
p = p->next;
}
if (p != NULL)
{
printf("找到了!\n");
printf("学号:%d ", p->number);
printf("名字:%s ", p->name);
printf("语文成绩:%d ", p->chinese);
printf("数学成绩:%d ", p->math);
printf("总分:%d ", p->sum);
}
else
{
printf("没有找到该学生的信息!\n");
}
}
int jshu(struct student* head)//算有多少个表(求表长)
{
int j = 0;
struct student* p;
p = head;
while (p != NULL)
{
p = p ->next;
j++;
}
return j;
}
void sort(struct student *head)//排序以总分来排序
{
zshu(head);
int a[99][99]; char b[99][99]; char a1[99];
int i,zda,j,q;
zda=jshu(head);
struct student *p;
p = head;
while (p != NULL)
{
for (i = 0; i < zda; i++)//链表转数组
{
a[i][0] = p->number;
strcpy(b[i], p->name);//##########################
a[i][2] = p->chinese;
a[i][3] = p->math;
a[i][4] = p->sum;
p = p->next;
}
}
for (i = 0; i < zda; i++)//数组的复制操作
{
a1[i] = a[i][4];
}
for (i = 0; i < zda; i++)//冒泡法排序(大到小)
{
for (j = 0; j < zda-1 -i; j++)
{
if (a1[j]<a1[j+1])
{
int k;
k = a1[j];
a1[j] = a1[j + 1];
a1[j + 1] = k;
}
}
}
printf("学号 姓名 语文成绩 数学成绩 总分\n");
for (i = 0; i < zda; i++)//学号 (名字) 语文 数学 总分
{
for (j = 0; j < zda; j++)
{
if (a1[i] == a[j][4])
{
printf("%d ", a[j][0]);
printf("%s ",b[i]);//####################################################
//for (q = 0; b[j][q] != '\0'; q++)//将保存好的名字按字符一个个输出
//{
// printf("%c", b[j][q]);
//}
printf("%d %d %d\n", a[j][2],a[j][3],a[j][4]);
}
}
}
}
void menu()//菜单
{
int a, bc;
printf("\n================================================\n");
mark:printf("| 学生信息管理系统 |\n");
printf("================================================\n");
printf("| 1--录入学生信息 |\n");
printf("| 2--显示所有学生信息 |\n");
printf("| 3--修改学生信息 |\n");
printf("| 4--删除学生信息 |\n");
printf("| 5--查找学生信息 |\n");
printf("| 6--排序 |\n");
printf("| 0--退出系统 |\n");
printf("================================================\n");
printf("请选择(0-6)\n");
scanf("%d", &a);
switch (a)
{
case 0: printf("已经退出学生信息管理系统"); return;
case 1:head = add(); menu(); break;
case 2: showALL(head); menu(); break;
case 3: moddify(head); menu(); break;
case 4:head=del(head); menu(); break;
case 5: search(head); menu(); break;
case 6: sort(head); menu(); break;
default:printf("选择错误请重新选择:\n"); goto mark;
}
}
int main()
{
menu();
return 0;
}
#define _CRT_SECURE_NO_WARNINGS//链表
#include <stdio.h>
#include <malloc.h>
struct student *head=NULL;//全局链表头
struct student //学生信息结构体
{
int number;
char name[20];
int chinese;
int math;
int sum;
struct student *next;
};
struct student *add()//录入学生信息
{
printf("已进入学生信息录入界面!\n");
int mark; int jshu = 1;
struct student *head,*New, p,p1;
head = (struct student)malloc(sizeof(struct student));
if (head != NULL)
{
printf("请输入第%d个学生的学号:", jshu); scanf("%d", &head->number);
printf("请输入第%d个学生的姓名:", jshu); scanf("%s", head->name);
printf("请输入第%d个学生的语文:", jshu); scanf("%d", &head->chinese);
printf("请输入第%d个学生的数学:", jshu); scanf("%d", &head->math);
jshu++;
head->next = NULL;
p = head;
printf("录入成功!\n");
}
else
{
printf("空间已满,录入失败!\n"); return ;
}
printf("是否继续录入学生信息(输入1:继续 或者0:放弃):");
scanf("%d", &mark);
while (mark)
{
New = (struct student)malloc(sizeof(struct student));
if (New != NULL)
{
mark:printf("请输入第%d个学生的学号:", jshu); scanf("%d", &New->number);
p1 = head;
while (p1 != NULL&&p1->number!=New->number&&p1!=New)
{
p1 = p1->next;
}
if (p1 != NULL)
{
printf("该学号已经存在,请重新输入\n");
goto mark;
}
else
{
printf("请输入第%d个学生的姓名:", jshu); scanf("%s", New->name);
printf("请输入第%d个学生的语文成绩:", jshu); scanf("%d", &New->chinese);
printf("请输入第%d个学生的数学成绩:", jshu); scanf("%d", &New->math);
jshu++;
New->next = NULL;
p->next = New;
p = New;
printf("录入成功!\n");
}
}
else
{
printf("空间已满,录入失败!\n"); return 0;
}
printf("是否继续录入学生信息(输入1:继续 或者0:放弃):");
scanf("%d", &mark);
}
return (head);
}
void zshu(struct student *head)//求每一个学生的总分数(语文,数学)
{
struct student *p;
p = head;
while (p != NULL)
{
p->sum = p->chinese + p->math;
p = p->next;
}
}
void showALL(struct student *head)//显示学生信息
{
struct student *p;
p = head;
zshu(head);
printf(" 已显示所有学生信息\n");
printf("学号 姓名 语文成绩 数学成绩 总分\n");
while (p != NULL)
{
printf("%d ",p->number);
printf("%s ", p->name);
printf("%d ", p->chinese);
printf("%d ", p->math);
printf("%d ", p->sum);
p = p->next;
printf("\n");
}
}
void moddify(struct student *head)//修改学生信息
{
showALL(head);
printf("已进入学生信息修改界面!\n");
char c[20]; int b,k;
struct student *p,*p1;
p = head;
printf("请选择要修改的学生姓名:");
scanf("%s",&c);
while (p != NULL)
{
k = strcmp(p->name, c);//知识点:一定要注意字符串是靠函数判断相等strcmp(字符串1,字符串2)只有当返回值为0的时候才是相等
if (k == 0)
{
printf("找到了!\n");
printf("学号:%d ", p->number);
printf("名字:%s ", p->name);
printf("语文成绩:%d ", p->chinese);
printf("数学成绩:%d ", p->math);
printf("总分:%d ", p->sum);
printf("\n是否修改该学生的信息(1:是,0:否):");
scanf("%d", &b);
if (b == 1)
{
mark:printf("请输入修改的学生的学号:"); scanf("%d", &p->number);
p1 = head;
if (p1 == p)
{
p1 = p1->next;
}
while (p1 != NULL&&p1->number != p->number)
{
p1 = p1->next;
if (p1 == p)
{
p1 = p1->next;
}
}
if (p1 != NULL)
{
printf("该学号已经存在,请重新输入\n");
goto mark;
}
else
{
printf("请输入修改的学生的姓名:"); scanf("%s", p->name);
printf("请输入修改的学生的语文成绩:"); scanf("%d", &p->chinese);
printf("请输入修改的学生的数学成绩:"); scanf("%d", &p->math);
printf("修改成功!\n"); return;
}
}
else
{
printf("已经取消该学生的修改!"); return;
}
}
else
{
p = p->next;
}
}
if (p == NULL)
{
printf("没有找到该学生的信息!"); return;
}
}
struct student *del(struct student *head)//删除学生信息
{
zshu(head);
struct student *p,*p1;
int a, b, k;
printf("请输入要删除学生的学号");
scanf("%d",&a);
if (head->number == a)
{
printf("找到了!\n");
printf("学号:%d ", head->number);
printf("名字:%s ", head->name);
printf("语文成绩:%d ", head->chinese);
printf("数学成绩:%d ", head->math);
printf("总分:%d ", head->sum);
printf("\n是否删除该学生的信息(1:是,0:否):");
scanf("%d", &b);
if (b == 1)
{
p = head;
head = head->next;
free(p);
printf("删除成功!\n");
return(head);
}
else
{
printf("已经取消该学生的删除!\n"); return(head);
}
}
p = head;
p1 = head->next;
while (p1 != NULL&&p1->number != a)
{
p = p->next;
p1 = p1->next;
}
if (p1 !=NULL)
{
printf("找到了!\n");
printf("学号:%d ", p1->number);
printf("名字:%s ", p1->name);
printf("语文成绩:%d ", p1->chinese);
printf("数学成绩:%d ", p1->math);
printf("总分:%d ", p1->sum);
printf("\n是否删除该学生的信息(1:是,0:否):");
scanf("%d", &b);
if (b == 1)
{
p->next = p1->next;//知识点:以后面为基础(头已经查过,以后面的内容来free)
free(p1);
printf("删除成功!\n");
return(head);
}
else
{
printf("已经取消该学生的删除!\n"); return(head);
}
}
else
{
printf("没有找到该学生的信息!\n"); return(head);
}
}
void search(struct student *head)//查找学生信息
{
zshu(head);
printf("已进入查找学生信息界面!\n");
char c[20]; int k;
struct student *p;
p = head;
printf("请选择要查找的学生姓名:");
scanf("%s", &c);
while (p != NULL&&strcmp(p->name, c)!=0)
{
p = p->next;
}
if (p != NULL)
{
printf("找到了!\n");
printf("学号:%d ", p->number);
printf("名字:%s ", p->name);
printf("语文成绩:%d ", p->chinese);
printf("数学成绩:%d ", p->math);
printf("总分:%d ", p->sum);
}
else
{
printf("没有找到该学生的信息!\n");
}
}
int jshu(struct student* head)//算有多少个表(求表长)
{
int j = 0;
struct student* p;
p = head;
while (p != NULL)
{
p = p ->next;
j++;
}
return j;
}
void sort(struct student *head)//排序以总分来排序
{
zshu(head);
int a[99][99]; char b[99][99]; int a1[99];
int i,zda,j,q,ha;
zda=jshu(head);
struct student *p;
p = head;
while (p != NULL)
{
for (i = 0; i < zda; i++)//链表转数组
{
a[i][0] = p->number;
strcpy(b[i], p->name);//将字符二复制到字符一
a[i][2] = p->chinese;
a[i][3] = p->math;
a[i][4] = p->sum;
p = p->next;
}
}
for (i = 0; i < zda; i++)//数组的复制操作
{
a1[i] = a[i][4];
}
for (i = 0; i < zda; i++)//冒泡法排序(大到小)
{
for (j = 0; j < zda-1 -i; j++)
{
if (a1[j]<a1[j+1])
{
int k;
k = a1[j];
a1[j] = a1[j + 1];
a1[j + 1] = k;
}
}
}
printf("学号 姓名 语文成绩 数学成绩 总分\n");
for (i = 0; i < zda; i++)//学号 (名字) 语文 数学 总分//利用数组进行为伪输出(不破坏原来链表数据)
{
for (j = 0; j < zda; j++)
{
if (a1[i] == a[j][4])
{
printf("%d ", a[j][0]);
for (q = 0; b[j][q] != '\0'; q++)//将保存好的名字按字符一个个输出
{
printf("%c", b[j][q]);
}
printf(" ");
printf("%d %d %d\n", a[j][2],a[j][3],a[j][4]);
a[j][4] = 0;
}
}
}
}
void menu()//菜单
{
int a, bc;
printf("\n================================================\n");
mark:printf("| 学生信息管理系统 |\n");
printf("================================================\n");
printf("| 1--录入学生信息 |\n");
printf("| 2--显示所有学生信息 |\n");
printf("| 3--修改学生信息 |\n");
printf("| 4--删除学生信息 |\n");
printf("| 5--查找学生信息 |\n");
printf("| 6--排序 |\n");
printf("| 0--退出系统 |\n");
printf("================================================\n");
printf("请选择(0-6)\n");
scanf("%d", &a);
switch (a)
{
case 0: printf("已经退出学生信息管理系统"); return;
case 1:head = add(); menu(); break;
case 2: showALL(head); menu(); break;
case 3: moddify(head); menu(); break;
case 4:head=del(head); menu(); break;
case 5: search(head); menu(); break;
case 6: sort(head); menu(); break;
default:printf("选择错误请重新选择:\n"); goto mark;
}
}
int main()
{
menu();
return 0;
}