天天看点

数据结构顺序表写学生管理系统

上一篇学习了顺序表(线性表的顺序存储)的九大操作,为了巩固知识点,今天用顺序表写了简单的学生管理系统。一下用了两种方式来实现,不适用指针和使用指针,加深对C语言指针的了解。

一、不使用指针方式

/******************************顺表表不使用指针版本************************************************/
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#pragma warning(disable:4996)
#define MaxSize 100
#define ElemType int
#define ok 1
#define error 0;
//学生信息表结构
typedef struct  
{
	char ID[10]; //学号
	char Name[20];//姓名
	//int Name;//姓名
	char Sex[5]; //性别
	char Tel[20];//电话
}Student;

typedef struct
{
	Student stu[MaxSize]; //学生信息
	int length; //顺序表长度
}SqlList;
//初始化顺序表
int InitList(SqlList &L)
{
	if (L.length != 0)
	{
		L.length = 0;
	}
	printf("初始化成功!\n");
	return ok;
}

//录入学生信息
int InsertInfo(SqlList &L)
{
	int num;
	int i;
	printf("请输入需要录入学生的个数:");
	scanf("%d", &num);
	int id;
	for (i = L.length; i < num + L.length; i++)
	{
		printf("第%d位学生信息:\n", i + 1);
		printf("学号:");
		scanf("%s", L.stu[i].ID);
		printf("姓名:");
		scanf("%s", L.stu[i].Name);
		printf("性别: " );
		scanf("%s", L.stu[i].Sex);
		printf("电话:");
		scanf("%s", L.stu[i].Tel);
		
	}
	L.length += num;
	return ok;
}

//删除学生信息
int DeleteInfo(SqlList &L)
{
	int i;
	char Id[10];
	Student stu;
	printf("请输入要删除的学号:");
	scanf("%s", &Id);
	for (i = 0; i < L.length; i++)
	{
		if (strcmp(L.stu[i].ID, Id) == 0)
		{
			stu = L.stu[i];
			for (int j = L.length; j > i; j--)
			{
				L.stu[j-1] = L.stu[j];
			}
			break;
		}
	}
	if (i >= L.length)
	{
		printf("没有找到该学生!\n");
	}		
	L.length--;
	if (strcmp(stu.ID, Id) == 0)
	{
		printf("被删除的学生信息为:\n");
		printf("学号:%s\n", stu.ID);
		printf("姓名:%s\n", stu.Name);
		printf("性别:%s\n", stu.Sex);
		printf("电话:%s\n", stu.Tel);
	}
	
	return 0;
}

//查找学生信息(根据ID)
int SearchInfo(SqlList L)
{
	char Id[10];
	int i;
	printf("请输入需要查找学生的ID:");
	scanf("%s", &Id);
	for (i = 0; i < L.length; i++)
	{
		if (strcmp(L.stu[i].ID, Id) == 0)
		{
			printf("学号:%s\n", L.stu[i].ID);
			printf("姓名:%s\n", L.stu[i].Name);
			printf("性别:%s\n", L.stu[i].Sex);
			printf("电话:%s\n", L.stu[i].Tel);
			break;
		}
	}
	if (i >= L.length)
	{
		printf("未找到该学生的信息!\n");
	}	
	return ok;
}

//修改学生信息
int UpstuInfo(SqlList &L)
{
	char Id[10];
	int i;
	printf("请输入需要修改学生信息的学号:");
	scanf("%s", &Id);
	for ( i = 0; i < L.length; i++)
	{
		if (strcmp(L.stu[i].ID, Id) == 0)
		{
			printf("请重新输入该学生的信息:\n");
			printf("学号:");
			scanf("%s", L.stu[i].ID);
			printf("姓名:");
			scanf("%s", L.stu[i].Name);
			printf("性别:");
			scanf("%s", L.stu[i].Sex);
			printf("电话:");
			scanf("%s", L.stu[i].Tel);
			break;
		}
	}
	if (i >= L.length)
		printf("表中没有该学生的信息:\n");
	return ok;
}

void OutputAll(SqlList L)
{
	for (int i = 0; i < L.length; i++)
	{
		printf("第%d个学生的信息:\n",i+1);
		printf("学号:%s\n", L.stu[i].ID);
		printf("姓名:%s\n", L.stu[i].Name);
		printf("性别:%s\n", L.stu[i].Sex);
		printf("电话:%s\n", L.stu[i].Tel);
		
	}
}

//清空表
int ClearInfo(SqlList &L)
{
	L.length = 0;
	return ok;	
}

void Menu()
{
	printf("\t\t\t1.初始化表\t\t\t2.添加学生信息\n");
	printf("\t\t\t3.删除学生信息\t\t\t4.查找学生信息\n");
	printf("\t\t\t5.删除表\t\t\t6.查询所有\n");
	printf("\t\t\t7.修改信息\n");
}
int main()
{
	SqlList L;
	while (1)
	{
		Menu();
		int choice;
		printf("选择功能:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
		{
			InitList(L);
			break;
		}
		case 2:
		{
			InsertInfo(L);
			break;
		}
		case 3:
		{
			DeleteInfo(L);
			break;
		}
		case 4:
		{
			SearchInfo(L);
			break;
		}
		case 5:
		{
			ClearInfo(L);
			break;
		}
		case 6:
		{
			OutputAll(L);
			break;
		}
		case 7:
		{
			UpstuInfo(L);
			break;
		}
		default:
			break;
		}

	}
}
           

运行结果截图:

数据结构顺序表写学生管理系统

