實驗一 線性表的操作(順序表) C語言 僅參考
阿新 • • 發佈:2019-02-08
要求:
定義一個包含學生資訊(學號,姓名,成績)的的順序表和連結串列,使其具有如下功能:
(1) 根據指定學生個數,逐個輸入學生資訊;
(2) 逐個顯示學生表中所有學生的相關資訊;
(3) 根據姓名進行查詢,返回此學生的學號和成績;
(4) 根據指定的位置可返回相應的學生資訊(學號,姓名,成績);
(5) 給定一個學生資訊,插入到表中指定的位置;
(6) 刪除指定位置的學生記錄;
(7) 統計表中學生個數。
#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 name[20];//姓名 char no[10];//學號 double score;//成績 }Student; typedef Student ElemType; typedef struct { ElemType *elem; //儲存空間的基地址 int length;//當前長度 }SqList; void input(ElemType *e)//輸入學生資訊 { printf("輸入學號\n"); scanf("%s",e->no); printf("輸入姓名\n"); scanf("%s",e->name); printf("輸入成績\n"); scanf("%lf",&e->score); } void output(ElemType *e)//輸出學生資訊 { printf("學號: %-10s, 姓名: %-20s, 成績: %-10.2lf\n\n", e->no, e->name, e->score); } Status InitList(SqList *L)//建立順序表 { L->elem=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);//為順序表分配一個大小為MAXSIZE的空間 if(!L->elem) exit(OVERFLOW); //儲存分配失敗 L->length=0; //空表長度為0 return OK; } int LocateElem(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(SqList *L,int i,ElemType e) //插入學生資訊 { int j; system("cls"); if(i<1||i>L->length+1)//插入位置不合法 { return ERROR; } 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; ++L->length;//長度加一 return OK; } Status ListDelete(SqList *L,int j,char *e)//刪除指定位置的學生資訊 { if(j!=L->length&&j>0) { strcpy(e,L->elem[j].name); for(;j<=L->length;j++) L->elem[j-1]=L->elem[j]; } else//位置不合法 return ERROR; --L->length;//長度減一 return OK; } int main() { int i,j,len,m,temp,a; char res[20]; ElemType e,b; SqList L; int n; printf("******第一次做 多包涵 謝謝******\n"); printf("******請選擇******\n");//功能選項 printf("1.建立順序表。\n"); printf("2.輸入資料。\n"); printf("3.輸出所有新生成績。\n"); printf("4.根據姓名查詢新生成績。\n"); printf("5.顯示指定位置學生資訊。\n"); printf("6.插入新生資料。\n"); printf("7.刪除新生資料。\n"); printf("8.統計資訊表中學生人數。\n"); printf("0.退出。\n"); n=-1; while(n!=0) { printf("請選擇功能編號:\n"); scanf("%d",&n); switch(n) { case 1: //建立順序表 if(InitList(&L)) printf("成功建立順序表\n\n"); else printf("建立順序表失敗\n\n"); break; case 2: //輸入學生資訊 printf("請輸入學生的數量(<100)\n"); scanf("%d",&len); for(i=0;i<len;i++) { printf("第%d個人:\n",i+1); input(&L.elem[i]); } L.length=len; putchar('\n'); break; case 3: //輸出所有學生資訊 for(i=0;i<L.length;i++) { output(&L.elem[i]); } putchar('\n'); break; case 4: //按名字查詢 printf("請輸入需要查詢的新生的姓名。\n"); scanf("%s",e.name); temp=LocateElem(&L,e); if(temp!=0) output(&L.elem[temp-1]); else printf("查詢失敗!沒有此學生資訊\n\n"); break; case 5: //按位置查詢 printf("請輸入需要查詢資料的位置。\n"); scanf("%d",&i); output(&L.elem[i-1]); break; case 6: //插入學生資訊 printf("請輸入一個數,代表插入的位置:\n"); scanf("%d",&a); printf("請輸入所要插入學生的資訊:\n"); printf("學號:"); scanf("%s",b.no); printf("姓名:"); scanf("%s",b.name); printf("成績:"); scanf("%lf",&b.score); if(ListInsert(&L,a,b)) printf("插入成功.\n\n"); else printf("插入失敗.\n\n"); break; case 7: //刪除學生資訊 printf("請輸入所要刪除的學生位置:"); scanf("%d",&m); if(ListDelete(&L,m,res)) printf("刪除成功.\n被刪除的學生姓名為:%s\n\n",res); else printf("刪除失敗.\n\n"); break; case 8: //統計學生總人數 printf("學生總人數為 %d\n",L.length); break; case 0:exit(0); //退出系統 } } return 0; }