天天看點

C 實作通訊錄需求分析:系統設計:知識點:

需求分析:

1.添加聯系人

2.通過關鍵字查詢

3.檢視所有聯系人 和詳細資訊

4.删除聯系人

5.排序

系統設計:

1.結構體儲存聯系人資訊. 

2 結構體數組存儲多個聯系人

3 檔案儲存資料 提高效率

宏定義: FOMAT 格式化輸出 DATA 對結構體中所有成員的引用

知識點:

1. C++ I/O 标準庫詳解

C++輸入輸出的概念:

從作業系統的角度看,每一個與主機相連的輸入輸出裝置都被看作一個檔案。

程式的輸入指的是從輸入檔案将資料傳送給程式,程式的輸出指的是從程式将資料傳送給輸出檔案。

C++輸入輸出包含以下三個方面的内容:

  1. 對系統指定的标準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。這種輸入輸出稱為标準的輸入輸出,簡稱标準I/O。
  2. 以外存磁盤檔案為對象進行輸入和輸出,即從磁盤檔案輸入資料,資料輸出到磁盤檔案。以外存檔案為對象的輸入輸出稱為檔案的輸入輸出,簡稱檔案I/O。
  3. 對記憶體中指定的空間進行輸入和輸出。通常指定一個字元數組作為存儲空間(實際上可以利用該空間存儲任何資訊)。這種輸入和輸出稱為字元串輸入輸出,簡稱串I/O。

在C++的輸入輸出中,編譯系統對資料類型進行嚴格的檢查,凡是類型不正确的資料都不可能通過編譯。是以C++的I/O操作是類型安全(type safe)的。

可擴充性是C++輸人輸出的重要特點之一,它能提高軟體的重用性,加快軟體的開 發過程。

C++通過I/O類庫來實作豐富的I/O功能。

輸入和輸出是資料傳送的過程,資料如流水一樣從一處流向另一處。C++形象地将此過程稱為流(Stream)。C++的輸入輸出流是指由若幹位元組組成的宇節序列。在輸入操作時,位元組流從輸入裝置(如鍵盤、磁盤)流向記憶體,在輸出操作時,位元組流從記憶體流向輸出裝置(如螢幕、列印機、磁盤等)。流中的内容可以是ASCII字元、二進制形式的資料、圖形圖像、數字音頻視訊或其他形式的資訊。

實際上,在記憶體中為每一個資料流開辟一個記憶體緩沖區,用來存放流中的資料。當用cout和插入運算符“<<”向顯示器輸出資料時,先将這些資料送到程式中的輸出緩沖區儲存,直到緩沖區滿了或遇到endl,就将緩沖區中的全部資料送到顯示器顯示出來。在輸入時,從鍵盤輸入的資料先放在鍵盤的緩沖區中,當按Enter鍵時,鍵盤緩沖區中的資料輸入到程式中的輸入緩沖區,形成cin流,然後用提取運算符“ >>”從輸入緩沖區中提取資料送給程式中的有關變量。總之,流是與記憶體緩沖區相對應的,或者說,緩沖區中的資料就是流。

在C++中,輸入輸出流被定義為類。C++的I/O庫中的類稱為流類(stream class)。 用流類定義的對象稱為流對象。

                                                         表1.1 I/O類庫

C 實作通訊錄需求分析:系統設計:知識點:

https://blog.csdn.net/u012372584/article/details/39186129  更多I/O 詳解

2 .getch():   所在頭檔案:conio.h   函數用途:從控制台讀取一個字元,但不顯示在螢幕上 

程式結尾加上getch()讓程式運作視窗(dos視窗)停留顯示。會等待你按下任意鍵之後,把該鍵字元所對應的ASCII碼賦給ch,再執行下面的語句。

3. %-10s

- 左對齊 10 寬度 s字元串

#include<cstdio>
#include<cstdlib>  
#include<cstring> 
#include<conio.h>
#include<dos.h>

//telebook 結構體占用的位元組數 
#define LEN sizeof(struct telebook)
#define FORMAT "%-10s%-15s%-25s%-30s\n"
#define DATA info[i].name,info[i].tel,info[i].email,info[i].address



struct telebook{
	char name[10];
	char tel[15];
	char email[25];
	char address[30];
};

