1. 程式人生 > >學生資訊管理系統--Sqlist-順序表

學生資訊管理系統--Sqlist-順序表

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;		//Status 是函式返回值型別,其值是函式結果狀態程式碼。
#define MAXSIZE 100			//順序表可能達到的最大長度
typedef struct{
	char no[8];
	char name[20];
	int price;
} student;
typedef student ElemType;	
typedef struct{
	ElemType *elem;			//儲存空間的基地址
	int length;				//當前長度
}SqList;
void input(ElemType *e)
{
            printf("學號:");
			scanf("%s",e->no);
			printf("姓名:");
			scanf("%s",e->name);
			printf("成績<100:");
			scanf("%d",&e->price);
			printf("***OK***\n\n");
}

void output(ElemType *e)
{
  printf("學號:%-10s 姓名:%-10s  成績:%-10d\n\n", e->no, e->name, e->price);
}

Status InitList_Sq(SqList *L){				// 順序表的初始化
	//構造一個空的順序表L
	L->elem=malloc(sizeof(ElemType)*MAXSIZE);		//為順序表分配一個大小為MAXSIZE的陣列空間
	if(!L->elem)  exit(OVERFLOW);		//儲存分配失敗
	L->length=0;							//空表長度為0
	return OK;
}
/*Status InitList(SqList &L)
{
	L.elem=new ElemType[MAXSIZE];
	if(!L.elem) exit(OVERFLOW);
	L.length=0;
	return OK;
}*/
int LocateElem_Sq(SqList *L,ElemType e){		//順序表的查詢
	//順序表的查詢
	int i;
	for(i=0;i<L->length;i++)
		if(!strcmp(L->elem[i].name,e.name)) return i+1;
	return 0;
}

Status ListInsert_Sq(SqList *L,int i,ElemType e){		// 順序表的插入
	//在順序表L中第i個位置之前插入新的元素e
	//i值的合法範圍是1<=i<=L.length+1
	int j;
	if(i<1 || i>L->length+1)	return ERROR;		//i值不合法
	if(L->length==MAXSIZE)	return ERROR;		//當前儲存空間已滿
	for(j=L->length-1;j>=i-1;j--)
		L->elem[j+1]=L->elem[j];					//插入位置及之後的元素後移
	L->elem[i-1]=e;								//將新元素e放入第i個位置
	++L->length;									//表長增1
	return OK;
}

Status ListDelete_Sq(SqList *L,char *i,char *e){		//演算法2.4 順序表的刪除
	int j=0;
	while(j<L->length && strcmp(L->elem[j].no,i))
     j++;
	if (j!=L->length)
	{strcpy(e,L->elem[j].name);
	 for(;j<=L->length;j++)				
		 L->elem[j]=L->elem[j+1];
		 }	
	else return ERROR;			
	 --L->length;									//表長減1
	return OK;
}
void menu()
{
	printf("                        ********電腦科學與技術***********        \n\n");
	printf("                                學生資訊管理系統                    \n\n");
	printf("主選單:\n");
	printf("  1.建立順序表             ");printf("2.輸入學生資訊\n");
	printf("  3.查詢                   ");printf("4.插入\n");
	printf("  5.刪除                   ");printf("6.輸出學生資訊\n");
	printf("  7.退出\n\n"); 
}
int main()
{
	SqList L;
	int i,temp,a,choose,x;
	ElemType b,e;
	char res[20],c[10];
 menu();
	choose=-1;
	while(choose!=7)
	{
		printf("請選擇:");
		scanf("%d",&choose);
		switch(choose)
		{
		case 1:
			if(InitList_Sq(&L))						//建立順序表
				printf("成功建立順序表\n\n");
			else
				printf("順序表建立失敗\n\n");
			break;
		case 2:									
			printf("請輸入學生數量<100:");
			scanf("%d",&x);
			for(i=0;i<x;i++)
			{  printf("第%d位:\n",i+1);
			input(&L.elem[i]);}
			L.length=x;
			putchar('\n');
			break;
		case 3:										//順序表的查詢
			printf("請輸入所要查詢的學生姓名:");
			scanf("%s",e.name);
			temp=LocateElem_Sq(&L,e);
			if(temp!=0)
			{	printf("%s是第%d位同學.\n\n",e.name,temp);
				printf("該學生資訊如下:\n");
		    output(&L.elem[temp-1]);
				}
			else
				printf("查詢失敗!沒有此同學,檢查是否輸入正確\n\n");
			break;
		case 4:										//順序表的插入
			printf("請輸入一個數,代表插入的位置:");
			scanf("%d",&a);
            printf("請輸入所要插入學生的資訊:\n");
			printf("學號:");
			scanf("%s",b.no);
			printf("姓名:");
			scanf("%s",b.name);
			printf("成績:");
			scanf("%d",&b.price);
			if(ListInsert_Sq(&L,a,b))
				printf("插入成功.\n\n");
			else
				printf("I插入失敗.\n\n");
			break;
		case 5:										//順序表的刪除
			printf("請輸入所要刪除的學生學號:");
			scanf("%s",c);					
			if(ListDelete_Sq(&L,c,res))			
					printf("刪除成功.\n被刪除的學生是:%s\n\n",res);	
			else
				printf("刪除失敗.\n\n");
			break;
		case 6:			//順序表的輸出
		    printf("當前學生總人數為:%d\n",L.length);
			printf("當前順序表為:\n");
			for(i=0;i<L.length;i++)
				output(&L.elem[i]);
			printf("\n");
			break;
	    case 7:
		    printf("********************************END************************************\n");
			break; 
		}
	}
	return 0;
}