二、使用指针版本

/********************************************使用指针版本*********************************************/

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MaxSize 100
#define ok 1;
#define error 0;
#pragma warning(disable:4996)
typedef struct
{
	char ID[10];
	char Name[10];
	char Sex[2];
	double Score;
}Student; //给学生信息结构体取给别名叫Student

typedef struct
{
	Student *data; //存储学生信息的指针
	int length; //顺序表长度
}SqList;

//初始化顺序表,给顺序表分配空间
int InitList(SqList *L)
{
	L->data = (Student*)malloc(sizeof(Student[MaxSize]));
	if (!L->data)
		return error;
	L->length = 0;
	printf("初始化成功\n");
	return ok;
}

//添加学生信息
void InsertInfo(SqList *L)
{
	int i = 0;
	while (1)
	{
		if (L->length == 100)
			printf("空间已满,无法继续录入!\n");
		printf("请输入第%d位学生的信息:\n", L->length+1);
		printf("学号:");
		scanf("%s", &(L->data[i].ID));
		printf("姓名:");
		scanf("%s", &(L->data[i].Name));
		printf("性别:");
		scanf("%s", &(L->data[i].Sex));
		printf("成绩:");
		scanf("%lf", &(L->data[i].Score));
		printf("录入完毕,是否继续录入(1:继续  0:退出):");
		i++;
		L->length++;
		int choice;
		scanf("%d", &choice);
		if (choice == 0)
			break;

	}
}

//删除学生信息
void DelInfo(SqList *L)
{
	Student stu;
	char Id[10];
	int i;
	printf("请输入需要删除学生信息的学号:");
	scanf("%s", &Id);
	for (i = 0; i < L->length; i++)
	{
		if(strcmp(L->data[i].ID, Id) == 0)
		{
			stu = L->data[i];
			for (int j = L->length; j > i; j--)
			{
				L->data[j - 1] = L->data[j];
			}
			break;
		}
	}
	if (i >= L->length)
	{
		printf("表中没有该学生!\n");
		return;
	}	
	L->length--;
	printf("被删除的学生信息为:\n");
	printf("学号:%s\n", stu.ID);
	printf("姓名:%s\n", stu.Name);
	printf("性别:%s\n", stu.Sex);
	printf("成绩:%lf\n", stu.Score);
	printf("删除成功!\n");
}

//修改学生信息
void UpdateInfo(SqList *L)
{
	char Id[10];
	int i;
	printf("请输入需要修改信息的学号:");
	scanf("%s", &Id);
	for (i = 0; i < L->length; i++)
	{
		if (strcmp(L->data[i].ID, Id) == 0)
		{
			printf("请输入新的信息:\n");
			printf("学号:");
			scanf("%s", &(L->data[i].ID));
			printf("姓名:");
			scanf("%s", &(L->data[i].Name));
			printf("性别:");
			scanf("%s", &(L->data[i].Sex));
			printf("成绩:");
			scanf("%f", &(L->data[i].Score));
			break;
		}
	}
	if (i >= L->length)
		printf("表中没有该学生!\n");
}

//通过学号查找某个学生的信息
void SeacrchInfoByID(SqList *L)
{
	int i;
	char Id[10];
	printf("请输入需要查找的ID:");
	scanf("%s", &Id);
	for ( i = 0; i < L->length; i++)
	{
		if (strcmp(L->data[i].ID, Id) == 0)
		{
			printf("该学生的信息:\n");
			printf("学号:%s\n", L->data[i].ID);
			printf("姓名:%s\n", L->data[i].Name);
			printf("性别:%s\n", L->data[i].Sex);
			printf("成绩:%f\n", L->data[i].Score);
			break;
		}
	}
	if (i >= L->length)
		printf("表中没有该学生!\n");
}

//输出所有学生的信息
void OutputAll(SqList *L)
{
	for (int i = 0; i < L->length; i++)
	{
		printf("第%d位学生的信息:\n", i+1);
		printf("学号:%s\n", L->data[i].ID);
		printf("姓名:%s\n", L->data[i].Name);
		printf("性别:%s\n", L->data[i].Sex);
		printf("成绩:%lf\n", L->data[i].Score);
	}
}

//清空表,释放内存
void ClearAndFree(SqList *L)
{
	free(L->data);
	if (L->length != 0)
		L->length = 0;
	printf("释放成功!\n");
}

//菜单
void Menu()
{
	printf("\t\t\t1.创建表\t\t\t2.添加学生信息\n");
	printf("\t\t\t3.删除学生信息\t\t\t4.修改学生信息\n");
	printf("\t\t\t5.查找学生信息\t\t\t6.输出全部学生信息\n");
	printf("\t\t\t7.释放顺序表\n");
}
//主函数测试
int main()
{
	SqList L;
	while (1)
	{
		Menu();
		int choice;
		printf("请选择菜单:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
		{
			InitList(&L);
			break;
		}
		case 2:
		{
			InsertInfo(&L);
			break;
		}
		case 3:
		{
			DelInfo(&L);
			break;
		}
		case 4:
		{
			UpdateInfo(&L);
			break;
		}
		case 5:
		{
			SeacrchInfoByID(&L);
			break;
		}
		case 6:
		{
			OutputAll(&L);
			break;
		}
		case 7:
		{
			ClearAndFree(&L);

		}
		default:
			break;
		}
	}

}
           

运行截图:

数据结构顺序表写学生管理系统

总结:以上使用了两种方式,在使用指针时记得注意在使用完后要释放,不然容易造成内存泄漏。

继续阅读