1. 程式人生 > >課程設計——學生資訊管理系統(順序表 連結串列)

課程設計——學生資訊管理系統(順序表 連結串列)

實驗目的 

1 、掌握線性表的定義;

2 、掌握線性表的基本操作,如建立、查詢、插入和刪除等。

實驗內容:

定義一個包含學生資訊(學號,姓名,成績)的的 順序表和連結串列,使其具有如下功能:

(1) 根據指定學生個數,逐個輸入學生資訊;

(2) 逐個顯示學生表中所有學生的相關資訊;

(3) 根據姓名進行查詢,返回此學生的學號和成績;

(4) 根據指定的位置可返回相應的學生資訊(學號,姓名,成績);

(5) 給定一個學生資訊,插入到表中指定的位置;

(6) 刪除指定位置的學生記錄;

(7) 統計表中學生個數。

參考資訊 

Definition of structure student

 

typedef struct {

    char no[8];   //8 位學號

    char name[20]; // 姓名

    int price;     // 成績

}Student;

Definition of sequential list:

typedef  struct {

  Student  *elem;     // 指向資料元素的基地址

  int  length;       // 線性表的當前長度                                                           

 }SqList 

Definition of linked list

 

typedef struct LNode{

     Student   data;       // 資料域

     struct LNode  *next;   // 指標域

}LNode,*LinkList;  

實驗要求 

(1) 程式要新增適當的註釋,程式的書寫要採用 縮排格式 

(2) 程式要具在一定的 健壯性,即當輸入資料非法時, 程式也能適當地做出反應,如 插入刪除時指定的位置不對 等等。

(3) 程式要做到 介面友好,在程式執行時使用者可以根據相應的提示資訊進行操作。

(4) 根據實驗報告模板詳細書寫實驗報告,在實驗報告中給出連結串列 根據姓名進行查詢的演算法和插入演算法的流程圖

 

順序表:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct
{
	char num[22];
	char name[22];
	int grade;
}Node;
typedef struct 
{
	Node *Elem;
	int Maxsize;			//最多人數 
}List;
void welcome()
{
	puts("				********歡迎進入學生成績管理系統********");
	puts("				*	      請選擇操作:             *"); 
	puts("				*	1:輸入學生數目及資訊           *");
	puts("				*	2:顯示所有學生資訊             *"); 
	puts("				*	3:刪除指定位置學生資訊         *"); 
	puts("				*	4:根據姓名查詢學生資訊         *");
	puts("				*	5:插入學生資訊                 *");
	puts("				*	6:輸出指定位置學生成績         *");
 	puts("				*	7:輸出系統學生人數             *");
 	puts("				*	8:訪問結束                     *"); 
 	puts("\n");
}
int i;
void Initlist(int n,List &L) 
{
	for(i=1;i<=n;i++)
	{
		printf("請輸入學號:"); 
		scanf("%s",L.Elem[i].num);
		printf("請輸入學生姓名:"); 
		scanf("%s",L.Elem[i].name);
		printf("請輸入成績:"); 
		scanf("%d",&L.Elem[i].grade);
		printf(" \\(^o^)/  請繼續\n"); 
	}
	printf("輸入結束(*^__^*)\n");
}
void ListDelete(int n,int pos,List &L)
{
	for(i=pos;i<n;i++)
		L.Elem[i]=L.Elem[i+1];
}
void ListInsert(int n,int pos,List &L)
{
	for(i=n;i>pos+1;i--)
		L.Elem[i]=L.Elem[i-1];
	printf("學號:");
	scanf("%s",L.Elem[pos+1].num); 
	printf("姓名:");
	scanf("%s",L.Elem[pos+1].name);
	printf("成績:");
	scanf("%d",&L.Elem[pos+1].grade); 
}
void GetElem(int n,int pos,List L) 
{
	if(pos>n)
		printf("你輸入的數太大啦o(≧口≦)o,裡面都沒有那麼多人呢!\n\n請繼續選擇操作:"); 
	else
	{
		printf("學號\t姓名\t成績   \n");		
		printf("%s\t%s\t%d\n",L.Elem[pos].num,L.Elem[pos].name,L.Elem[pos].grade);
		printf("(^-^)V 這就出來啦!\n");
		printf("\n請繼續選擇操作:");
	}			
}
int main()
{
	welcome(); 	
	List L;
	L.Maxsize=111;
	L.Elem=(Node *)malloc(sizeof(Node)*L.Maxsize);
	int op,pos;			// 操作 和 位置 
	int n=0;
	char nam[22];
	printf("請選擇操作(*^-^*)\n");
	while(1)
	{
		scanf("%d",&op);
		if(op==8)
			break;
		if(op<1||op>8)
		{
			printf("此操作有誤  ┑( ̄Д  ̄)┍,請重新輸入\n\n");
			continue;
		}		
		if((op>1&&op<8)&&n==0)
		{
			printf("尚未輸入學生資訊,請先輸入 (⊙﹏⊙)\n\n");
			continue;
		}
		if(op==1)
		{
			printf("**輸入學生數目及資訊**\n");
			printf("請輸入學生人數 (0 ~ 100) : ");
			scanf("%d",&n);
			while(n>100||n<0)
			{	
				printf("您輸入的人數有誤,請重新輸入人數\n\n");
				scanf("%d",&n);
			}	
			puts("");
			Initlist(n,L);	
			printf("\n請選擇操作 : ");
			continue;
		}
		if(op==2)
		{
			printf("**顯示所有學生資訊**\n");
			printf("學號\t姓名\t成績   \n");
			for(i=1;i<=n;i++)		
				printf("%s\t%s\t%d\n",L.Elem[i].num,L.Elem[i].name,L.Elem[i].grade);			
			printf("\no(^▽^)o 請選擇操作:"); 
			continue;
		}
		if(op==3)
		{
			printf("**刪除指定位置學生資訊**\n");
			printf("請輸入指定位置:");
			scanf("%d",&pos);
			ListDelete(n,pos,L);
			n--;
			printf("操作成功\n請選擇操作:");
			continue;
		}
		if(op==4)
		{
			printf("**根據姓名查詢學生資訊**\n");
			printf("請輸入學生姓名:");
			scanf("%s",nam);
			int flag=0; 
			for(i=1;i<=n;i++)
			{
				int A=strcmp(nam,L.Elem[i].name);
				if(A==0)
				{
					printf("學號\t成績\n");
					printf("%s\t%d\n",L.Elem[i].num,L.Elem[i].grade);
					flag=1;
					break;				
				}	
			}
			if(flag)
				printf("o(* ̄︶ ̄*)o 這就出來啦,繼續吧\n\n");
			else
				printf("對不起,查無此人\n\n");
			printf("請選擇操作:");
			continue;
		}
		if(op==5)
		{
			printf("**插入學生資訊**\n");
			n++;
			printf("請輸入要插入資訊的位置(在此後插入): ");
			scanf("%d",&pos);
			ListInsert(n,pos,L); 
			printf("插入成功<( ̄︶ ̄)>\n\n");
			printf("請選擇操作: ") ;
			continue;
		} 
		if(op==6)
		{
			printf("**輸出指定位置學生成績**\n");
			printf("請輸入指定位置:");
			scanf("%d",&pos);
			GetElem(n,pos,L);
			continue;
		} 
		if(op==7)
		{
			printf("**輸出系統學生人數**\n");
			printf("系統人數為:%d\n\n請選擇操作:",n);
		}	
	}
	system("pause");
	return 0;
};

