同學錄管理系統(C語言)

同學錄管理系統

實現學生通訊錄管理的幾個操作功能(新建、插入、刪除、從文件中讀取、寫入文件和查詢、屏幕輸出等功能)。通訊錄中學生的信息有學號、姓名、出生日期、性別、電話和地址等。

[內容]

1、利用鏈式存儲結構來實現

2、系統的菜單功能項如下:

1----新建學生通訊錄

2----向學生通訊錄插入學生信息

3----在通訊錄刪除學生信息

4----在文件中讀取通訊錄信息

5----向文件中寫入學生通訊錄信息

6----在通訊錄中查詢學生信息

7----在屏幕中輸出全部學生信息

8----退出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
#define len sizeof(Student)
/*定義一個學生類型的結構體 sizeof(Student)
所用的空間的大小賦值給變量len*/
static int De;
static int De2;
typedef struct Classmaterecord *Position;
typedef Position BinTree;
BinTree BT;

typedef struct Classmaterecord
{
	int number; //學號 
	char name[N]; //姓名
	char sex[N]; //性別
	char phone[N]; //電話號碼 
	BinTree Left;//左子樹
	BinTree Right;  //右子樹
}Student;
void init()//初始化
{
	BT==NULL;
}
void Traversal( );//顯示 先序、中序、後序實現遍歷
	void Preorder(BinTree BT);
	void Inorder(BinTree BT);
	void Postorder(BinTree BT);

void Find();//查找 按學號、姓名、電話號碼
	void FindBynum(BinTree BT,int number);
	void FindByname(BinTree BT,char name[]);
	void FindByphone(BinTree BT,char phone[]);

