可读取文本的顺序存储的线性表(c语言)|数据结构

发布于 2021-07-10  30 次阅读


//可读取文本的顺序存储的线性表
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100

typedef struct
{
    int number;
    char name[20];
    int age;
    int grade;
}Student;

typedef struct
{
    Student data[MAX];
    int listlen;
}sqList;

//菜单显示
void Menu()
{
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                  MENU                        ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                1 插入                        ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                2 删除                        ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                3 输出                        ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                4 退出                        ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
}

//插入
//设置返回值为整型,首先是因为c语言无bool类型,其次这是为了确认插入是否成功,所以需要返回0 1进行判断
int Insert(sqList* list, int i, int num, char name[20],int age,int grade)//这里的i变量是表示插入的第几个学生
{
    int j;
    int n;//名字插入所需要的循环变量
    if (i<1||i>list->listlen+1)
    {
        printf("插入位置有误,请重试!\n");
        return 0;//插入失败
    }
    if (list->listlen==MAX)
    {
        printf("当前存储空间已满,无法插入!\n");
        return 0;//插入失败
    }
    for (j=list->listlen-1;j>=i-1;j--)
    {

        list->data[j + 1].number = list->data[j].number;
        for (n=0;n<20;n++)
        {
            list->data[j + 1].name[n] = list->data[j].name[n];
        }

        list->data[j + 1].age = list->data[j].age;
        list->data[j + 1].grade = list->data[j].grade;
    }
    list->data[i - 1].number = num;
    for (n = 0; n < 20; n++)
    {
        list->data[i - 1].name[n] = name[n];
    }
    list->data[i - 1].age = age;
    list->data[i - 1].grade = grade;
    list->listlen++;
    return 1;
}

//删除
int Delete(sqList *list,int i)
{
    int j;
    int n;//名字删除入所需要的循环变量
    if (i<1 || i>list->listlen)
    {
        printf("删除位置有误,请重试!\n");
        return 0;//插入失败
    }
    for (j=i;j<list->listlen;j++)
    {
        list->data[j - 1].number = list->data[j].number;
        for (n = 0; n < 20; n++)
        {
            list->data[j - 1].name[n] = list->data[j].name[n];
        }
        list->data[j - 1].age = list->data[j].age;
        list->data[j - 1].grade = list->data[j].grade;
    }
    list->listlen--;
    return 1;
}

//输出显示
void Out(sqList*list)
{

    int i;
    printf("-----------------------------\n");
    printf("|学号  |姓名      |年龄|成绩|\n");
    for (i=0;i<list->listlen;i++)
    {
        printf("-----------------------------\n");
        printf("|%-6d|%-10s|%-4d|%-4d|\n", list->data[i].number, list->data[i].name, list->data[i].age, list->data[i].grade);
    }
    printf("-----------------------------\n");
}


int main()
{
    sqList* Llist;
    int i, num, age, grade,choice,n=0;
    FILE* in, * out;
    char name[20];
    Llist = (sqList*)malloc(sizeof(sqList));

    in = fopen("stu.txt", "r");
    out = fopen("newstu.txt", "w");
    while (fscanf(in, "%d%s%d%d,", &Llist->data[n].number, Llist->data[n].name, &Llist->data[n].age, &Llist->data[n].grade) != EOF)
    {
        n++;
    }
    Llist->listlen = n;
    Out(Llist);

    getch();//system("pause");
    system("cls");
    do
    {
        Menu();
        printf("请选择你要的操作 select(1-4):");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:Out(Llist);
            printf("请按顺序输入要插入的位置,以及学生的学号,姓名,年龄和成绩:\n");
            scanf("%d%d%s%d%d",&i,&num,name,&age,&grade);
            if (Insert(Llist,i,num,name,age,grade)==1)
            {
                Out(Llist);
            }
            getch();
            system("cls");
            break;
        case 2:Out(Llist);
            printf("请选择要删除的位置:");
            scanf("%d",&i);
            if (Delete(Llist,i)==1)
            {
                Out(Llist);
            }
            getch();
            system("cls");
            break;
        case 3:Out(Llist);
            getch();
            system("cls");
        case 4:break;
        default:
            printf("请不要乱输入选项!\n");
        }

    } while (choice!=4);

    for (i = 0; i < Llist->listlen ; i++)
        fprintf(out, "%d %s %d %d\n ", Llist->data[i].number, Llist->data[i].name, Llist->data[i].age, Llist->data[i].grade);
    fclose(in);
    fclose(out);


    return 0;
}