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