struct telebook info[100];//結構體數組 每一個元素都是一個telebook結構體 

//函數聲明
void input();
void add();
void search();
void update();
void del();
void display();
void sort();
void menu();

void menu(){
	system("cls");//調用system函數來清零
	printf("\n\n\n\n\n"); 
	printf("\t\t|--------contact--------------|\n");//\t tab
	printf("\t\t| 0. exit               |\n");
	printf("\t\t| 1. add                |\n");
	printf("\t\t| 2. search              |\n");
	printf("\t\t| 3. update               |\n");
	printf("\t\t| 4. del              |\n");
	printf("\t\t| 5. sort              |\n");
	printf("\t\t| 6.displayall               |\n");
	printf("\t\t| --------------------------|\n");
	printf("\t\t| please choose(0-6)              |\n");
} 

int main(){
int n;
menu();
scanf("%d",&n);
while(n){
	switch(n){
		case 1: input(); break;
		case 2: search(); break;
		case 3: update(); break;
		case 4: del(); break;
		case 5:sort(); break;
		case 6: display(); break;
		default: break;
	}
	getch();
	menu();
	scanf("%d",&n);
} 
return 0;
}

void input(){
	int i,count=0;
	char ch[2];
	FILE *fp;//指向檔案的指針變量
	//打開失敗的話 
	if((fp=fopen("data.txt","a+"))==NULL) {
	//以附加形式打開檔案,不存在則建立,存在則附加資訊在檔案尾部 ,檔案打開失敗 指針會傳回空值 
	printf("can not open\n");
	return;
	} 
	while(!feof(fp)){
		//檢測結束符  EOF就是結束 feof函數遇到EOF傳回0
		//沒有結束的話,統計檔案中的記錄條數,讀取到結構體數組中 
		if(fread(&info[count],LEN,1,fp)==1)
		//接受資料初始位址 位元組數 每次讀取資料項個數 輸入流(從哪個檔案讀) 
			count++; 
	}
	fclose(fp);//記憶體操作 關閉檔案
	//目前是通訊錄是否為空 
	if(count==0)
		printf("no record\n");
	//不為空先清零 
	else{
			system("cls");
			display();
		}
	
	//打開失敗的話 
	if((fp=fopen("data.txt","wb"))==NULL) {
		//隻寫 打開
			printf("open fail\n");
			return;
		}
	for(i=0;i<count;i++)
		//把info内容又寫回磁盤檔案data中 
			fwrite(&info[count],LEN,1,fp);
	printf("please input(y/n)");
	scanf("%s",ch);
	while(strcmp(ch,"y")==0) {
		printf("name:");
		scanf("%s",&info[count].name);
		//看看是不是存過了
		for(i=0;i<count;i++){
			if(strcmp(info[i].name,info[count].name)==0){
				printf("already exists");
				getch();
				fclose(fp);
				return;
			}
		}
		printf("tel:");
		scanf("%s",&info[count].tel);
		printf("email:");
		scanf("%s",&info[count].email);
		printf("address:");
		scanf("%s",&info[count].address);
		//新錄入資訊寫到磁盤檔案中
		if(fwrite(&info[count],LEN,1,fp)!=1) 
		{
			printf("save fail");
			getch();
		}
		else{
			printf("%s saved!\n",info[count].name);
			count++;
		}
		printf("continue? y/n:");
		scanf("%s",ch);
		//持續輸入 scanf 
		} 
			fclose(fp);
			printf("ok");
}

void search(){
	FILE *fp;
	int i,count=0;
	char ch[2],name[15];
	//先取到記憶體中
	if((fp=fopen("data.txt","rb"))==NULL)
	{//以二進制形式打開
		printf("open fail\n");
		return; 	
	 } 
	 while(!feof(fp))
	 	if(fread(&info[count],LEN,1,fp)==1)
	 		count++;//記錄總數
		fclose(fp);
		//判斷通訊錄為空的情況
		if(count==0)
		 {
			printf("no record\n");
			return;
		}
		printf("please input the name:");
		scanf("%s",name);
		for(i=0;i<count;i++)
		
			if(strcmp(name,info[i].name)==0)
			{
				printf("find it,display?(y/n)\n");
				scanf("%s",ch);
				if(strcmp(ch,"y")==0)
				{
					printf("name       tel        email	      address\t\n");
					printf(FORMAT,DATA);
				}
				break;
			}
		
		if(i==count) printf("can not find");

 }


