資料結構-學生成績管理系統
阿新 • • 發佈:2019-02-10
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; struct student { int id; // 學號 char name[30]; // 姓名 char sex[2]; // 性別 float gread; // 成績 }; typedef struct student DataType; // 指定struct student為DataType struct SeqList { int MAX; // 順序表中最大元素的個數 int count; // 存放線性表中元素的個數count <= MAXLENGTH DataType* element; // element[0], element[1], ..., element[n - 1]存放線性表中的元素 }; typedef struct SeqList *MySeqList; // 初始化並建立空順序表 MySeqList initSeqList(int m); // 判斷線性表是否為空 int isEmptySeqList(MySeqList mySeqList); // 在順序表中求某元素的下標 int locateSeqList(MySeqList mySeqList, int id); // 在順序表中修改值 int updateSeqList(MySeqList mySeqList, int id); // 順序表的插入(元素p之前插入) int insertPreSeqList(MySeqList mySeqList, int p, DataType x); // 順序表的插入(元素p之後插入) int insertNextSeqList(MySeqList mySeqList, int p, DataType x); // 順序表的刪除(根據下標刪除) int deleteSeqList(MySeqList mySeqList, int p); // 順序表的刪除(根據元素值刪除) int deleteSeqListByValue(MySeqList mySeqList, int id); // 將順序表表示的線性表逆置 int reverseSeqList(MySeqList mySeqList); int deleteAllVSeqList(MySeqList mySeqList, DataType x); // 求出下標為i的元素的前驅和後繼 int findPrePostSeqList(MySeqList mySeqList, int i, DataType &m, DataType &n); // 順序表實現部分:找出值為x的元素的前驅和後繼的儲存位置(即下標) int locatePrePostSeqList(MySeqList mySeqList, DataType x, int &i, int &j); // 輸出線性表的元素值 void printSeqList(MySeqList &mySeqList); // 根據學生id,輸出線性表的元素值 void printSeqListById(MySeqList &mySeqList,int id); // 在順序表中修改值 int updateSeqList(MySeqList mySeqList, int id) //學生資訊登入 { int iRc = locateSeqList(mySeqList, id); if (iRc == -1) { printf("不存在指定下標!\n"); return (0); } cout<<"學號 姓名 性別 成績 "<<endl; cin>>mySeqList->element[iRc].id>>mySeqList->element[iRc].name>>mySeqList->element[iRc].sex>>mySeqList->element[iRc].gread; return 1; }
// 功能: 建立空順序表 MySeqList initSeqList(int m) { MySeqList mySeqList = (MySeqList)malloc(sizeof(struct SeqList)); // 分配記憶體空間 if (mySeqList != NULL) { mySeqList->element = (DataType*)malloc(sizeof(DataType) * m); // 為裡面的元素分配m個DataType大小的記憶體空間,相當於初始化了一個長度為m的陣列 if (mySeqList->element) { mySeqList->MAX = m; // 如果建立了元素,MAXLENGTH為最大元素的個數 mySeqList->count = 0; // 空表長度為0 return (mySeqList); } else free(mySeqList); // 記得要手動釋放空間,否則很容易產生記憶體洩漏 } printf("記憶體空間不足,請關閉一些程式,然後再試!\n"); // 儲存分配失敗,提示空間不足 return NULL; } // 功能: 判斷線性表是否為空 int isEmptySeqList(MySeqList mySeqList) { return (mySeqList->count ==0); } // 功能:在順序表中求某元素的下標,沒有查詢到,則返回-1 int locateSeqList(MySeqList mySeqList, int id) { for (int i = 0; i < mySeqList->count; ++i) if (mySeqList->element[i].id == id) // 傳入一個元素x,查詢到後返回下標i return (i); return (-1); } // 功能:順序表的pos下標前面插入,插入成功返回1,失敗返回0 int insertPreSeqList(MySeqList mySeqList, int pos, DataType x) { ++mySeqList->count; if (mySeqList->count > mySeqList->MAX) // 溢位 { --mySeqList->count; printf("表產生了溢位!\n"); return (0); } if (pos < 0 || pos >= mySeqList->count) // 不存在下標為pos的元素 { --mySeqList->count; printf("不存在指定下標!\n"); return (0); } for (int i = mySeqList->count - 1; i != pos; --i) {mySeqList->element[i] = mySeqList->element[i - 1]; // 插入位置及之後的元素均後移一個位置 mySeqList->element[i] = x; // 插入元素x return (1); } } // 功能:順序表的pos下標後面插入,插入成功返回1,失敗返回0 int insertNextSeqList(MySeqList mySeqList, int pos, DataType x) { if (pos < 0 || pos >= mySeqList->count) { printf("不存在指定下標!\n"); return (0); } ++mySeqList->count; if (mySeqList->count >= mySeqList->MAX) { --mySeqList->count; printf("表產生了溢位!\n"); return (0); } for (int i = mySeqList->count - 1; i != pos + 1; --i) {mySeqList->element[i] = mySeqList->element[i - 1]; // 同樣地,把pos+1插入位置及之後的元素均後移一個位置 mySeqList->element[i] = x; // 插入元素x return (1); } }
// 功能:順序表的刪除(根據下標刪除) int deleteSeqList(MySeqList mySeqList, int pos) { if (pos < 0 || pos >= mySeqList->count) // 不存在下標為pos的元素,注意下標範圍是從0到count-1 { printf("不存在指定下標!\n"); return (0); } for (int i = pos; i < mySeqList->count - 1; ++i) mySeqList->element[i] = mySeqList->element[i + 1]; // 被刪除元素之後的元素均前移一個位置 --mySeqList->count; // 元素個數減1 return (1); } // 功能:根據元素值刪除,實現順序表的刪除 int deleteSeqListByValue(MySeqList mySeqList, int id) { int pos = locateSeqList(mySeqList, id); if (pos == -1) { printf("不存在指定下標!\n"); return (0); } deleteSeqList(mySeqList, pos); return (1); } int deleteAllSeqListByValue(MySeqList mySeqList, int x) { if (mySeqList->count == 0) { printf("該表為空!\n"); return (0); } for (int i = 0; i != mySeqList->count; ++i) { if (mySeqList->element[i].id == x ) { deleteSeqListByValue(mySeqList,x); // 刪除x,刪除後要將下標減少1 i--; } } return (1); } int deleteAllVSeqList(MySeqList mySeqList, int x) { if (mySeqList->count == 0) { printf("該表為空!\n"); return (0); } int p = 0, q = 0; while (mySeqList->element[p].id != x && p != mySeqList->count - 1) // 跳過開始不是x的元素 { ++p; ++q; } for (; p != mySeqList->count - 1; ++p) // 遍歷元素,不遍歷最後一個元素(為了防止越界) { while (mySeqList->element[p].id == x && p != mySeqList->count - 1) // 如果元素是x,則遊標p後移(用while處理多個x連續的情況) { ++p; } if (p != mySeqList->count - 1) { mySeqList->element[q] = mySeqList->element[p]; ++q; } } if (mySeqList->element[mySeqList->count - 1].id != x) { mySeqList->element[q] = mySeqList->element[mySeqList->count - 1]; ++q; } mySeqList->count = q; return (1); } // 功能:找出值為x的元素的前驅和後繼的儲存位置(即下標) int locatePrePostSeqList(MySeqList mySeqList, int x, int &i, int &j) { int k = locateSeqList(mySeqList, x); if (k == -1) return (0); if (k == 0) i = -1; else i = k - 1; if (k == mySeqList->count - 1) j = -1; else j = k + 1; return (1); } // 輸出線性表的元素值 void printSeqList(MySeqList &mySeqList) { for (int i = 0; i < mySeqList->count; ++i) // 輸出線性表的元素值 { cout<< "學號:" << mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性別:" << mySeqList->element[i].sex ; cout<< "成績:" << mySeqList->element[i].gread; cout<<endl; } cout << endl; }
// 根據學生id,輸出線性表的元素值
void printSeqListById(MySeqList &mySeqList,int id)
{
for (int i = 0; i < mySeqList->count; ++i) // 輸出線性表的元素值
{
if (id == mySeqList->element[i].id)
{
cout<< "學號:" << mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性別:" << mySeqList->element[i].sex ;
cout<< "成績:" << mySeqList->element[i].gread;
cout<<endl;
break;
}
}
}
int main(int argc, char* argv[])
{
MySeqList mySeqList = initSeqList(20); // 初始化一個長20的表
L:
system("cls");
cout<< " ☆☆☆☆☆ ""學生成績管理系統"" ☆☆☆☆☆☆☆☆ "<<endl;
cout<<endl;
cout<< "1.☆☆☆☆☆新增學生資訊☆☆☆☆☆" <<endl;
cout<< "2.☆☆☆☆☆查詢學生資訊☆☆☆☆☆" <<endl;
cout<< "3.☆☆☆☆☆刪除學生資訊☆☆☆☆☆" <<endl;
cout<< "4.☆☆☆☆☆修改學生資訊☆☆☆☆☆" <<endl;
cout<< "5.☆☆☆☆☆退出學生系統☆☆☆☆☆" <<endl;
int i;
cout<< "請選擇一個操作(1-5):";
cin>>i;
if (i == 1)
{
mySeqList->count = 1;
int iRc = 0;
while(true&&mySeqList->count<20)
{
cout<<endl<<"請新增學生資訊(輸入*退出新增):"<<endl;
cout<<"姓名:";
cin>>mySeqList->element[iRc].name;
if (strcmp(mySeqList->element[iRc].name,"*") == 0)
{
mySeqList->count--;
goto L;
}
cout<<"學號: ";
cin>>mySeqList->element[iRc].id;
cout<<"性別: ";
cin>>mySeqList->element[iRc].sex;
cout<<"成績: ";
cin>>mySeqList->element[iRc].gread;
cout << "成功新增學生成績資訊成績。"<<endl;
printSeqList(mySeqList);
mySeqList->count++;
iRc++;
}
}
else if (i == 2)
{
L4:
cout<<"請輸入要查詢的學生學號:"<<endl;
int sid;
cin>>sid;
if (locateSeqList(mySeqList,sid) != -1)
{
cout<<"成功查詢學號為"<<sid<<"的學生成績。"<<endl;
printSeqListById(mySeqList,sid);
}
else
{
cout<<"查詢學生成績錯誤,可能不存在學號為"<<sid<<"的學生."<<endl;
}
int iopselect;
cout<<endl<<"還要繼續查詢嗎?(按0返回主選單,否則繼續此操作。)"<<endl;
cin>>iopselect;
if (iopselect == 0)
goto L ;
else
goto L4;
}
else if (i == 3)
{
L1:
cout<<"請輸入要刪除的學生學號:"<<endl;
int stu_id;
cin>>stu_id;
if (deleteSeqListByValue(mySeqList,stu_id) == 1)
cout<<"成功刪除學生成績。"<<endl;
else
cout<<"刪除學生成績出錯。"<<endl;
printSeqList(mySeqList);
int iop;
cout<<endl<<"還要繼續刪除嗎?(按0返回主選單,否則繼續此操作。)"<<endl;
cin>>iop;
if (iop == 0)
goto L ;
else
goto L1;
}
else if (i == 4)
{
L3:
cout<<"請輸入要修改的學生學號:"<<endl;
int id;
cin>>id;
if(updateSeqList(mySeqList,id) ==1)
cout << "成功修改學生成績資訊成績。"<<endl;
else
cout << "修改學生成績資訊成績出錯。"<<endl;
printSeqList(mySeqList);
int iselect;
cout<<endl<<"還要繼續修改嗎?(按0返回主選單,否則繼續此操作。)"<<endl;
cin>>iselect;
if (iselect == 0)
goto L ;
else
goto L3;
}
else if (i == 5)
{
system("cls");
cout<<"您已經出本系統,歡迎下次再使用."<<endl;
}
return 0;
}
執行結果: