學生資訊管理系統--Sqlist-順序表
阿新 • • 發佈:2019-02-19
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; //Status 是函式返回值型別,其值是函式結果狀態程式碼。 #define MAXSIZE 100 //順序表可能達到的最大長度 typedef struct{ char no[8]; char name[20]; int price; } student; typedef student ElemType; typedef struct{ ElemType *elem; //儲存空間的基地址 int length; //當前長度 }SqList; void input(ElemType *e) { printf("學號:"); scanf("%s",e->no); printf("姓名:"); scanf("%s",e->name); printf("成績<100:"); scanf("%d",&e->price); printf("***OK***\n\n"); } void output(ElemType *e) { printf("學號:%-10s 姓名:%-10s 成績:%-10d\n\n", e->no, e->name, e->price); } Status InitList_Sq(SqList *L){ // 順序表的初始化 //構造一個空的順序表L L->elem=malloc(sizeof(ElemType)*MAXSIZE); //為順序表分配一個大小為MAXSIZE的陣列空間 if(!L->elem) exit(OVERFLOW); //儲存分配失敗 L->length=0; //空表長度為0 return OK; } /*Status InitList(SqList &L) { L.elem=new ElemType[MAXSIZE]; if(!L.elem) exit(OVERFLOW); L.length=0; return OK; }*/ int LocateElem_Sq(SqList *L,ElemType e){ //順序表的查詢 //順序表的查詢 int i; for(i=0;i<L->length;i++) if(!strcmp(L->elem[i].name,e.name)) return i+1; return 0; } Status ListInsert_Sq(SqList *L,int i,ElemType e){ // 順序表的插入 //在順序表L中第i個位置之前插入新的元素e //i值的合法範圍是1<=i<=L.length+1 int j; if(i<1 || i>L->length+1) return ERROR; //i值不合法 if(L->length==MAXSIZE) return ERROR; //當前儲存空間已滿 for(j=L->length-1;j>=i-1;j--) L->elem[j+1]=L->elem[j]; //插入位置及之後的元素後移 L->elem[i-1]=e; //將新元素e放入第i個位置 ++L->length; //表長增1 return OK; } Status ListDelete_Sq(SqList *L,char *i,char *e){ //演算法2.4 順序表的刪除 int j=0; while(j<L->length && strcmp(L->elem[j].no,i)) j++; if (j!=L->length) {strcpy(e,L->elem[j].name); for(;j<=L->length;j++) L->elem[j]=L->elem[j+1]; } else return ERROR; --L->length; //表長減1 return OK; } void menu() { printf(" ********電腦科學與技術*********** \n\n"); printf(" 學生資訊管理系統 \n\n"); printf("主選單:\n"); printf(" 1.建立順序表 ");printf("2.輸入學生資訊\n"); printf(" 3.查詢 ");printf("4.插入\n"); printf(" 5.刪除 ");printf("6.輸出學生資訊\n"); printf(" 7.退出\n\n"); } int main() { SqList L; int i,temp,a,choose,x; ElemType b,e; char res[20],c[10]; menu(); choose=-1; while(choose!=7) { printf("請選擇:"); scanf("%d",&choose); switch(choose) { case 1: if(InitList_Sq(&L)) //建立順序表 printf("成功建立順序表\n\n"); else printf("順序表建立失敗\n\n"); break; case 2: printf("請輸入學生數量<100:"); scanf("%d",&x); for(i=0;i<x;i++) { printf("第%d位:\n",i+1); input(&L.elem[i]);} L.length=x; putchar('\n'); break; case 3: //順序表的查詢 printf("請輸入所要查詢的學生姓名:"); scanf("%s",e.name); temp=LocateElem_Sq(&L,e); if(temp!=0) { printf("%s是第%d位同學.\n\n",e.name,temp); printf("該學生資訊如下:\n"); output(&L.elem[temp-1]); } else printf("查詢失敗!沒有此同學,檢查是否輸入正確\n\n"); break; case 4: //順序表的插入 printf("請輸入一個數,代表插入的位置:"); scanf("%d",&a); printf("請輸入所要插入學生的資訊:\n"); printf("學號:"); scanf("%s",b.no); printf("姓名:"); scanf("%s",b.name); printf("成績:"); scanf("%d",&b.price); if(ListInsert_Sq(&L,a,b)) printf("插入成功.\n\n"); else printf("I插入失敗.\n\n"); break; case 5: //順序表的刪除 printf("請輸入所要刪除的學生學號:"); scanf("%s",c); if(ListDelete_Sq(&L,c,res)) printf("刪除成功.\n被刪除的學生是:%s\n\n",res); else printf("刪除失敗.\n\n"); break; case 6: //順序表的輸出 printf("當前學生總人數為:%d\n",L.length); printf("當前順序表為:\n"); for(i=0;i<L.length;i++) output(&L.elem[i]); printf("\n"); break; case 7: printf("********************************END************************************\n"); break; } } return 0; }