【練習】製作簡易通訊錄

Time-space發表於2017-11-19

  通訊錄中可管理多人的聯絡資訊,由於不能預知系統中需要管理多少聯絡人的資訊,因此使用連結串列將是一種好方案。下面實現一個簡易的通訊錄,其包括新增聯絡人、查詢聯絡人、刪除聯絡人和顯示聯絡人四個功能。


這裡寫圖片描述

  • 定義通訊錄結構
      在DATA結構中,必須定義一個名為key 的字串,作為查詢的關鍵字,其他欄位可根據需要進行增刪。
      仍然使用上述連結串列實現的標頭檔案和函式檔案。
#include <stdio.h>
typedef struct
{
    char key[15];   //關鍵字(設定姓名為關鍵字)
    char addr[20];
    char telephone[15];
    char mobile[12];
}DATA;  //資料結點型別 
  • 鏈式線性表
typedef struct Node
{
    DATA data;
    struct Node *next;
}ChainListType;
ChainListType *ChainListAddFirst(ChainListType *head,DATA data)
{
    ChainListType *node,*h;
    if(!(node=(ChainListType *)malloc(sizeof(ChainListType))))
    {
        printf("為儲存結點資料申請記憶體失敗!\n");
        return NULL;  //分配記憶體失敗
    }
    node->data=data; //儲存資料
    node->next=head;  //指向頭指標所指結點
    head=node;        //頭指標指向新增結點
    return head;
}

ChainListType *ChainListFind(ChainListType *head,char *key) //按關鍵字在連結串列中查詢內容
{
    ChainListType *h;
    h=head;       //儲存連結串列頭指標
    while(h)      //若結點有效,則進行查詢
    {
        if(strcmp(h->data.key,key)==0) //若結點關鍵字與傳入關鍵字相同
            return h;  //返回該結點指標
        h=h->next; //處理下一結點
    }
    return NULL; //返回空指標
}

int ChainListDelete(ChainListType *head,char *key)
{
    ChainListType *node,*h;
    node=head;   //node儲存刪除結點的前一結點
    h=head;    //h為移動指標
    while(h)
    {
        if(strcmp(h->data.key,key)==0) //找到關鍵字,執行刪除操作
        {
            node->next=h->next;  //使前一結點指向當前結點的下一結點
            free(h);  //釋放記憶體
            return 1;
        }else{
            node=h;  //指向當前結點
            h=h->next; //指向下一結點
        }
     }
     return 0;//未刪除
}
  • 顯示聯絡人資訊
void ChainListAll(ChainListType *head) //遍歷連結串列 
{
    ChainListType *h;
    DATA data;
    h=head;
    printf("連結串列所有資料如下:\n"); 
    while(h) //迴圈處理連結串列每個結點 
    {
        data=h->data;//獲取結點資料 
        printf("姓名:%s\n",data.key);
        printf("地址:%s\n",data.addr);
        printf("電話:%s\n",data.telephone);
        printf("手機:%s\n",data.mobile);
        h=h->next;//處理下一結點 
    }
    return;
}
  • 新增聯絡人
ChainListType *input(ChainListType *head) //向通訊錄中輸入的資訊
{
    DATA data;
    printf("請輸入聯絡人資訊\n");
    printf("姓名:");
    scanf("%s",data.key);
    printf("地址:");
    scanf("%s",data.addr);
    printf("電話:");
    scanf("%s",data.telephone);
    printf("手機:");
    scanf("%s",data.mobile);
    return ChainListAddFirst(head,data); //呼叫新增函式 
}
  • 查詢聯絡人
void find(ChainListType *head)
{
    ChainListType *h;
    DATA data;
    char name[15];
    printf("請輸入查詢姓名:");
    scanf("%s",name);
    h=ChainListFind(head,name);
    if(h)//查詢結點指標有效
    { 
        data=h->data;//獲取結點資料 
        printf("姓名:%s\n",data.key);
        printf("地址:%s\n",data.addr);
        printf("電話:%s\n",data.telephone);
        printf("手機:%s\n",data.mobile);    
    }
}
  • 刪除聯絡人
void delete(ChainListType *head)
{
    ChainListType *h=head;
    char name[15];
    printf("請輸入要刪除的姓名:");
    scanf("%s",name);
    ChainListDelete(head,name); 
}
  • 主函式
int main()
{
    ChainListType *node, *head=NULL;
    int select;//選擇選單的序號 
    do{
        printf("\n_____________________\n");
        printf("1.新增聯絡人\n");
        printf("2.查詢聯絡人\n");
        printf("3.刪除聯絡人\n"); 
        printf("4.顯示所有聯絡人\n"); 
        printf("0.退出\n");
        printf("_____________________\n");
        select=getch();
        switch(select) 
        {
            case '1':
                printf("\n新增聯絡人\n"); 
                head=input(head);
                break;
            case '2':
                 printf("\n查詢聯絡人\n"); 
                 find(head);
                 break;
           case '3':
                printf("\n刪除聯絡人\n"); 
                delete(head);
                break;
           case '4':
                printf("\n顯示聯絡人\n"); 
                ChainListAll(head);
                break;
           case '0':
                return 0;
        }
    }while(select != '0');
}

相關文章