void update()
{
	FILE *fp;
	int i,j,count=0;
	char name[15];
	if((fp=fopen("data.txt","r+"))==NULL)
	{
		printf("open fail\n");
		return;
		}
	while(!feof(fp))//是否到尾部 
		if(fread(&info[count],LEN,1,fp)==1)
			count++;
	if(count==0)//沒記錄 
	{
		printf("no record!\n");
		fclose(fp);
		return;
		}
	display();
	printf("update name:");
	scanf("%s",name);
	for(i=0;i<count;i++){
		if(strcmp(name,info[i].name)==0)
		{
			printf("find!update name:");
			scanf("%s",&info[i].name);
			printf("tel:");
			scanf("%s",&info[count].tel);
			printf("email:");
			scanf("%s",&info[count].email);
			printf("address:");
			scanf("%s",&info[count].address);
			printf("update succesful!");
			//just儲存到了數組中還要寫回磁盤就是檔案
			if((fp=fopen("data.txt","wb"))==NULL)
			{
				printf("open fail!");
				return;
			 } 
			 for(j=0;j<count;j++)
			 	if(fwrite(&info[j],LEN,1,fp)!=1)
			 	{
			 		printf("save failed!");
			 		getch();
				 }
			 fclose(fp);
			 return;
		}
	}
	printf("can not find");
}

void del()
{
	FILE *fp;
	int i,j,count=0;
	char ch[2];
	char name[15];
	if((fp=fopen("data.txt","r+"))==NULL)
	{
		printf("can not open\n");
		return;
	}
	while(!feof(fp))
		if(fread(&info[count],LEN,1,fp)==1)
		   count++;
	fclose(fp);
	if(count==0)
	{
		printf("no record");
		return;
	 } 
	 display();
	 printf("the name:");
	 scanf("%s",name);
	 for(i=0;i<count;i++)
	 {
	 	if(strcmp(name,info[i].name)==0)
	 	{
	 		printf("find it del?y/n");
	 		scanf("%s",ch);
	 		if(strcmp(ch,"y")==0)
	 		//i後的元素前移 
	 			for(j=i;j<count;j++)
	 				info[j]=info[j+1];
	 		count--;
	 		if((fp=fopen("data.txt","wb"))==NULL)
	 		{
	 			printf("open failed\n");
	 			return;
			 }
			 
			 for(j=0;j<count;j++)
			 	if(fwrite(&info[j],LEN,1,fp)!=1)
			 	{
			 		printf("can not save");
			 		getch();
				 }
			fclose(fp);
			printf("del!");
			return;
		 }
	 }	 
	 printf("not find");
}

void sort()
{
	FILE *fp;
	struct telebook t;//中間量
	int i=0,j=0,count=0;
	if((fp=fopen("data.txt","r+"))==NULL)
	{
		printf("can not open\n");
		return;
	}
	while(!feof(fp))
		if(fread(&info[count],LEN,1,fp)==1)
		   count++;
	fclose(fp);
	if(count==0)
	{
		printf("no record");
		return;
	 } 
	for(i=0;i<count-1;i++)
		for(j=i+1;j<count;j++)
			if(strcmp(info[i].name,info[j].name)>0)
				{
					t=info[i];
					info[i]=info[j];
					info[j]=t;
				}
	if((fp=fopen("data.txt","wb"))==NULL)
	{
		printf("can not open\n");
		return;
	}
	for(j=0;j<count;j++)
			 	if(fwrite(&info[j],LEN,1,fp)!=1)
			 	{
			 		printf("save failed!");
			 		getch();
				 }
			 fclose(fp);
			 printf("saved");
	
}

void display()
{
	FILE *fp;
	int i,count=0;
//	fp=fopen("data.txt","rb");
	if((fp=fopen("data.txt","rb"))==NULL)
	{//以二進制形式打開
		printf("open fail\n");
		return; 	
	 } 
while(!feof(fp)){
		//檢測結束符  EOF就是結束 feof函數遇到EOF傳回0
		//沒有結束的話,統計檔案中的記錄條數,讀取到結構體數組中 
		if(fread(&info[count],LEN,1,fp)==1)
		//接受資料初始位址 位元組數 每次讀取資料項個數 輸入流(從哪個檔案讀) 
			count++; 
	}
	fclose(fp);
	printf("name       tel         email       	address\t\n");
	for(i=0;i<count;i++)
		printf(FORMAT,DATA);
		
}
           

