#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);
}