#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define Length sizeof(struct student) //用來開辟空間
int n=0;
struct student
{
char name[20]; //名字
char sex[20]; //性別
char Class[20]; //班級
char major[20]; //專業
int age; //年齡
int cgrade; //C語言成績
int mgrade; //數學成績
int egrade; //英語成績
int pgrade; //體育成績
int lgrade; //語文成績
int avg; //平均分
struct student *next;
}*head,*p,*p1,*p2; //head表示開頭 p表示不同位置的資料
void add( ) //添加
{ p1=(struct student *)malloc(Length); //開辟存盤空間
if(n==0) //判斷鏈表開頭
head=p1; //n=0代表輸入的是第一個資料 //p2的結尾所指向的地址是p1
else p2->next=p1; //n!=0 就它們連接起來
system("cls");
printf("請輸入學生基本資訊:\n姓名:");
scanf("%s",&p1->name);
printf("性別:");
scanf("%s",&p1->sex);
printf("年齡:");
scanf("%d",&p1->age);
printf("班級:");
scanf("%s",&p1->Class);
printf("專業:");
scanf("%s",&p1->major);
printf("C語言成績: ");
scanf("%d",&p1->cgrade);
printf("數學成績:");
scanf("%d",&p1->mgrade);
printf("英語成績:");
scanf("%d",&p1->egrade);
printf("體育成績:");
scanf("%d",&p1->pgrade);
printf("語文成績:");
scanf("%d",&p1->lgrade);
p2=p1; //p2指向p1所在的地址
p2->next=NULL; //鏈表結束標志
n+=1; //n判斷是不是第一個資料
system("pause"); //等待命令
system("cls");
}
void print()
{
if(n!=0)
{
p=head; //p先指向開頭
system("cls");
printf("姓名\t性別\t\t班級\t年齡\t專業\tC語言成績 數學成績 英語成績 體育成績 語文成績 平均分\n");
do
{ p1->avg=(p1->cgrade+p1->mgrade+p1->egrade+p1->pgrade+p1->lgrade)/5;
printf("%-8s%-16s%-8s%-8d%-16s%-8d%-8d%-8d%-8d%-8d%5.2d\n",p->name,p->sex,p->Class,p->age,p->major,p->cgrade,p->mgrade,p->egrade,p->pgrade,p->lgrade,p->avg);
p=p->next; //p列印結束 把p指向next以判斷下一個區域有沒有內容
}while(p!=NULL);//只要p指向的記憶體區域有資料 就列印內容
}
else
printf("******您還沒有添加資料喲!\n");
system("pause");
system("cls");
}
void find() //查找
{
char a[20];
printf("請輸入要查找的姓名:");
scanf("%s",&a);
p=head;
do
{
if(strcmp(a,p->name)==0)
{ p1->avg=(p1->cgrade+p1->mgrade+p1->egrade+p1->pgrade+p1->lgrade)/5;
printf("\n資訊已被找到:\n姓名\t性別\t\t班級\t年齡\t專業\tC語言成績 數學成績 英語成績 體育成績 語文成績 平均分\n");
printf("%-8s%-16s%-8s%-8d%-16s%-8d%-8d%-8d%-8d%-8d%5.2d\n\n",p->name,p->sex,p->Class,p->age,p->major,p->cgrade,p->mgrade,p->egrade,p->pgrade,p->lgrade,p->avg);
}p=p->next; //指標指向下一個節點
}while(p!=NULL);
printf("******您還沒有添加資料喲!\n");
system("pause");
system("cls");
}
void Delete()
{
if(n!=0)
{
struct student *f,*l; //定義新的指標 f使用來指向要洗掉的資料用來釋放記憶體!
char a[20];
printf("請輸入要洗掉的姓名:");
scanf("%s",&a);
p=head;
if(strcmp(head->name,a)==0)
{f=head;head=head->next;free(f);}
else
{
do
{
if(strcmp(p->name,a)==0)
{f=p;l->next=p->next;free(f);break;}
l=p; //不滿足if表示這不是要洗掉的那一個節點,l暫時指向p 之后p再指向下一個節點,如果這個是要洗掉的節點那么l指向這個節點的next的地址
p=p->next;
}while(p!=NULL);
}
}
else
printf("******您還沒有添加資料喲!\n");
printf("資料已經被洗掉\n");
system("pause"); //等待命令
system("cls");
}
void amend()
{
if(n!=0)
{
int c;
char a[20];
printf("請輸入要修改的姓名:");
scanf("%s",&a);
p=head;
do
{
if(strcmp(a,p->name)==0)
{p1->avg=(p1->cgrade+p1->mgrade+p1->egrade+p1->pgrade+p1->lgrade)/5;
printf("\n被修改人資訊如下:\n姓名\t性別\t\t班級\t年齡\t專業\tC語言成績 數學成績 英語成績 體育成績 語文成績 平均分\n");
printf("%-8s%-16s%-8s%-8d%-16s%-8d%-8d%-8d%-8d%-8d%5.2d\n",p->name,p->sex,p->Class,p->age,p->major,p->cgrade,p->mgrade,p->egrade,p->pgrade,p->lgrade,p->avg);
break;
}
p=p->next; ////指標指向下一個節點
}while(p!=NULL);
printf("\n\n1.修改姓名\n2.修改性別\n3.修改班級\n4.修改年齡\n5.修改專業\n6.修改C語言成績\n7.修改數學成績\n8.修改英語成績\n9.修改體育成績\n10.修改語文成績\n11.退出修改\n\n");
scanf("%d",&c);
switch(c)
{
case 1:
printf("姓名修改為:");
scanf("%s",&p->name);break;
case 2:
printf("性別修改為:");
scanf("%s",&p->sex);break;
case 3:
printf("班級修改為:");
scanf("%s",&p->Class);break;
case 4:
printf("年齡修改為:");
scanf("%d",&p->age);break;
case 5:
printf("專業修改為:");
scanf("%s",&p->major);break;
case 6:
printf("C語言成績修改為:");
scanf("%d",&p->cgrade);break;
case 7:
printf("數學成績修改為:");
scanf("%d",&p->mgrade);break;
case 8:
printf("英語成績修改為:");
scanf("%d",&p->egrade);break;
case 9:
printf("體育成績修改為:");
scanf("%d",&p->pgrade);break;
case 10:
printf("語文成績修改為:");
scanf("%d",&p->lgrade);break;
case 11:
break;
}
printf("\n\n操作成功!\n\n");
}
else
printf("******您還沒有添加資料喲!\n");
system("pause");
system("cls");
}
void sort()
{
struct student *p; /*為原鏈表剩下用于直接插入排序的節點頭指標*/
struct student *t; /*臨時指標變數:插入節點*/
struct student *first; /*臨時指標變數*/
struct student *q; /*臨時指標變數*/
p=head->next;
head->next = NULL;
while (p!= NULL)
{
for (t=p,q=head;((q!=NULL)&&(q->avg<t->avg));first=q,q=q->next); /*無序節點在有序鏈表中找插入的位置*/
/*退出for回圈,就是找到了插入的位置*/
/*注意:按道理來說,這句話可以放到下面注釋了的那個位置也應該對的,但是就是不能。*/
p=p->next; /*無序鏈表中的節點離開,以便它插入到有序鏈表中。*/
if (q==head) /*插在第一個節點之前*/
{
head=t;
}
else /*p是first的前驅*/
{
p->next=t;
}
t->next=q; /*完成插入動作*/
/*first = first->next;*/
}while(t!=NULL);
printf("******您還沒有添加資料喲!\n");
system("pause");
system("cls");
}
void main() //主函式
{
int a=1;
while(a!=0)
{
system("cls");
printf("—————————* 學 生 成 績 管 理 系 統 *—————————\n");
printf("—————————* ( 1.輸入學生資訊 ) *—————————\n");
printf("—————————* ( 2.顯示全部資訊 ) *—————————\n");
printf("—————————* ( 3.查詢學生資訊 ) *—————————\n");
printf("—————————* ( 4.洗掉學生資訊 ) *—————————\n");
printf("—————————* ( 5.修改學生資訊 ) *—————————\n");
printf("—————————* ( 6.排序學生成績 ) *—————————\n");
printf("—————————* ( 0. 退出系統 ) *—————————\n");
printf("請選擇:");
scanf("%d",&a);
if(a>=0&&a<=9)
{
switch(a)
{
case 1:
add();
break;
case 2:
print();
break;
case 3:
find();
break;
case 4:
Delete();
break;
case 5:
amend();
break;
case 6:
sort();
break;
case 7:
break;
}
}
else
{
printf(" 您輸入的不符合要求,將回傳主選單!\n");
system("pause");
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/58994.html
標籤:數據庫及相關技術
上一篇:這是一個網上購書的購物車代碼的撰寫,我把C語言格式改成了C++格式不知道對不對,望好心人糾錯!在線等捉急!
下一篇:讀取Tek示波器波形超時的問題
