用鏈表來排序在網上看了好久看不懂。
我自己跟著視頻寫的:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define M 100
#define N 1000
//定義一個學生的資訊
typedef struct _Student
{
char name[20]; //姓名
int studid;//學號
int math; //數學成績
int english; //英語成績
int c; //C語言成績
int pe; //體育成績
int total; //總成績
}Student;
struct _Student x;
//定義一個節點
typedef struct _Node
{
Student stu;
struct _Node* pNext;
}Node;
Node*g_pHead=NULL; //頭結點
char password[20]="4396"; //管理員密碼
void Menu();//宣告選單界面函式
void Input();//宣告成績錄入函式
void Print();//宣告成績顯示函式
void Save();//宣告成績保存函式
void Order();//宣告成績排序函式
void Modify();//宣告成績修改函式
void Sta();//宣告成績統計函式
int main(){
int a;
while(1){ //while回圈使程式持續運行
Menu();
scanf("%d",&a);
switch(a)//**用戶進行選擇**//
{
case 1:
Input(); //成績錄入
break;
case 2:
Print();//成績顯示
break;
case 3:
Save();//成績保存
break;
case 4:
Order();//成績排序
break;
case 5:
Modify();//成績修改
break;
case 6:
printf("成績統計\n");
break;
case 7:
printf("您已成功退出系統,歡迎下次使用!\n");
return 0;
default:
printf("無效選擇,請重新輸入\n");
break;
}
}
return 0;
}
void Menu()//選單界面函式
{
printf("\t\t\t歡迎使用學生班級成績管理系統!\n");
printf("\t\t=============================================\n");
printf("\t\t==\t 主選單 ==\n");
printf("\t\t=============================================\n");
printf("\t\t==\t\t1.成績錄入 ==\n");
printf("\t\t==\t\t2.成績顯示 ==\n");
printf("\t\t==\t\t3.成績保存 ==\n");
printf("\t\t==\t\t4.成績排序 ==\n");
printf("\t\t==\t\t5.成績修改 ==\n");
printf("\t\t==\t\t6.成績統計 ==\n");
printf("\t\t==\t\t7.系統退出 ==\n");
printf("\t\t=============================================\n");
printf("\t\t===========請選擇相應的功能串列==============\n");
}
void Input()//成績錄入函式
{
Node* pNewNode =(Node*)malloc(sizeof(Node));
pNewNode->pNext=NULL;
if(g_pHead==NULL)
{
g_pHead=pNewNode;
}
else
{
pNewNode->pNext=g_pHead;
g_pHead=pNewNode;
}
printf("請輸入學生的姓名:\n");
scanf("%s",pNewNode->stu.name);
printf("請輸入學生的學號:\n");
scanf("%d",&pNewNode->stu.studid);
printf("請輸入學生的數學成績:\n");
scanf("%d",&pNewNode->stu.math);
printf("請輸入學生的英語成績:\n");
scanf("%d",&pNewNode->stu.english);
printf("請輸入學生的C語言成績:\n");
scanf("%d",&pNewNode->stu.c);
printf("請輸入學生的體育成績:\n");
scanf("%d",&pNewNode->stu.pe);
pNewNode->stu.total=pNewNode->stu.math+pNewNode->stu.english+pNewNode->stu.c+pNewNode->stu.pe; //總成績
printf("學生成績錄入成功!\n");
system("pause"); //暫停執行
system("cls"); //清屏
}
void Print()//成績顯示函式
{
system("cls");
printf(" 學生成績表 \n");
printf("========================================================\n");
printf("姓名\t學號\t數學\t英語\tC語言\t 體育\t 總成績\n");
//遍歷鏈表,一次列印出學生的成績
Node* p=g_pHead;
while(p!=NULL)
{
printf("%s %d %d %d %d %d %d\n",
p->stu.name,p->stu.studid,p->stu.math,p->stu.english,p->stu.c,p->stu.pe,p->stu.total);
p=p->pNext;//指向下一個,少了這個會無限回圈
}
system("pause");
}
void Save()//成績保存函式
{ //打開檔案
FILE* fp=fopen("StuInformation.data","w");
if(fp==NULL)
{
printf("檔案打開失敗.\n");
return;
}
//再次遍歷鏈表,保存學生的成績
Node* p=g_pHead;
while(p!=NULL)
{
fwrite(&p->stu,1,sizeof(Student),fp);
p=p->pNext;
}
//關閉檔案
fclose(fp);
printf("\n學生成績保存成功!");
system("cls");
system("fause");
}
void Order()//成績排序函式
{
struct _Student stu[N];
int b,i,j;
system("cls");
printf("請選擇你想要排序的科目:1.數學 2.英語 3.C語言 4.體育 5.總成績\n");
scanf("%d",&b);
switch(b)
{
case 1:for(i=0;i<=M;i++)//數學成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].math>stu[i].math)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
for(;j<=M;j--)
{
printf("%d",stu[j].math);
}
break;
case 2:for(i=0;i<=M;i++)//英語成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].english>stu[i].english)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 3:for(i=0;i<=M;i++)//C語言成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].c>stu[i].c)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 4:for(i=0;i<=M;i++)//體育成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].pe>stu[i].pe)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 5:for(i=0;i<=M;i++)//總成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].total>stu[i].total)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
default: printf("無效操作,請重新輸入.");
}
}
void Modify()//成績修改函式
{
int studid,c;
char d[20];
printf("請輸入管理員密碼:");
scanf("%s",d);
if(strcmp(password,d)==0)
{
printf("管理員登陸成功.\n");
printf("請輸入學生的學號:\n");
scanf("%d",&studid);
Node* p=g_pHead;
while(p!=NULL)
{
if(p->stu.studid==studid)
{
printf("請輸入要修改成績的科目:1.數學 2.英語 3.C語言 4.體育\n");
scanf("%d",&c);
printf("請輸入你要改的分數:\n");
switch(c)
{
case 1:
scanf("%d",&p->stu.math);
break;
case 2:
scanf("%d",&p->stu.english);
break;
case 3:
scanf("%d",&p->stu.c);
break;
case 4:
scanf("%d",&p->stu.math);
break;
}
system("cls");
printf("成績修改成功\n");
system("pause");
break;
}
p=p->pNext;
}
if(p==NULL)
{
printf("沒有找到該學生的資訊.\n");
system("pause");
system("cls");
}
}
while(strcmp(password,d)!=0)
{
system("cls");
printf("密碼錯誤,回傳主選單\n");
system("pause");
break;
}
}
uj5u.com熱心網友回復:
static int score_cmp(int s1, int s2)
{
if (s1 > s2)
return 1;
else if (s1 == s2)
return 0;
else
return -1;
}
void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt)
{
struct _Student stu;
Node *p, *q;
int flag = 0;
if (!phead)
return;
p = q = phead;
for (;p;p = p->pNext)
for (;q;q = q->pNext) {
flag = 0;
switch (opt) {
case 1:
if (pcmp(p->stu.math, q->stu.math) > 0)
flag = 1;
break;
case 2:
if (pcmp(p->stu.english, q->stu.english) > 0)
flag = 1;
break;
case 3:
if (pcmp(p->stu.c, q->stu.c) > 0)
flag = 1;
break;
case 4:
if (pcmp(p->stu.pe, q->stu.pe) > 0)
flag = 1;
break;
case 5:
if (pcmp(p->stu.total, q->stu.total) > 0)
flag = 1;
break;
}
if (flag) {
stu = p->stu;
p->stu = q->stu;
q->stu = stu;
}
}
}
void Order()//成績排序函式
{
struct _Student stu[N];
int b,i,j;
system("cls");
printf("請選擇你想要排序的科目:1.數學 2.英語 3.C語言 4.體育 5.總成績\n");
scanf("%d",&b);
bubble_sort(g_pHead, score_cmp, b);
/*
switch(b)
{
case 1:for(i=0;i<=M;i++)//數學成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].math>stu[i].math)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
for(;j<=M;j--)
{
printf("%d",stu[j].math);
}
break;
case 2:for(i=0;i<=M;i++)//英語成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].english>stu[i].english)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 3:for(i=0;i<=M;i++)//C語言成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].c>stu[i].c)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 4:for(i=0;i<=M;i++)//體育成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].pe>stu[i].pe)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 5:for(i=0;i<=M;i++)//總成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].total>stu[i].total)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
default: printf("無效操作,請重新輸入.");
}
*/
}
排序邏輯,供參考~
uj5u.com熱心網友回復:
沒測驗,建議用這個代碼試一下,之前寫過類似的,測驗過沒問題。先試試吧,這個有問題可以繼續提問~
uj5u.com熱心網友回復:
請問如果排序完要按順序輸入該怎么寫
uj5u.com熱心網友回復:
static int score_cmp(int s1, int s2)
{
if (s1 > s2)
return 1;
else if (s1 == s2)
return 0;
else
return -1;
}
void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt)
{
struct _Student stu;
Node *p, *q;
int flag = 0;
if (!phead)
return;
p = q = phead;
for (;p;p = p->pNext)
for (;q;q = q->pNext) {
flag = 0;
switch (opt) {
case 1:
if (pcmp(p->stu.math, q->stu.math) > 0)
flag = 1;
break;
case 2:
if (pcmp(p->stu.english, q->stu.english) > 0)
flag = 1;
break;
case 3:
if (pcmp(p->stu.c, q->stu.c) > 0)
flag = 1;
break;
case 4:
if (pcmp(p->stu.pe, q->stu.pe) > 0)
flag = 1;
break;
case 5:
if (pcmp(p->stu.total, q->stu.total) > 0)
flag = 1;
break;
}
if (flag) {
stu = p->stu;
p->stu = q->stu;
q->stu = stu;
}
}
}
void Order()//成績排序函式
{
struct _Student stu[N];
int b,i,j;
system("cls");
printf("請選擇你想要排序的科目:1.數學 2.英語 3.C語言 4.體育 5.總成績\n");
scanf("%d",&b);
bubble_sort(g_pHead, score_cmp, b);
/*
switch(b)
{
case 1:for(i=0;i<=M;i++)//數學成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].math>stu[i].math)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
for(;j<=M;j--)
{
printf("%d",stu[j].math);
}
break;
case 2:for(i=0;i<=M;i++)//英語成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].english>stu[i].english)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 3:for(i=0;i<=M;i++)//C語言成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].c>stu[i].c)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 4:for(i=0;i<=M;i++)//體育成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].pe>stu[i].pe)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
case 5:for(i=0;i<=M;i++)//總成績排序
{
for(j=i+1;j<=M;j++)
{
if(stu[j].total>stu[i].total)
{
x=stu[j];
stu[j]=stu[i];
stu[i]=x;
}
}
}
break;
default: printf("無效操作,請重新輸入.");
}
*/
}
排序邏輯,供參考~
沒測驗,建議用這個代碼試一下,之前寫過類似的,測驗過沒問題。先試試吧,這個有問題可以繼續提問~
請問如果排序完要按順序輸入該怎么寫
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/268521.html
標籤:C語言
上一篇:球球各位大神看看吧!為什么while(p21)里面的回圈執行不了
下一篇:不知道為什么運行不出結果?