連結串列:

(之前多次給 p t 分配空間,不需要)

原來不只是刪掉那麼簡單!改了三個小時!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define false 0
#define true 1
#define bool int
typedef struct Lnode
{
	char num[22];
	char name[22];
	int grade;
	struct Lnode *next;
}Lnode,*Linklist;
void welcome()
{
	puts("				********歡迎進入學生成績管理系統********");
	puts("				*	      請選擇操作:             *"); 
	puts("				*	1:輸入學生數目及資訊           *");
	puts("				*	2:顯示所有學生資訊             *"); 
	puts("				*	3:刪除指定位置學生資訊         *"); 
	puts("				*	4:根據姓名查詢學生資訊         *");
	puts("				*	5:插入學生資訊                 *");
	puts("				*	6:輸出指定位置學生成績         *");
 	puts("				*	7:輸出系統學生人數             *");
 	puts("				*	8:結束訪問                     *"); 
 	puts("\n");
}
int i;
void LnodeInit(Linklist &p)     
{  
    p = (Lnode *)malloc(sizeof(Lnode));  
    p->next = NULL;  
}  
void InitList(int n,Lnode &L,Linklist &p) 
{		
	for(i=1;i<=n;i++)
	{		
		LnodeInit(p);
		printf("請輸入學號:"); 
		scanf("%s",p->num);
		printf("請輸入學生姓名:"); 
		scanf("%s",p->name);
		printf("請輸入成績:"); 
		scanf("%d",&p->grade);
		Linklist t;
		t=&L;
		while(t->next!=NULL)		//在 L尾插入 p  
			t=t->next;
		t->next=p;
		printf(" \\(^o^)/  請繼續\n"); 
	}
}
bool ListDelete(int n,int pos,Lnode &L,Linklist &p)
{
	int j=0;
	Linklist t;
	t=(Lnode *)malloc(sizeof(Lnode));
	p=&L;
	while(p->next!=NULL&&(j<pos-1))
	{
		p=p->next;
		j++;
	}
	if(!(p->next)||(j>pos-1))
		return false;
	t=p->next;
	p->next=t->next;
	free (t);
	return true;
}
bool ListInsert(int pos,Lnode &L,Linklist &p)
{
	int j=0;
	Linklist t;
	t = (Lnode *)malloc(sizeof(Lnode));		// ???
	printf("請輸入學號:"); 
	scanf("%s",t->num);
	printf("請輸入學生姓名:"); 
	scanf("%s",t->name);
	printf("請輸入成績:"); 
	scanf("%d",&t->grade);
	p=L.next;
	while(p!=NULL&&(j<pos-1))
	{
		p=p->next;
		j++;
	}
	if(p==NULL||(j>pos-1))
		return false; 
	t->next=p->next;
	p->next=t;
	return true;
}
void GetElem(int pos,Lnode L)
{
	int j=1;
	Linklist t;
	t=&L;
	t=t->next;
	while(t->next&&(j<=pos-1))
	{
		t=t->next;
		j++;
	}
	printf("學號\t\t姓名\t\t成績\n");
	printf("%s\t\t%s\t\t%d\n",t->num,t->name,t->grade);
}
bool Listesearch(char nam[22],int n,Lnode L,Linklist p)
{
	p=&L;
	while(p)
	{
		if(strcmp(p->name,nam)==0)
			break;
		p=p->next;
	}
	if(p!=NULL)
	{
		printf("學號\t\t成績\n");
		printf("%s\t\t%d\n",p->num,p->grade);
		return true;	
	}
	return false;
}
int main()
{
	welcome(); 
	Lnode L;
	L.next=NULL;
	Linklist p;
	int pos,op,n=0;
	char nam[22];
	bool flag=false;
	printf("請選擇操作(*^-^*): ");
	while(1)
	{
		scanf("%d",&op);
		if(op==8)
			break;
		if(op<1||op>8)
		{
			printf("此操作有誤  ┑( ̄Д  ̄)┍,請重新輸入\n\n");
			continue;
		}		
		if((op>1&&op<8)&&n==0)
		{
			printf("尚未輸入學生資訊,請先輸入 (⊙﹏⊙)\n\n");
			continue;
		}
		if(op==1)
		{
			if (flag)
			{
				printf("您已經輸入學生資訊,退出前只可以進行除 1 以外的操作\n");		
				continue;
			}
			flag=true;
			printf("**輸入學生數目及資訊**\n");
			printf("請輸入學生人數 (0 ~ 100) : ");
			scanf("%d",&n);	
			InitList(n,L,p);
			printf("輸入結束(*^__^*)\n");
			printf("\n請選擇操作 : ");
			continue;
		}
		if(op==2)
		{
			printf("**顯示所有學生資訊**\n");
			printf("學號\t\t姓名\t\t成績   \n");
			Linklist t;
			t=L.next;
			while(t!=NULL) 
			{
				printf("%s\t\t%s\t\t%d\n",t->num,t->name,t->grade);
				t=t->next;
			}					
			printf("\no(^▽^)o 請選擇操作:"); 
			continue;
		}
		if(op==3)
		{	
			printf("**刪除指定位置學生資訊**\n");
			printf("請輸入指定位置:");
			scanf("%d",&pos);
			if(ListDelete(n,pos,L,p))
				printf("刪除操作成功\n請選擇操作:");
			else
				printf("刪除位置不合理\n請選擇操作:"); 
			n--;
			continue;
		} 
		if(op==4)
		{
			printf("**根據姓名查詢學生資訊**\n");
			printf("請輸入學生姓名:");
			scanf("%s",nam);
			if(Listesearch(nam,n,L,p))
				printf("o(* ̄︶ ̄*)o 這就出來啦,繼續吧\n\n"); 
			else
				printf("對不起,查無此人\n");
			printf("請選擇操作:");
			continue;
		} 	
		if(op==5)
		{
			printf("**插入學生資訊**\n");
			n++;
			printf("請輸入要插入資訊的位置(1-n)(會在此後插入): ");
			scanf("%d",&pos);
			if(ListInsert(pos,L,p))
				printf("插入成功<( ̄︶ ̄)>\n\n");
			else
				printf("插入失敗\n\n");
			printf("請選擇操作: ") ;
			continue;
		}
		if(op==6)
		{
			printf("**輸出指定位置學生成績**\n");
			printf("請輸入指定位置:");
			scanf("%d",&pos);
			GetElem(pos,L);
			continue;
		}
		if(op==7)
		{
			printf("**輸出系統學生人數**\n");
			printf("系統人數為:%d\n請選擇操作:\n\n",n);
		}
	}
	return 0;
}