线性表的顺序表示来实现学生信息管理系统

线性表的顺序表示来实现学生信息管理系统

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#include<conio.h>

#define OVERFLOW -2
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0

#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10

typedef int Status;

typedef struct
{
	char name[10];
	float score;
}ElemType;
typedef struct
{
	ElemType *elem;		//存储空间地址
	int length;			//当前长度	
	int listsize;		//当前分配的存储容量,以sizeof(ElemType)为单位
}SqList;
Status InitList_Sq(SqList *L)
{
	//构造一个空的线性表
	L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L->elem) exit(OVERFLOW);
	L->length=0;
	L->listsize=LIST_INIT_SIZE;
	return OK;
}
Status ListInser_Sq(SqList *L,int i,ElemType e)
{
	ElemType *q,*p;		//要插入的位置
	//在顺序线性表L中第i 个位置之前插入新的元素e
	//i的合法值为1<=i<=ListLengh(*L)+1
	if(i<1 || i>L->length+1) return ERROR;	//i值不合法
	if(L->length>=L->listsize)
	{
		//当前存储空间已满,增加分配
		ElemType *newbase;
		newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREAMENT)*sizeof(ElemType));
		if(!newbase)exit(OVERFLOW);	//存储分配失败
		L->elem=newbase;			//新基址
		L->listsize+=LISTINCREAMENT;//增加存储空间容量
	}
	
	q=&(L->elem[i-1]);		//编译通过了,事实证明elem是一个指针,可以作为一个数组的基地址,虽然数组没有定义
	for(p=&(L->elem[L->length-1]);p>=q;--p)
		*(p+1)=*p;    //插入位置及之后的位置右移
	*q=e;					//插入e,为了插入e,付出艰辛的操作,还没完
	++L->length;     //表长增1
	return OK;
}
Status ListDelete_Sq(SqList *L,int i,ElemType *e)
{
	//在顺表线性表L中删除第1个元素,并用e返回其值
	//i的和法制为i的合法值为1<=i<=ListLengh(*L)
	ElemType *p,*q;
	if(i<1 || (i>L->length)) return ERROR;
	p=&(L->elem[i-1]);		//p为被删除元素的位置
	*e=*p;
	q=L->elem+L->length-1;	//表尾元素的位置
	for(++p;p<=q;++p) 
		*(p-1)=*p;			//被删除元素之后的元素左移
	--L->length;			//表长减1
	return OK;
}
void Traverse(SqList L)  //函数指针不会,只能暂时用这个了
{
	int i=0;
    while(i<L.length)
	{
		printf("%s %4.2f\n",L.elem[i].name,L.elem[i].score);
		i++;
	}
}
menu()
{
	printf("\n\n\t\t*******************************************\n");
	printf("\t\t*              学生信息管理系统           *\n");
	printf("\t\t*             1.查询学生信息              *\n");
	printf("\t\t*             2.增加学生信息              *\n");
	printf("\t\t*             3.删除学生信息              *\n");
	printf("\t\t*             4.显示全部信息              *\n");
	printf("\t\t*             0.退出系统                  *\n");
	printf("\t\t*******************************************\n");
}

//全局变量
ElemType elem;
SqList L;
void add()
{
	int i;
	printf("请输入要插入的位置:");
	scanf("%d",&i);
	printf("请输入学生姓名:");
	scanf("%s",elem.name);
	printf("请输入学生成绩:");
	scanf("%f",&elem.score);
	ListInser_Sq(&L,i,elem);

	printf("插入成功! 请按任意键返回!");
	getch();
}
void dele()
{
	int i=0;
	char name[10];
	printf("请输入要删除的学生姓名:");
	scanf("%s",name);
	for(i=0;i<L.length;i++)
	{
		if(strcmp(L.elem[i].name,name)==0)
		{
			ListDelete_Sq(&L,i,&L.elem[i]);
			printf("删除操作完成! 请按任意键返回!");
			getch();
			return;
		}
	}
	printf("没有该学生! 请按任意键返回!");
	getch();
}
void look()
{
	char name[10];
	int i;
	printf("请输入学生姓名:");
	scanf("%s",name);
	for(i=0;i<L.listsize;i++)
	{
		if(strcmp(L.elem[i].name,name)==0)
		{
			printf("%s的成绩为%4.2f\n",L.elem[i].name,L.elem[i].score);
			printf("请按任意键返回!");
			getch();
			return;
		}
	}
	printf("没有查询到该学生! 请按任意键返回!");
	getch();
}
void show()
{
	printf("current listsize:%d,",L.listsize);
	printf("current length:%d\n",L.length);
	Traverse(L);
	getch();
}
void main()
{
	char x;
	InitList_Sq(&L);
	while(1)
	{
		system("cls");
		menu();
		x=getchar();
		switch(x)
		{
		case '0':exit(0);
		case '1':look();break;
		case '2':add();break;
		case '3':dele();break;
		case '4':show();break;
		default:break;
		}
	}
	exit(0);
}
上一篇:顺序表一些基本操作


下一篇:顺序表插入、删除算法用C语言来实现