優化學習目标:用連結清單實作的通訊錄

作者:const

https://blog.csdn.net/cheng__lu/article/details/80373467

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include <WinSock2.h> /*socket通信,系統頭檔案*/
#include <windows.h>
#define OK     1  
#define ERROR  0  
#define MIX    100  
typedef int Status ;  
typedef char ElemType;  
//結點定義  
typedef struct telebook    //通訊錄結點資料域    
{    
    char name[MIX];        //姓名
	char telephone[MIX];   //電話号碼 
    char address[MIX];     //位址  
    char Email[MIX];      //郵箱        
}telebook;   
 
 
typedef struct LNode      //連結清單結點  
{      
    telebook data; //結點資料域     
    struct LNode *next;  //結點指針域    
}LNode,*LinkList;  
 
 
  
//讀取文本資訊  
void readFile(LinkList &L);                       
  
//單連結清單的初始化   
Status  InitList_L(LinkList &L);  
  
void Find_Name(LinkList &L); //按姓名查詢  
  
void Find_Num(LinkList &L); //按姓名查詢  
  
Status  CreateFromTail(LinkList &L);     //采用尾插法在尾部插入元素  
  
//初始條件:線性表L已經存在  
//在單鍊線性表L的第i個元素之前插入元素  
Status ListInsert_L(LinkList &L);  
  
//在單鍊線性表L的姓名元素之前插入元素  
Status ListInsert_LName(LinkList &L);  
Status Fund_LName(LinkList &L);  //尋找該姓名的位置  
  
//初始條件:線性表L已經存在  
//删除第i個元素  
Status ListDelete_L(LinkList &L);  
  
Status ListDelete_LName(LinkList &L);   //删除姓名為“XXX”的學生記錄  
  
void saveFile(LinkList &L);  //儲存通訊錄到檔案  
  
//初始條件:線性表L已經存在  
//列印出所有元素  
void PrintElem(LinkList L);  
  
void List_free(LinkList L);  //銷毀連結清單  
   
//單連結清單的初始化  
Status  InitList_L(LinkList &L)  
{  
    L =(LNode *)malloc(sizeof(LNode));   //申請結點空間   
    if(L == NULL)                       //判斷是否有足夠的記憶體空間   
        printf("申請記憶體空間失敗\n");  
    L->next = NULL;                  //将next設定為NULL,初始長度為0的單連結清單   
    return OK;  
}   
  
