#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define OVERFLOW -2
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0
typedef int Status;
#define STACK_INIT_SIZE 100
#define STACKINCREAMENT 10
typedef struct
{
char name[ 10 ] ;
float score;
} SElemType;
typedef struct
{
SElemType * base;
SElemType * top;
int stacksize;
} SqStack;
Status visit ( ) ;
Status InitStack ( SqStack * S) ;
Status DestroyStack ( SqStack * S) ;
Status ClearStack ( SqStack * S) ;
Status StackEmpty ( SqStack S) ;
int StackLength ( SqStack S) ;
Status GetTop ( SqStack S, SElemType * e) ;
Status Push ( SqStack * S, SElemType e) ;
Status Pop ( SqStack * S, SElemType * e) ;
Status StackTraverse ( SqStack S, Status ( * visit) ( ) ) ;
SElemType data;
SqStack stack;
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" ) ;
}
void look ( )
{
char name[ 10 ] ;
SElemType * p;
printf ( "请输入学生姓名:" ) ;
scanf ( "%s" , name) ;
p= stack. top;
for ( -- p; p>= stack. base; p-- )
{
if ( strcmp ( p-> name, name) == 0 )
{
printf ( "%s的成绩为%4.2f\n" , p-> name, p-> score) ;
printf ( "请按任意键返回!" ) ;
getch ( ) ;
return ;
}
}
printf ( "没有查询到该学生! 请按任意键返回!" ) ;
getch ( ) ;
}
void add ( )
{
printf ( "请输入学生姓名:" ) ;
scanf ( "%s" , data. name) ;
printf ( "请输入学生成绩:" ) ;
scanf ( "%f" , & data. score) ;
Push ( & stack, data) ;
printf ( "添加学生成功!请按任意键返回" ) ;
getch ( ) ;
}
void dele ( )
{
Pop ( & stack, & data) ;
printf ( "成功删除刚刚添加的学生!:%s\n按任意键返回!" , data. name) ;
getch ( ) ;
}
void show ( )
{
SElemType * p;
p= stack. top;
for ( -- p; p>= stack. base; p-- )
{
printf ( "%s的成绩为%4.2f\n" , p-> name, p-> score) ;
}
printf ( "请按任意键返回!" ) ;
getch ( ) ;
return ;
}
void main ( )
{
char x;
InitStack ( & stack) ;
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 ) ;
}
Status InitStack ( SqStack * S)
{
S-> base= ( SElemType * ) malloc ( STACK_INIT_SIZE* sizeof ( SElemType) ) ;
if ( ! S-> base) exit ( OVERFLOW) ;
S-> top= S-> base;
S-> stacksize= STACK_INIT_SIZE;
return OK;
}
Status GetTop ( SqStack S, SElemType * e)
{
if ( S. top== S. base) return ERROR;
* e= * ( S. top- 1 ) ;
return OK;
}
Status Push ( SqStack * S, SElemType e)
{
if ( S-> top- S-> base>= S-> stacksize)
{
S-> base= ( SElemType * ) realloc ( S-> base, ( S-> stacksize+ STACKINCREAMENT) * sizeof ( SElemType) ) ;
if ( ! S-> base) exit ( OVERFLOW) ;
S-> top= S-> base+ S-> stacksize;
S-> stacksize+ = STACKINCREAMENT;
}
* S-> top++ = e;
return OK;
}
Status Pop ( SqStack * S, SElemType * e)
{
if ( S-> base== S-> top) return ERROR;
* e= * -- S-> top;
return OK;
}
Status StackEmpty ( SqStack S)
{
if ( S. base== S. top)
{
return TRUE;
}
else
{
return FALSE;
}
}
Status ClearStack ( SqStack * S)
{
S-> top= S-> base;
return OK;
}
Status DestroyStack ( SqStack * S)
{
S-> base= NULL ;
return OK;
}