0%

定义学生信息(学号,姓名,成绩)的顺序表和链表

大二第一次数据结构实验

-顺序表SqList

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define OK 1 
#define OVERFLOW -2 
#define MAXSIZE 100

typedef int Status;
//定义元素 
typedef struct{
    char name[20];
    char numb[10];
    double scroe;
}student;
typedef student ElemType;
//顺序表的创建 
typedef struct
{
    ElemType *elem; 
    int length;
}SqList;
//顺序表的初始化
Status InitList(SqList &L){
    L.elem = new ElemType[MAXSIZE];    
    if(!L.elem)    exit(OVERFLOW);
    L.length = 0;    
    return OK;
} 
//顺序表的查找
Status Search(SqList &L,char str[])
{
    for(int i=0 ; i<=L.length ; i++)
        if(strcmp(L.elem[i].name,str)==0)
           return  i+1;
    return 0;
}
//顺序表的取值
ElemType GetElem(SqList L,int i) 
{
    return L.elem[i-1];
}
//顺序表的插入
Status ListInsert(SqList &L,int i,ElemType e){
    int j;
    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 i){
    int j;
    if((i<1)||(i>L.length))    return ERROR;
    for(j=i;j<=L.length-1;j++)
        L.elem[j-1] = L.elem[j];
    --L.length;
    return OK;
} 
void Input(ElemType *e){
    printf("请输入学生的姓名:");
    scanf("%s",e->name);
    printf("请输入学生的学号:") ;
    scanf("%s",e->numb);
    printf("请输入学生的成绩:");
    scanf("%lf",&e->scroe);
    printf("输入完成\n\n");    
}
void Output(ElemType *e)
{
    printf("姓名:%s\n学号:%s\n成绩:%.2lf\n\n",e->name,e->numb,e->scroe);
}

int main(){
    SqList L;
    ElemType a,b,e,c,d;
    int n,x,s,m,h,isDel;
    char str[20];

    do{     
        puts("                    *******************************"); 
        puts("");
        puts("                    选项1:构造线性表,录入学生信息");
        puts("                    选项2: 显示所有学生信息");
        puts("                    选项3:根据姓名进行查找学生信息");
        puts("                    选项4:根据指定的位置返回学生信息");
        puts("                    选项5:把学生插入到表中指定的位置");
        puts("                    选项6:删除指定位置的学生记录");
        puts("                    选项7:统计表中学生个数");
        puts("                    选项0:退出");
        puts("");
        puts("                    *******************************"); 
        printf("请输入选项前的数字:");
        scanf("%d",&n);
        puts("");
        switch(n){
            case 0:break;

            case 1:
                if(InitList(L))
                    printf("成功建立顺序表\n\n");
                else
                    printf("顺序表建立失败\n\n");
                printf("请输入要录入学生的人数:");
                scanf("%d",&x);
                for(int i=0;i<x;i++)
                    {
                        printf("第%d个学生:\n",i+1);
                        Input(&L.elem[i]);
                    }
                    L.length=x;
                    puts("");
                    break;
            case 2:
                printf("全部学生信息:\n\n"); 
                for(int i=1;i<=L.length;i++)
                    {
                        a=GetElem(L,i);
                        Output(&a);
                    }
                    break;
            case 3:
                printf("请输入姓名:");
                scanf("%s",str);
                Search(L,str);
                if(Search(L,str))
                    Output(&L.elem[Search(L,str)-1]);
                else
                    puts("对不起,查无此人");
                puts("");
                break;
            case 4:
                printf("请输入位置:");
                scanf("%d",&s);
                b=GetElem(L,s);
                Output(&b);
                break;
            case 5:
                printf("请输入要插入的位置:");
                scanf("%d",&m);
                Input(&c);
                if(ListInsert(L,m,c)){
                    printf("插入成功!查看全部学生请输入2");
                    break;
                }
                else{
                    printf("插入失败\n");
                }
                break;
            case 6:    
                printf("请输入要删除学生信息的位置");
                scanf("%d",&h);
                printf("被删除学生的信息为\n");
                Output(&L.elem[h-1]);
                puts("确认是否永久删除,(1表示是,0表示撤销)请输入:");
                scanf("%d",&isDel);
                if(isDel){
                    if(ListDelete(L,h))
                        printf("删除成功!\n"); 
                    else
                        printf("删除失败!\n");
                }
                else if(!isDel)
                    printf("撤销成功!");
                break;
            case 7:
                printf("当前信息系统共有%d名学生!",L.length);                                             
        }
    }while(n);
    return 0;
}