数据结构-线性表的顺序存储实现及应用

线性表的顺序存储实现及应用

实验目的

  1. 掌握抽象数据类型ADT的定义、表示和实现。
  2. 掌握线性表的基本结构和操作方法。
  3. 培养学生灵活使用数据结构解决实际问题的能力。

实验内容

采用顺序表方案实现一个简易的学生信息管理系统。其中,学生信息包括学号、姓名、性别、年龄、专业。该管理系统能提供建立、查询、删除和增加学生信息等功能。要求:

  1. 根据所学知识,为待加工的数据定义恰当的“学生”数据类型。
  2. 利用顺序表各个基本操作的框架来实现管理系统中的各个功能。
  3. 初始学生信息可以选择从键盘录入或者从文件中读取,待管理系统操作完毕后将最新的学生信息全部写入文件中保存。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//*******数据类型定义*******

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
struct Student
{
    int no;            //学号
    char name[10];     //姓名
    char sex;          //性别
    int age;           //年龄
    char major[12];    //专业
};
typedef struct Student ElemType;
typedef struct
{
    ElemType *data;
    int length;
    int listsize;
}SeqList;        //学生顺序表类型
int studentnumber=0;

//*******基本操作定义*******

void InitList_Seq(SeqList &L);    //顺序表初始化
void CreatList_Seq(SeqList &L,ElemType a[],int n);     //建立长度为n的顺序表
void Show_Seq(SeqList L);    //显示顺序表信息
int LocateElem_Seq(SeqList L, int e);    //按值e查询顺序表

//void Copy_Stu(ElemType &tar_stu, ElemType src_stu);        //学生信息拷贝操作

//*******功能操作定义*******

void Create(SeqList &L);    //建立学生表
void Locate(SeqList L);    //查询学生
void Insert(SeqList &L);    //增加学生
void Delete(SeqList &L);    //删除学生
void Save(SeqList L);        //存储信息



//*******基本操作实现*******

void InitList_Seq(SeqList &L)     //顺序表初始化
{
    L.data = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if(!L.data) exit(0);
    L.length = 0;                //顺序表中当前所含元素个数为 0
    L.listsize = LIST_INIT_SIZE;
}

void CreatList_Seq(SeqList &L,ElemType a[],int n) //建立长度为n的顺序表
{
    InitList_Seq(L);
    //完备性考虑,在创建之前,还应该判断n与L.listsize的大小关系
    if(n>L.listsize){
        printf("输入错误\n");
        exit(0);
    }
    
    for(int i = 0; i < n; i++)
    {
        L.data[L.length]= a[i];
        L.length++;
    }
}

void Show_Seq(SeqList L){
    printf("学号\t姓名\t性别\t年龄\t专业\n");
    for(int i=0;i<L.length;i++){
        printf("%d\t%s\t%c\t%d\t%s\n",L.data[i].no,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].major);
    }
}

int LocateElem_Seq(SeqList L, int e){
    int result=0;
    for(int i=0;i<LIST_INIT_SIZE;i++){
        if(L.data[i].no==e){
            result=e;
            break;
        }
    }
    return result;
}


//*******功能操作实现*******

void Create(SeqList &L){
    InitList_Seq(L);
    FILE * input;
    input=fopen("StudentInformation.txt","r");
    int i=0;
    while(!feof(input)){
        fscanf(input,"%d\t%s\t%c\t%d\t%s\n",&L.data[i].no,L.data[i].name,&L.data[i].sex,&L.data[i].age,L.data[i].major);
        i++;
    }
}

void Locate(SeqList L)        //查询学生
{
    int no;
    printf("请输入需查询学生的学号:");
    scanf("%d", &no);
    int index = LocateElem_Seq(L, no);
    
    if(index == 0)
        printf("没有此学号的学生\n");
    else
    {
        printf("该学生信息如下:\n");
        printf("学号\t姓名\t性别\t年龄\t专业\n");
        printf("%d\t%s\t%c\t%d\t%s\n", L.data[index-1].no, L.data[index-1].name, L.data[index-1].sex, L.data[index-1].age, L.data[index-1].major);
    }
    
}

void Insert(SeqList &L){       //增加学生
    while(1){
        printf("请输入学号:");
        scanf("%d\n",&L.data[studentnumber].no);
        printf("请输入姓名:");
        scanf("%s\n",L.data[studentnumber].name);
        printf("请输入性别:");
        scanf("%c\n",&L.data[studentnumber].sex);
        printf("请输入年龄:");
        scanf("%d\n",&L.data[studentnumber].age);
        printf("请输入专业:");
        scanf("%s\n",L.data[studentnumber].major);
        int flag=0;
        for(int i=0;i<studentnumber;i++){
            if(L.data[i].no==L.data[studentnumber].no){
                printf("输入重复,请重新输入\n");
                printf("**********************\n");
                flag=1;
            }
        }
        if(flag==0){
            printf("添加成功");
            break;
        }
    }
    studentnumber++;
}

void Delete(SeqList &L){           //删除学生
    int a;
    char b;
    printf("请输入学号:");
    scanf("%d\n",&a);
    for(int k=0;k<studentnumber;k++){
        if(a==L.data[k].no){
            printf("是否删除?(y或n)");
            scanf("%c\n",&b);
            if(b=='n'){
                printf("取消删除");
                break;
            }else{
                for(int i=k;i<studentnumber;i++){
                    L.data[k].no=L.data[k+1].no;
                    strcpy(L.data[k].name,L.data[k+1].name);
                    L.data[k].sex=L.data[k+1].sex;
                    L.data[k].age=L.data[k+1].age;
                    strcpy(L.data[k].major,L.data[k+1].major);
                }
                printf("删除成功\n");
                studentnumber--;
            }
        }else{
            printf("查无此人\n");
            break;
        }
    }
}

void Save(SeqList L){
    FILE * output;
    output=fopen("StudentInformation.txt","w");
    for(int i=0;i<L.length;i++){
        fprintf(output,"%d\t%s\t%c\t%d\t%s\n",L.data[i].no,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].major);
    }
    fclose(output);
    printf("保存成功\n");
}

//*******学生信息管理系统*******

int main()
{
    SeqList StuList;
    int choice = 0;
    do
    {
        printf("****************学生信息管理****************\n");
        printf("******************1----建立****************\n");
        printf("******************2----查询****************\n");
        printf("******************3----删除****************\n");
        printf("******************4----增加****************\n");
        printf("******************5----存储****************\n");
        printf("******************0----退出****************\n");
        printf("*******************************************\n");
        printf("请选择(0-4): ");
        scanf("%d", &choice);
        switch(choice)
        {
            case 1:
            {
                Create(StuList);
                break;
            }
            case 2:
            {
                Locate(StuList);
                break;
            }
            case 3:
            {
                Delete(StuList);
                break;
            }
            case 4:
            {
                Insert(StuList);
            }
            case 5:
            {
                Save(StuList);
            }
            case 0:
                break;
            default:
                printf("输入错误!\n");
        }
    }while(choice);
    
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值