void readFile(LinkList &L)          //讀取檔案資訊  
{  
    LinkList q,p;    
    FILE *fp;    
    p=L;    
    q=(LNode*)malloc(sizeof(LNode));      
    char name[20]="telebook.txt";    //建立telebook檔案,按行輸入資訊(姓名 電話 日期  電子郵箱)即可
    if((fp= fopen(name,"r"))==NULL)  
    {  
        printf("error\n");  
        exit(0);  
    }  
    while(p->next!=NULL )    
    {    
        p=p->next;              
    }    
    while(fscanf(fp,"%s%s%s%s\n",q->data.name,q->data.telephone,q->data.address,q->data.Email)!=EOF)    
    {    
        q->next=NULL;    
        p->next=q;    
        p=q;    
        q=(LNode*)malloc(sizeof(LNode));  
    }  
    fclose(fp);     
}  
void tip()
{
    printf("                      ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
	printf("                                 歡迎進入通訊錄\n");
	printf("                      ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n\n");
    printf("	             1:顯示功能       |	     2:增加功能     \n\n");  
    printf("	             3:删除功能       |	     4:待定功能     \n\n");  
    printf("	             5:查詢功能       |      6:待定功能  \n\n");  
    printf("	             7:待定功能       |	     8:待定功能     \n\n");  
    printf("	             0:退出功能       |	      \n\n");  
    printf("--------------------------------------------------------------------------------\n");  
}
 
void tip1()
{
	printf("--------------------------------------------------------------------------------\n"); 
    printf("	             1:顯示功能       |	     2:增加功能     \n\n");  
    printf("	             3:删除功能       |	     4:待定功能     \n\n");  
    printf("	             5:查詢功能       |      6:待定功能  \n\n");  
    printf("	             7:待定功能       |  	 8:待定功能     \n\n");  
    printf("	             0:退出功能       |	      \n\n");  
    printf("--------------------------------------------------------------------------------\n");   
}
  
void Find_Name(LinkList &L) //按姓名查詢      
{      
    LinkList q,p;      
    q=L->next;      
    printf("輸入要查詢的姓名:\n");      
    p=(LNode*)malloc(sizeof(LNode));      
    scanf("%s",p->data.name);      
    while(q!=NULL&&strcmp(q->data.name,p->data.name)!=0)      
    {      
        q=q->next;      
    }      
    if(q==NULL)      
    {      
        printf("通訊錄中沒有這個姓名!\n");      
    }      
    else      
    {		 printf("已經找到此聯系人!\n");    
            printf("-------------------------------------------------------------------------------\n");
			printf("    姓名        電話号碼             位址             郵箱         \n");
			printf("-------------------------------------------------------------------------------\n");         
        printf(" %s        %s          %s             %s                           \n",p->data.name,p->data.telephone,p->data.address,p->data.Email);        
    }      
}      
  
void Find_Num(LinkList &L) //按号碼查詢      
{      
    LinkList q,p;      
    q=L->next;      
    printf("輸入要查詢的号碼:\n");      
    p=(LNode*)malloc(sizeof(LNode));      
    scanf("%s",p->data.telephone);      
    while(q!=NULL&&strcmp(q->data.telephone,p->data.telephone)!=0)      
    {      
        q=q->next;      
    }      
    if(q==NULL)      
    {      
        printf("通訊錄中沒有這個号碼!\n");      
    }      
    else      
    {   printf("已經找到此聯系人!\n");    
              	printf("-------------------------------------------------------------------------------\n");
			printf("    姓名        電話号碼             位址             郵箱         \n");
			printf("-------------------------------------------------------------------------------\n");           
        printf(" %s        %s          %s             %s                           \n",p->data.name,p->data.telephone,p->data.address,p->data.Email);         
    }      
}      
  
  
Status  CreateFromTail(LinkList &L)     //采用尾插法在尾部插入元素  
{  
    LinkList r, s;  
    r=L;   //r指針始終動态指向連結清單的目前表尾  
    while(r->next)  
    {//尾插法,直接把指針移位到尾部    
        r=r->next;   
    }  
    s=(LinkList)malloc(sizeof(LNode));   
    printf("在尾部插入的聯系人資訊為:\n");  
            printf("-------------------------------------------------------------------------------\n");
			printf("    姓名        電話号碼             位址             郵箱         \n");
			printf("-------------------------------------------------------------------------------\n");     
    scanf("%s%s%s%s",s->data.name,s->data.telephone,s->data.address,s->data.Email);  
    s->next=NULL;  
    r->next=s;  
	saveFile(L);
    return OK;  
}  
      
//初始條件:線性表L已經存在  
//在單鍊線性表L的第i個元素之前插入元素  
Status ListInsert_L(LinkList &L)  
 {  
    LinkList s,p=L;  
    int  j = 1,i;  
    printf("輸入要插入的位置:");      
    scanf("%d",&i);  
    while (p&&j < i)   
    {  // 尋找第i個結點  
       p = p->next;  
       ++j;  
    }   
    if (!p || j > i) {printf("----無此位置添加失敗-----\n");return ERROR;}      // i小于1或者大于表長  
    s = (LinkList)malloc(sizeof(LNode));  // 生成新結點  
    printf("插入的聯系人資訊為:\n");  
            printf("-------------------------------------------------------------------------------\n");
			printf("    姓名        電話号碼             位址             郵箱         \n");
			printf("-------------------------------------------------------------------------------\n");    
    scanf("%s%s%s%s",s->data.name,s->data.telephone,s->data.address,s->data.Email);    
    s->next = p->next;      // 插入L中  
    p->next = s; 
	saveFile(L);
    return OK;  
} // LinstInsert_L  
  
  
Status Fund_LName(LinkList &L)  //尋找該姓名的位置  
 {  
    LinkList s,p=L->next;  
    int  i=0;  
    s=(LNode*)malloc(sizeof(LNode));  
    scanf("%s",s->data.name);  
    while(p!=NULL&&strcmp(p->data.name,s->data.name)!=0)  
    {  
        p=p->next;  
        ++i;  
    }  
    return i+1;  
}  
  
//在單鍊線性表L的姓名元素之前插入元素  
Status ListInsert_LName(LinkList &L)  
{     
    LinkList s,q=L,p=L->next;  
    printf("輸入要在誰的姓名之前添加資訊:");  
    int i=Fund_LName(L);  
    int j=1;  
    while (q&&j < i-1)   
    {  // 尋找第i-1個結點  
          q = q->next;  
          ++j;  
    }   
    if (p==NULL) {printf("----查無此人添加失敗-----\n");return ERROR;}      // 如果沒有找到  
    s = (LinkList)malloc(sizeof(LNode));  // 生成新結點  
    printf("插入的聯系人資訊為:\n");  
            	printf("-------------------------------------------------------------------------------\n");
			printf("    姓名        電話号碼             位址             郵箱         \n");
			printf("-------------------------------------------------------------------------------\n");     
    scanf("%s%s%s%s",s->data.name,s->data.telephone,s->data.address,s->data.Email);    
    s->next = q->next;      // 插入L中  
    q->next = s;  
	saveFile(L);
    return OK;      
}  
  
//初始條件:線性表L已經存在  
//删除第i個元素  
Status ListDelete_L(LinkList &L)   
{  
    LinkList p=L,q;  
    int  j = 1,i;  
    printf("輸入要删除的位置:");      
    scanf("%d",&i);  
    while (p->next && j < i)   
    {  // 尋找第i個結點,并令p指向其前趨  
      p = p->next;    ++j;  
    }  
    if (!(p->next) || j > i) {printf("----查無此人删除失敗-----\n");return ERROR;}  // 删除位置不合理  
    q = p->next;      
    p->next = q->next;           // 删除并釋放結點    
    free(q);  
    printf("----删除成功-----\n");  
	saveFile(L);
    return OK;  
} // ListDelete_L  
  
Status ListDelete_LName(LinkList &L)   //删除姓名為“XXX”的學生記錄  
{  
    LinkList p=L,q;  
    printf("輸入要删除的學生的姓名:");  
    int  j = 0,i=Fund_LName(L);       
    while (p->next && j < i-1)   
    {  // 尋找第i個結點,并令p指向其前趨  
      p = p->next;    ++j;  
    }  
    if (!(p->next) || j > i-1) {printf("----查無此人删除失敗-----\n");return ERROR;}  // 删除位置不合理  
    q = p->next;      
    p->next = q->next;           // 删除并釋放結點    
    free(q);  
    printf("----删除成功-----\n");  
	saveFile(L);
    return OK;  
}  
 
 
 
//初始條件:線性表L已經存在  
//列印出所有元素  
void PrintElem(LinkList L)  
{  
    LinkList p=L->next ;  
    printf("目前的資訊為:\n");  
	        printf("-------------------------------------------------------------------------------\n");
			printf("    姓名        電話号碼             位址             郵箱         \n");
			printf("-------------------------------------------------------------------------------\n");    
    while(p!=NULL)  
    {  
            printf(" %s        %s          %s             %s                           \n",p->data.name,p->data.telephone,p->data.address,p->data.Email);  
        p=p->next;  
    }  
    printf("\n");  
}  
  
void saveFile(LinkList &L)  //儲存通訊錄到檔案    
{      
    FILE*fp;      
    LinkList p;      
    p=L;      
    if((fp=fopen("telebook.txt","wt"))==NULL)   exit(0);   // "wt"方式打開檔案時,如果源檔案中有内容,追加              
    if(p==NULL||p->next==NULL) //連結清單為空      
        printf("您的操作有誤,請確定您的通訊錄不為空!\n");      
    else      
    {    
        p=p->next;    
        while(p!=NULL)   
        {     
            fprintf(fp,"%s       %s\t      %s          %s",p->data.name,p->data.telephone,p->data.address,p->data.Email);  
            fprintf(fp,"\n");            
            p=p->next;          
        }      
        fclose(fp);    
       printf("通訊錄已儲存!\n");      
    }      
}  
  
void List_free(LinkList L)  //銷毀連結清單  
{    
    LinkList p;       
    while(L!= NULL)    
    {    
        p=L;    
        L=L->next;    
        free(p); 
		exit(0);
		//system("exit");
    }    
}    
  
 
  
int main()  
{   int n; 
    char class2,class3,class5,class6;
    LinkList L;     
    InitList_L(L);   //初始化連結清單
	tip();       //printf
	readFile(L);      //讀取檔案
	for(;;)
	{
		printf("請選擇<1-8>,退出<0>:");  
		scanf("%d",&n);
		if(n>8)
			break;
    
		switch(n)      
		{  
			/*	功能:讀取檔案并顯示結果,顯示功能*/
    case 1:               
		{
			system("cls");    //清屏  
			
			PrintElem(L);      //顯示檔案結果
           
		    tip1();
				
		}
           break;    
		   
		   /*	功能:插入,增加功能*/
 
    case 2:
		{
			system("cls");	
			printf("-------------------------------------------------------------------------------\n");
			printf(" A-在末尾添加****B-添加在第i條之前****C-添加在“xxx”之前****\n");
			printf("-------------------------------------------------------------------------------\n");
			printf("請選擇>>:");
					
			fflush(stdin);      /*fflush(stdin)是用來清空輸入緩沖區,
								通常是為了確定不影響後面的資料讀取,
								例如在讀完一個字元串後緊接着又要讀取一個字元,
								此時應該先執行fflush(stdin)。*/
			scanf("%c",&class2);
			if(class2=='A'||class2=='a')
				CreateFromTail(L); 
			if(class2=='B'||class2=='b')
				ListInsert_L(L);  
			if(class2=='C'||class2=='c')
				ListInsert_LName(L);
			
		   tip1();
				}
           break;  
 
 
		   /*删除功能*/
    case 3:
		{  system("cls");//清屏 
			
				    printf("-------------------------------------------------------------------------------\n");
					printf("            A-删除第i條記錄****B-删除姓名為“xxx”的聯系人********\n");
					printf("-------------------------------------------------------------------------------\n");
					printf("請選擇>>:");
					
					fflush(stdin);
					scanf("%c",&class3);
					if(class3=='A'||class3=='a')
					ListDelete_L(L);  
					if(class3=='B'||class3=='b')
						ListDelete_LName(L);
 
					tip1();
		}
           break;  
 
 
 
		  /*修改功能*/
    case 4:
		{
			system("cls");//清屏  
 
 
           
		   	tip1();
				}
           break;  
 
 
 
         /*    查詢功能    */
 
    case 5:
		{
					system("cls");//清屏  
				    printf("-------------------------------------------------------------------------------\n");
					printf("            A-通過姓名查找聯系人****B-通過電話号碼查找聯系人********\n");
					printf("-------------------------------------------------------------------------------\n");
					printf("請選擇>>:");
					
					fflush(stdin);
					scanf("%c",&class5);
					if(class5=='A'||class5=='a')
						Find_Name(L);   
					if(class5=='B'||class5=='b')
						Find_Num(L);  	
			
					 tip1();
				}
           break;  
 
 
			//	功能:排序
    case 6:
		{		    system("cls");//清屏  
					printf("-------------------------------------------------------------------------------\n");
					printf("            A-通過姓名排序通訊錄****B-通過電話号碼排序通訊錄********\n");
					printf("-------------------------------------------------------------------------------\n");
					printf("請選擇>>:");
					
					fflush(stdin);
					scanf("%c",&class6);
					if(class6=='A'||class6=='a')
						//  
					if(class6=='B'||class6=='b')
						//  	
 
					tip1();
					}
           break;  
 
 
 
    case 8:
		{	system("cls");//清屏
			
             
		   tip1();
				
		}
           break;  
 
		   /*	退出  */
    case 0:
		{	
		   //List_free(L); 
	    
         system("cls");  //清屏 
		 List_free(L);      
         
		 
           
		  
		}
           break;  
    }  
    }  
    
    
    return 0; 
}