//可读取文本的顺序存储的线性表
#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;
}
可读取文本的顺序存储的线性表(c语言)|数据结构
最新推荐文章于 2023-06-24 15:17:13 发布