1. 程式人生 > >實驗一 線性表的操作(順序表) C語言 僅參考

實驗一 線性表的操作(順序表) C語言 僅參考

要求:

定義一個包含學生資訊(學號,姓名,成績)的的順序表和連結串列,使其具有如下功能:

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