void FindBynum(BinTree BT,int number){//按照學號進行查找
	if(BT!= NULL){
		FindBynum(BT->Left,number);
		if(BT->number==number){
			system("cls");
			printf("\n==============================所查同學數據===========================\n"); 
			printf("\n--------學號-------------姓名-----------性別-----------手機號碼------\n");
			printf("\n\t%3d\t",BT->number);
			printf("\t%3s\t",BT->name);
			printf("\t%3s\t",BT->sex);
			printf("\t%3s\t",BT->phone);
			printf("\n\n");
			}
		FindBynum(BT->Right,number);
		}
}
void FindByname(BinTree BT,char name[]) //按照名字查找 遍歷查找
{
	if(BT != NULL){
		FindByname(BT->Left,name);
		if(strcmp(BT->name,name) == 0){
			system("cls");
			printf("\n===============================所查同學數據============================\n"); 
			printf("\n--------學號-------------姓名-----------性別-----------手機號碼-----\n");
			printf("\n\t%3d\t",BT->number);
			printf("\t%3s\t",BT->name);
			printf("\t%3s\t",BT->sex);
			printf("\t%3s\t",BT->phone);
			printf("\n\n");
			}
		FindByname(BT->Right,name);
		}
}
void FindByphone(BinTree BT,char phone[]){ //按照電話號碼進行查找
	if(BT!=NULL){
		FindByphone(BT->Left,phone);
		if(strcmp(BT->phone,phone)==0){
			system("cls");
			printf("\n==============================所查同學數據==========================\n"); 
			printf("\n--------學號-------------姓名-----------性別-----------手機號碼-----\n");
			printf("\n\t%3d\t",BT->number);
			printf("\t%3s\t",BT->name);
			printf("\t%3s\t",BT->sex);
			printf("\t%3s\t",BT->phone);
			printf("\n\n");
			}
	FindByphone(BT->Right,phone);
	}
}
//顯示前序遍歷的結果
void Preorder(BinTree BT){
	if(BT!=NULL){
		printf("\n\t%d\t",BT->number);
		printf("\t%s\t",BT->name);
		printf("\t%s\t",BT->sex);
		printf("\t%s\t",BT->phone);
		printf("\n\n");
		Preorder(BT->Left);
		Preorder(BT->Right);
	}
}
//中序遍歷
void Inorder(BinTree BT){
	if(BT!=NULL){
		Inorder(BT->Left);
		printf("\n\t%3d\t",BT->number);
		printf("\t%3s\t",BT->name);
		printf("\t%3s\t",BT->sex);
		printf("\t%3s\t",BT->phone);
		printf("\n\n");
		Inorder(BT->Right);
	}
}
//後序遍歷
void Postorder(BinTree BT){
	if(BT!=NULL){
		Postorder(BT->Left);
		Postorder(BT->Right);
		printf("\n\t%3d\t",BT->number);
		printf("\t%3s\t",BT->name);
		printf("\t%3s\t",BT->sex);
		printf("\t%3s\t",BT->phone);
		printf("\n\n");
		}
}
void Traversal()
{
	printf("顯示原來的預置數組裏同學的信息\n");
	printf("----------------------------------------------------------\n");
	printf("(1)先序遍歷預置數組裏同學的信息\n");
	printf("(2)中序遍歷預置數組裏同學的信息\n");
	printf("(3)後序遍歷預置數組裏同學的信息\n");
	printf("(0)返回主菜單\n");
	printf("----------------------------------------------------------\n");
	printf("請輸入你的選擇(0-3):\n");
    int i;
    scanf("%d",&i);
	switch(i){
		case 1:	{
				system("cls");
				printf("\n--------學號-------------姓名-----------性別-----------手機號碼-----\n");
				Preorder(BT);
				break;
				}
		case 2:{
				system("cls");
				printf("\n--------學號-------------姓名-----------性別-----------手機號碼-----\n");
				Inorder(BT);
				break;
				}
		case 3:{
				system("cls");
				printf("\n--------學號-------------姓名-----------性別-----------手機號碼-----\n");	
				Postorder(BT);
				break;
				}
		case 0:system("cls");
			break;
		}
}
void Find(){
	printf(" 查找同學的信息\n");
	printf("----------------------------------------------------------\n");
	printf("(1)按照學號查找同學的信息\n");
	printf("(2)按照姓名查找同學的信息\n");
	printf("(3)按照電話查找同學的信息\n");
	printf("(0)返回主菜單\n");
	printf("----------------------------------------------------------\n");
	printf("請輸入你的選擇(0-4): ");
	int i;
    scanf("%d",&i);
	if(i==1){
		int number;
		printf("\n請輸入學號:") ;
		scanf("%d",&number);
		FindBynum(BT,number);
		}
	else if(i==2){
		char name[N];
		printf("\n請輸入姓名:") ;
		scanf("%s",name);
		FindByname(BT,name);
		}
	else if(i==3){
		char phone[N];
		printf("\n請輸入手機號碼:") ;
		scanf("%s",phone);
		FindByphone(BT,phone);
		}
}
void Delete();//刪除 按學號、姓名、電話號碼
	void chazhao(BinTree BT, char name[]);
	void chazhao1(BinTree BT, char phone[]);
	BinTree DeleteBynum(BinTree BT,int number); 
	
Student *FindMin(BinTree BT)
{
	if(!BT){ //空的二叉樹,返回NULL
		return NULL;
		}
	else{
		if(!BT->Left)
		return BT; //找到最左葉的結點並返回
		else{
			return FindMin(BT->Left); //沿着左分支繼續查找
			}
		}
}

void chazhao(BinTree BT, char name[])//有名字查找學號 
{
	BinTree D;
	D=BT;
	if(D!=NULL)
	{	
	    chazhao(D->Left,name);
		chazhao(D->Right,name);
		if(strcmp(D->name,name)==0){
        De=D->number;
		}
    }
	}
void chazhao1(BinTree BT, char phone[]) //由電話查找學號 
{
	BinTree D;
	D=BT;
	if(D!=NULL){	
	    chazhao1(D->Left,phone);
		chazhao1(D->Right,phone);
		if(strcmp(D->phone ,phone)==0){
        	De2=D->number;
			}
    	}
}

