顺序表

/******main.c******/

#include <stdio.h>

#include <stdlib.h>
#include "Sqlist.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */


int main(int argc, char *argv[]) {
Sqlist L;
Student e,pre_e,Next_e;
int key=-1;
int num,i;
char num2[20];
/*
张光祥  201603041032 
*/ 
printf("1.初始化 默认  ");
printf("2.查找  ");
printf("3.插入  ");
printf("4.删除  ");
printf("5.销毁  ");
printf("6.清空  ");
printf("7.长度  ");
printf("8.是否为空  ");
printf("9.第一个与e相等的值的位置  ");
printf("10.前驱  ");
printf("11.后继  ");
printf("12.输出线性表  ");
printf("13.结束 ");
InitList(&L);

for(int i=1;i<=2;i++){
ListInsert_Sq(&L, i, myscanf());

while(key){
printf("你将要: ");
scanf("%d",&num); 
switch(num){
case 1:
InitList(&L);
break;
case 2:
printf("你想找第几个 ");
scanf("%d",&i); 
Getelem(L,i,&e);
printf("第%d个是",i);
myprintf(e);
printf(" ");
break;
case 3:
printf("插入位置是? ");
scanf("%d",&i);
printf("插入值为 ");
ListInsert_Sq(&L, i, myscanf());
break;
case 4:
printf("你想删除第几个 ");
scanf("%d",&i); 
ListDelete_Sq(&L,i);
break;
case 5:
while(1){
printf("确定要销毁该线性表1.是  2.否 ");
scanf("%d",&i);
if(i==1){
DestroyList(&L);
key=0;//bug,目前不懂为什么free了空间还可以插入,所以直接结束程序,有明白的请指教 
break;
}else if(i==2){
break;
}else{
printf("输入有误 "); 
}
}
break;
case 6:
while(1){
printf("确定要清空该线性表1.是  2.否 ");
scanf("%d",&i);
if(i==1){
ClearList(&L);
break;
}else if(i==2){
break;
}else{
printf("输入有误 "); 
}
}
break;
case 7:
printf("线性表的长度是%d ",GetLength(L)) ;
break;
case 8:
if(ListEmpty(L)){
printf("线性表为空 ");
}else{
printf("线性表不为空 ");
}
break;
case 9:
printf("你想要查找的姓名为 ");
scanf("%s",&num2);
if(LocateElem(L,num2)){
printf("%s位于第%d个位置 ",num2,LocateElem(L,num2)) ;
}else{
printf("不存在该值 ");
}

break;
case 10:
printf("你想查找谁(姓名)的前驱 ");
scanf("%s",&num2);
printf("%s",num2); 
if(LocateElem(L,num2)){
PriorElem(L,num2,&pre_e);
printf("学号%s的前驱为 ",num2);
myprintf(pre_e);
printf(" "); 
}else{
printf("不存在该值 ");
}
break;
case 11:
printf("你想要查找谁(姓名)的后继 ");
scanf("%s",&num2);
if(LocateElem(L,num2)){
NextElem(L,num2,&Next_e);
printf("学号%s的后继为 ",num2);
myprintf(Next_e);
printf(" ");
}else{
printf("不存在该值 ");
}
break;
case 12:
TraverseList(L);
break;
case 13:
key=0;
break;
default: printf("输入有误 ");break;

}
return 0;

}

/**********Sqlist.h**********/

#include <string.h>
#define MAXSIZE 100
/*
张光祥  201603041032 
*/ 
/*
学生结构体 
*/
typedef  struct{
char no[20];
char name[30];
int result;
}Student;
/*
格式化输入结构体
*/
Student myscanf(){
Student stu;
scanf("%s%s%d",&stu.no,&stu.name,&stu.result);
return stu;

/*
格式化输出结构体 
*/
void myprintf(Student e){
printf("学号:%s  姓名:%s  成绩:%d",e.no,e.name,e.result);





/*
构建顺序表 
*/ 
typedef struct{
Student *elem;
int length;
}Sqlist; 
/*
顺序表的初始化 
*/
int InitList(Sqlist *L){
L->elem=(Student *)malloc(sizeof(Student)*MAXSIZE);
if(!L->elem) exit(0);
L->length=0;
return 1;

/*
顺序表的查找 
*/ 
int Getelem(Sqlist L,int i,Student *e){
if(i<1||i>L.length) return 0;
*e=L.elem[i-1];
return 1;

/*
顺序表的插入 
*/ 
int ListInsert_Sq(Sqlist *L, int i, Student e){
if(i<1||i>L->length+1) return 0;
if(L->length==MAXSIZE) return 0; 
for(int j=L->length;j>=i;j--){
L->elem[j]=L->elem[j-1];
}
L->elem[i-1]=e;
L->length++;
return 1;
}
/*
顺序表的删除 
*/
int ListDelete_Sq(Sqlist *L,int i){
if(i<1||i>L->length) return 0;
for(int j=i-1;j<L->length-1;j++){
L->elem[j]=L->elem[j+1];
}
L->length--;
return 1;

/*
销毁线性表 
*/
void DestroyList(Sqlist *L){
if(L->elem)  free(L->elem);

/*
清空线性表 
*/
void ClearList(Sqlist *L){
L->length=0;

/*
求线性表的长度 
*/
int GetLength(Sqlist L){
return L.length;
}
/*
判断线性表是否为空 
*/ 
int ListEmpty(Sqlist L){
if(L.length==0){
return 1;
}else return 0;
}
/*
第一个与e相等的值的位置 
*/
int LocateElem(Sqlist L,char No[]){
for(int i=0;i<L.length;i++){
if(strcmp(L.elem[i].name,No)==0) return i+1;
}
return 0;

/*
返回线性表元素的前驱 
*/
int PriorElem(Sqlist L,char cur_e[],Student *pre_e){
if(LocateElem(L,cur_e)>1){
*pre_e=L.elem[LocateElem(L,cur_e)-2];
}else return 0;

/*
返回线性表元素的后继 
*/
int NextElem(Sqlist L,char cur_e[],Student *Next_e){
if(LocateElem(L,cur_e)>=1&&LocateElem(L,cur_e)<L.length){
*Next_e=L.elem[LocateElem(L,cur_e)];
}else return 0;

/*
遍历输出线性表 
*/ 
int TraverseList(Sqlist L){
for(int i=0;i<L.length;i++){
myprintf(L.elem[i]);
printf(" ");
}