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

//可读取文本的顺序存储的线性表
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值