#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Record
{
    int sequence;
    char studentID[12];
    char name[50];
};

typedef struct Record DataType;

struct SeqList
{
    int MAXNUM; // 顺序表中最大的元素个数
    int n;      // 存放在顺序表中元素的个数
    DataType* element; /* element[0]、element[1],……,element[n-1] 存放线性表中的元素 */
};

typedef struct SeqList* PSeqList;

PSeqList createNullList_seq(int m)
{
    PSeqList palist = (PSeqList)malloc(sizeof(struct SeqList));
    if (palist != NULL) {
        palist->element = (DataType*)malloc(sizeof(DataType) * m);
        if (palist->element) {
            palist->MAXNUM = m;
            palist->n = 0; // 空顺序表长度为0
            return palist;
        }
        else {
            free(palist);
        }
    }
    printf("Failed!\n"); // 存储分配失败
    return NULL;
}

int isNullList_seq(PSeqList palist)
{
    return (palist->n == 0);
}

int locate_seq(PSeqList palist, DataType x)
{
    for (int p = 0; p < palist->n; p++)
    {
        if (palist->element[p].sequence == x.sequence)
            return p;
    }
    return -1;
}

int insertPre_seq(PSeqList palist, int p, DataType x)
{
    int q;
    if (palist->n >= palist->MAXNUM)  // 溢出
    {
        printf("Overflow!\n");
        return 0;
    }
    if (p < 0 || p > palist->n)
    {
        printf("Not exist!\n");
        return 0;
    }
    for (q = palist->n - 1; q >= p; q--)  // 注意要从最后一个开始往后移
        palist->element[q + 1] = palist->element[q]; // 全部后移一个
    palist->element[p] = x;
    palist->n = palist->n + 1;  // 元素个数+1
    return 1;
}

void com(PSeqList seqList)
{
    FILE* inputFile;
    char filename[100]; // 声明一个足够大的数组来存储文件名
    int capacity = 1000; // 假设顺序表的最大容量为1000

    // 打开原始文件
    inputFile = fopen("D:\\202111010038\\2021sjjgANSI.txt", "r");

    if (inputFile == NULL) {
        printf("无法打开原始文件!\n");
        return;
    }

    // 读取列标题并跳过
    fscanf(inputFile, "%*[^\n]"); // 跳过一行数据,不存储到变量中

    // 从文件中读取 Record 结构体数据并插入到顺序表中
    DataType recordToInsert;

    while (fscanf(inputFile, "%d %s %[^\n]", &recordToInsert.sequence, recordToInsert.studentID, recordToInsert.name) != EOF)
    {
        if (insertPre_seq(seqList, seqList->n, recordToInsert))
        {
            ;
        }
        else
        {
            printf("数据插入失败: %d %s %s\n", recordToInsert.sequence, recordToInsert.studentID, recordToInsert.name);
        }
    }

    // 关闭文件
    fclose(inputFile);

    // 在这里可以继续插入更多数据
    DataType additionalRecord;

    printf("请输入学生的学号\n");
    scanf("%s", additionalRecord.studentID);
    printf("请输入学生的姓名\n");
    scanf("%s", additionalRecord.name);

    // 构建动态文件名
    sprintf(filename, "D:\\202111010038\\2021sjjg加%s.txt", additionalRecord.name);

    // 推荐插入位置,以确保按学号正序排列
    int insertPosition = -1; // 默认插入到最后
    for (int i = 0; i < seqList->n; i++) {
        if (strcmp(additionalRecord.studentID, seqList->element[i].studentID) < 0) {
            insertPosition = i;
            printf("程序推荐您插入位置序号为%d\n", i + 1);
            break;
        }
    }

    // 更新插入的序号
    additionalRecord.sequence = seqList->n + 1;

    if (insertPre_seq(seqList, insertPosition, additionalRecord))
    {
        ;
    }
    else
    {
        printf("数据插入失败: %s %s\n", additionalRecord.studentID, additionalRecord.name);
    }

    // 在将数据写入输出文件之前,打印顺序表中的数据
    for (int i = 0; i < seqList->n; i++) {
        ;
    }

    // 将数据写入输出文件
    FILE* outputFile = fopen(filename, "w");
    if (outputFile == NULL) {
        printf("无法创建输出文件!\n");
        return;
    }

    fprintf(outputFile, "序号 学号 姓名\n");

    for (int i = 0; i < seqList->n; i++) {
        fprintf(outputFile, "%d %s \n", i + 1, seqList->element[i].studentID);
    }

    // 关闭文件
    fclose(outputFile);

    printf("数据已插入到顺序表并保存到 %s 文件中。\n", filename);
}

void menu()
{
    int m;
    printf("                             \n");
    printf("      1.开始     2.结束      \n");
    printf("                             \n");
    scanf("%d", &m);
    if (m == 1)
    {
        PSeqList seqList = createNullList_seq(1000); // 创建一个空的顺序表

        if (seqList == NULL) {
            printf("创建顺序表失败!\n");
            return;
        }

        com(seqList);

        // 清空顺序表
        seqList->n = 0;

        goto again;
    }
    else
        exit(0);

again:
    printf("           是否继续          \n");
    printf("      1.继续     2.结束      \n");
    printf("                             \n");

    scanf("%d", &m);
    if (m == 1) {
        menu(); // 递归调用菜单函数以继续处理数据
    }
    else
        exit(0);
}

int main()
{
    menu(); // 调用菜单函数处理数据

    return 0;
}