BinTree DeleteBynum(BinTree BT,int number){	//由學號刪除 
	BinTree Tmp;
	if( !BT ) 
        printf("要刪除的元素未找到"); 
    else {
        if( number<BT->number ) 
            BT->Left = DeleteBynum( BT->Left, number );   /* 從左子樹遞歸刪除 */
        else if( number> BT->number  ) 
            BT->Right = DeleteBynum( BT->Right,number ); /* 從右子樹遞歸刪除 */
        else { 							/* BT就是要刪除的結點 */
            							/* 如果被刪除結點有左右兩個子結點 */ 
            if( BT->Left && BT->Right ) {
                						/* 從右子樹中找最小的元素填充刪除結點 */
                Tmp = FindMin( BT->Right );
                BT->number=Tmp->number;
                strcpy(BT->name,Tmp->name);
                strcpy(BT->phone,Tmp->phone);
                strcpy(BT->sex,Tmp->sex);
                						/* 從右子樹中刪除最小元素 */
                BT->Right = DeleteBynum( BT->Right, BT->number );
            }
            else { 						/* 被刪除結點有一個或無子結點 */
                Tmp = BT; 
                if( !BT->Left )     	/* 只有右孩子或無子結點 */
                    BT = BT->Right; 
                else                 	/* 只有左孩子 */
                    BT = BT->Left;
                free( Tmp );
            }
        }
    }
    return BT;
}
void Delete()//刪除按學號、姓名、電話號碼
{
	printf(" 刪除同學的信息\n");
	printf("----------------------------------------------------------\n");
	printf("(1)根據學號做爲索引刪除同學的信息\n");
	printf("(2)根據姓名作爲索引刪除同學的信息\n");
	printf("(3)根據電話做爲索引刪除同學的信息\n");
	printf("(0)返回主菜單\n");
	printf("----------------------------------------------------------\n");
	printf("請輸入你的選擇(0-3):\n");
	int i;
	scanf("%d",&i);
	if(i==1){
		int number;
		printf("請輸入學號:");
		scanf("%d",&number);
		DeleteBynum(BT,number);
		}
	else if(i==2){
		char name[N];
		printf("請輸入姓名:");
	    scanf("%s",name);
	    chazhao(BT,name);
	    DeleteBynum(BT,De);
		}
	else if(i==3){
		char phone[N];
		printf("請輸入手機號:"); 
	    scanf("%s",phone);
	    chazhao1(BT,phone); 
		DeleteBynum(BT,De2);
		}
	system("cls"); 
	printf("\n====================================================================\n");
	printf("\t*****************||  刪除成功! ||*****************\n");
	printf("====================================================================\n");
}
BinTree Add(int number,char name[],char sex[],char phone[],BinTree BT);//新增元素的添加(插入)
 
void Modify();//修改 按學號、姓名、電話號碼
	void ModifyBynum(BinTree BT,int number);
	void ModifyByname(BinTree BT,char name[]);
	void ModifyByphone(BinTree BT,char phone[]);

void add()//添加數據 
{
	int number;
	printf("\n==================================添加同學數據===============================\n"); 
	printf("\n");
	printf("請輸入學號:") ;
	scanf("%d",&number);
	printf("\n");
	printf("請輸入姓名:") ;
	char name[N];
	scanf("%s",name);
	char sex[N];
	printf("\n");
	printf("請輸入性別:") ;
	scanf("%s",sex);
	char phone[N];
	printf("\n");
	printf("請輸入手機號:") ;
	scanf("%s",phone);
	BT = Add(number,name,sex,phone,BT);
	system("cls");
}

BinTree Add(int number,char name[],char sex[],char phone[],BinTree BT)
{
	if(BT==NULL){		// 判斷根節點是否有人,沒有人則執行插入操作 
		BT=(Student*)malloc(len);
		BT->number=number;
		strcpy(BT->name,name);
		strcpy(BT->sex,sex);
		strcpy(BT->phone,phone);
		BT->Left=NULL;
		BT->Right=NULL;
		}
	else{ 		//如果根結點有人
		if(number<BT->number){		//如果插入的學號比根結點的學號小,則放在左孩子結點
			BT->Left=Add(number,name,sex,phone,BT->Left);
			} 
		
		else if(number>BT->number){		//插入的學號比根節點的學號要大,則放在右孩子結點
			BT->Right=Add(number,name,sex,phone,BT->Right);
			}
		
		else if(number=BT->number){
			printf("插入結點失敗,插入失敗的結點是%d%s\n:",number,BT->name);
			}
		}
	return BT;
}//插入失敗

	 
void ModifyBynum(BinTree BT,int number)//按學號修改 
{ 
	int k;
	if (BT != NULL){
		ModifyBynum(BT->Left,number);
		if(BT->number==number){
			printf("\t%d\t", BT->number);
			printf("%s\t", BT->name);
			printf("%s\t", BT->sex);
			printf("%s\n", BT->phone);
			while(1){
				printf("\n\n");
				printf(" 1: 姓名\n");
				printf(" 2: 性別\n");
				printf(" 3: 電話\n");
				printf(" 0:退出修改\n");
				scanf("%d",&k);
				switch(k){
					case 1:{
						char name[N];
						printf("請輸入名字:");
						scanf("%s",&name);
						strcpy(BT->name,name);
						}break;
				
					case 2:{
						char sex[N];
						printf("請輸入性別:");
						scanf("%s",&sex);
						strcpy(BT->sex,sex);
						}break;
				
					case 3:{
						char phone[N];
						printf("請輸入新號碼:");
						scanf("%s",phone);
						strcpy(BT->phone,phone);
						}break;
				
					case 4:{
						printf("\t學號\t姓名\t性別\t電話\n");
						printf("\t%d\t",BT->number);
						printf("%s\t",BT->name);
						printf("%s\t",BT->sex);
						printf("%s\n",BT->phone);
						printf("\n");
					}break;
					
					case 0:break;
				}
				if(k==0)break;
			}
			system("cls");
		}
	ModifyBynum(BT->Right,number);
	}
}

void ModifyByname(BinTree BT,char name[])//按姓名修改 
{ 
	int k;
	if(BT != NULL){
		ModifyByname(BT->Left,name);
		if(strcmp(BT->name,name)==0){
			printf("\t%d\t", BT->number);
			printf("%s\t", BT->name);
			printf("%s\t", BT->sex);
			printf("%s\n", BT->phone);
			while(1){
				printf("\n\n");
				printf(" 1: 姓名\n");
				printf(" 2: 性別\n");
				printf(" 3: 電話\n");
				printf(" 0:退出修改\n");
				scanf("%d",&k);
				switch(k){
					case 1:{
						char name[N];
						printf("請輸入名字:");
						scanf("%s",&name);
						strcpy(BT->name,name);
						}break;
				
					case 2:{
						char sex[N];
						printf("請輸入性別:");
						scanf("%s",&sex);
						strcpy(BT->sex,sex);
						}break;
				
					case 3:{
						char phone[N];
						printf("請輸入新號碼:");
						scanf("%s",phone);
						strcpy(BT->phone,phone);
						}break;
				
					case 4:{
						printf("\t學號\t姓名\t性別\t電話\n");
						printf("\t%d\t",BT->number);
						printf("%s\t",BT->name);
						printf("%s\t",BT->sex);
						printf("%s\n",BT->phone);
						printf("\n");
					}break;
					
					case 0:break;
				}
				if(k==0)break;
			}
		system("cls");
		}
	ModifyByname(BT->Right,name);
	}
}
 	 
void ModifyByphone(BinTree BT,char phone[])//按手機號修改 
{ 
	int k;
	if(BT != NULL){
		ModifyByphone(BT->Left,phone);
		if(strcmp(BT->phone,phone)==0){
			printf("\t%d\t", BT->number);
			printf("%s\t", BT->name);
			printf("%s\t", BT->sex);
			printf("%s\n", BT->phone);
			while(1){
				printf("\n\n");
				printf(" 1: 姓名\n");
				printf(" 2: 性別\n");
				printf(" 3: 電話\n");
				printf(" 0:退出修改\n");
				scanf("%d",&k);
				switch(k){
					case 1:{
						char name[N];
						printf("請輸入名字:");
						scanf("%s",&name);
						strcpy(BT->name,name);
						}break;
				
					case 2:{
						char sex[N];
						printf("請輸入性別:");
						scanf("%s",&sex);
						strcpy(BT->sex,sex);
						}break;
				
					case 3:{
						char phone[N];
						printf("請輸入新號碼:");
						scanf("%s",phone);
						strcpy(BT->phone,phone);
						}break;
				
					case 4:{
						printf("\t學號\t姓名\t性別\t電話\n");
						printf("\t%d\t",BT->number);
						printf("%s\t",BT->name);
						printf("%s\t",BT->sex);
						printf("%s\n",BT->phone);
						printf("\n");	
						}break;
						 
					case 0:break;
					}	
				if(k==0)
				break;
			}
		system("cls");
		}
	ModifyByphone(BT->Right,phone);
	}
}

void Modify(){			//修改 按學號、姓名、電話號碼
	printf(" 修改同學的信息\n");
	printf("----------------------------------------------------------\n");
	printf("(1)根據學號做爲索引修改同學的信息\n");
	printf("(2)根據姓名作爲索引修改同學的信息\n");
	printf("(3)根據電話做爲索引修改同學的信息\n");
	printf("(0)返回主菜單\n");
	printf("----------------------------------------------------------\n");
	printf("請輸入你的選擇(0-3):\n");
	int i;
    scanf("%d",&i);
	if(i==1){
	int number;
	printf("請輸入學號:");
	scanf("%d",&number);
	ModifyBynum(BT,number);}
	else if(i==2){
		char name[N];
		printf("請輸入姓名:");
	    scanf("%s",name);
		ModifyByname(BT,name);
		}
	else if(i==3){
		char phone[N];
		printf("請輸入手機號:"); 
	    scanf("%s",phone);
		ModifyByphone(BT,phone);
		}
}	
//主函數 
int main(){

	//預置數組信息
	BT=Add(01,"張常超","男","15537271222",BT);
	BT=Add(02,"劉鵬翔","男","15514902622",BT);
	BT=Add(03,"程龍","男","12345678901",BT);
	 int n=-1;
	 while(n!=0){
	 // 系統首頁 
	 printf("\n\t\t\t *********************");
	 	printf("\n\t\t\t||   同學錄管理系統  ||\n");
		printf("*******************************************************************\n");
		printf(" 1:顯示原來的預置數組裏同學的信息 \n\n");
		printf(" 2:查找同學的信息 \n\n");
		printf(" 3:修改同學錄信息 \n\n");
		printf(" 4:添加新同學信息 \n\n");
		printf(" 5:刪除同學錄信息 \n\n");
		printf(" 0:退出該系統\n\n");
		printf("*******************************************************************\n");
		printf("選擇您要進行的操作前的序號(0~5): ");
	 	scanf("%d",&n); 
	 	system("cls");
	 	
	 	switch(n){
		 	case 0:{
				break;
			 }
			case 1:{
				Traversal();
				break;
				}
			case 2:{
				Find();
				break;
				}
		 	case 3:{
		 		Modify();
				break;
				}
			case 4:{
				add();
				break;
				}
			case 5:{
				Delete();
				break;
				}
		}
	 	
	} 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章