上一篇学习了顺序表(线性表的顺序存储)的九大操作,为了巩固知识点,今天用顺序表写了简单的学生管理系统。一下用了两种方式来实现,不适用指针和使用指针,加深对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;
}
}
}
运行截图:
总结:以上使用了两种方式,在使用指针时记得注意在使用完后要释放,不然容易造成内存泄漏。