1. 程式人生 > >資料結構-學生成績管理系統

資料結構-學生成績管理系統

#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;
}

執行結果: