同學錄管理系統
實現學生通訊錄管理的幾個操作功能(新建、插入、刪除、從文件中讀取、寫入文件和查詢、屏幕輸出等功能)。通訊錄中學生的信息有學號、姓名、出生日期、性別、電話和地址等。
[內容]
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;
}
}
}
}