1. 程式人生 > 程式設計 >C語言實現通訊錄

C語言實現通訊錄

本文例項為大家分享了C語言實現通訊錄的具體程式碼,供大家參考,具體內容如下

實現的功能有:

1.初始化通訊錄;
2. 通訊錄中增加條目;
3. 刪除通訊錄中的指定條目;
4. 按指定規則查詢通訊錄中特定條目;
5. 列印通訊錄中的所有資訊;
6. 修改通訊錄的指定條目;
7. 銷燬通訊錄;
8. 將通訊錄內容儲存在檔案;
9. 將檔案中的內容載入回記憶體。

**Addr_Book.h**

#pragma once
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NAME_SIZE 200 
#define PHONE_SIZE 200 
#define ADDR_SIZE 200

typedef struct PersonInfo {
  char name[NAME_SIZE];
  char phone[PHONE_SIZE];
  char addr[ADDR_SIZE];
} PersonInfo;

#define FILE_PATH "./data.txt"

enum {
  DISPLAY = 1,ADD = 2,ERASE = 3,FIND = 4,MODIFY = 5,EXIT = 0
};

typedef struct AddrBook {
  PersonInfo* data;//內容
  size_t size; //聯絡人數量
  size_t capacity; //通訊錄容量
} AddrBook;


/**
* @brief 初始化通訊錄
*
* @param addr_book
*/
void AddrBookInit(AddrBook* addr_book);

/**
* @brief 通訊錄中增加條目
*
* @param addr_book
*/
void AddrBookAdd(AddrBook* addr_book);

/**
* @brief 刪除通訊錄中的指定條目
*
* @param addr_book
*/
void AddrBookErase(AddrBook* addr_book);

/**
* @brief 按指定規則查詢通訊錄中特定條目
*
* @param addr_book
*/
void AddrBookFind(AddrBook* addr_book);

/**
* @brief 列印通訊錄中的所有資訊
*
* @param addr_book
*/
void AddrBookDisplay(AddrBook* addr_book);

/**
* @brief 修改通訊錄的指定條目
*
* @param addr_book
*/
void AddrBookModify(AddrBook* addr_book);

/**
* @brief 銷燬通訊錄
*
* @param addr_book
*/
void AddrBookDestroy(AddrBook* addr_book);

/**
* @brief 將通訊錄內容儲存在檔案
*
* @param addr_book
*/
void AddrBookSave(AddrBook* addr_book);

/**
* @brief 將檔案中的內容載入回記憶體.
*
* @param addr_book
*/
void AddrBookLoad(AddrBook* addr_book);

**Addr_Book.c**

#define _CRT_SECURE_NO_WARNINGS 1

#include "Addr_Book.h"

//列印通訊錄
void AddrBookDisplay(AddrBook* addr_book){ 
  if (addr_book == NULL){
    return;
  }
  printf("\n====================通訊錄=========================\n");
  printf("|   姓名   |   號碼   |   地址   |\n");
  printf("|----------------|---------------|----------------|\n");
  size_t i = 0;
  for (; i < addr_book->size; ++i){
    printf("|   %s   |   %s   |   %s   |\n",addr_book->data[i].name,addr_book->data[i].phone,addr_book->data[i].addr);
    printf("|----------------|---------------|----------------|\n");
  }
}

//初始化通訊錄
void AddrBookInit(AddrBook* addr_book){ 
  if (addr_book == NULL){
    return ;
  }
  addr_book->size = 0;
  addr_book->capacity = 1;
  addr_book->data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);
}

//擴大記憶體
void AddrBookRelloc(AddrBook* addr_book){
  if (addr_book == NULL){
    return;
  }
  addr_book->capacity = addr_book->capacity * 2 + 1;//記憶體不夠,擴大容量
  PersonInfo* new_data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);//開闢新的空間大小
  size_t i = 0;
  for (; i < addr_book->size; ++i){
    new_data[i] = addr_book->data[i];//將舊記憶體賦給新記憶體
  }
  free(addr_book->data);//釋放舊記憶體
  addr_book->data = new_data;
}

//新增聯絡人
void AddrBookAdd(AddrBook* addr_book){ 
  if (addr_book == NULL){
    return;
  }
  if (addr_book->size >= addr_book->capacity){ //記憶體不夠需要擴大記憶體
    AddrBookRelloc(addr_book);
  }
  size_t cur = addr_book->size;
  ++addr_book->size;
  printf("新增聯絡人\n");
  printf("輸入姓名:");
  scanf("%s",addr_book->data[cur].name);
  printf("輸入號碼:");
  scanf("%s",addr_book->data[cur].phone);
  printf("輸入地址:");
  scanf("%s",addr_book->data[cur].addr);
  printf("新增結束!\n");
}

//刪除指定聯絡人
void AddrBookErase(AddrBook* addr_book){ 
  if (addr_book == NULL){
    return;
  }
  char delete_name[200] = {0};
  printf("輸入要刪除聯絡人姓名:");
  scanf("%s",&delete_name);
  size_t i = 0;
  for (; i <addr_book->size;++i){
    if (strcmp(addr_book->data[i].name,delete_name)){
      free(addr_book->data);
      addr_book->size--;
      printf("已刪除!");
    }
    else{
      printf("刪除失敗,請重新輸入聯絡人!");
    }
  }
}

//儲存內容
void AddrBookSave(AddrBook* addr_book){ 
  FILE* fp = fopen(FILE_PATH,"w");
  if (fp == NULL){
    printf("開啟檔案失敗!\n");
    return;
  }
  size_t i = 0;
  for (; i < addr_book->size; ++i){
    fprintf(fp,"|   %s   |   %s   |   %s   |\n",addr_book->data[i].addr);
  }
  fclose(fp);
}

//按姓名查詢聯絡人
void AddrBookFind(AddrBook* addr_book){  
  if (addr_book == NULL){
    return;
  }
  char delete_name[200] = { 0 };
  printf("輸入所查詢聯絡人姓名:");
  scanf("%s",&delete_name);
  size_t i = 0;
  for (; i <addr_book->size; ++i){
    if (strcmp(addr_book->data[i].name,delete_name)){
      printf("找到了,該聯絡人資訊為:姓名:%s,號碼:%s,地址:%s\n",addr_book->data[i].addr);    
    }
    else{
      printf("此人不存在!\n");
    }
  }
}

//修改聯絡人資訊
void AddrBookModify(AddrBook* addr_book){
  if (addr_book == NULL){
    return;
  }
  char name[200] = { 0 };
  printf("輸入要修改的聯絡人名字:");
  scanf("%s",&name);
  size_t i = 0;
  for (; i < addr_book->size; ++i)
  {
    if (strcmp(addr_book->data[i].name,name) == 0)
    {
      printf("這是第%lu個聯絡人:\n",i + 1);          
      printf("此人資訊為:\n 姓名:%s,電話:%s,addr_book->data[i].addr);
    }
  }
  size_t num = 0;
  printf("輸入要修改的聯絡人編號:");       
  scanf("%lu",&num);
  char name2[200];
  char phone[200];
  char addr[200];
  printf("請輸入新的姓名:");
  scanf("%s",name2);
  strcpy(addr_book->data[num - 1].name,name2);
  printf("請輸入新的電話號碼:");
  scanf("%s",phone);
  strcpy(addr_book->data[num - 1].phone,phone);
  printf("請輸入新的地址:");
  scanf("%s",addr);
  strcpy(addr_book->data[num - 1].addr,addr);
  printf("修改成功!\n");
  return;

}

//銷燬通訊錄
void AddrBookDestroy(AddrBook* addr_book){
  if (addr_book == NULL)            
  {
    printf("addr_book is null\n");
    return;
  }
  else
  {
    addr_book->size = 0;
    addr_book->capacity = 0;
    free(addr_book->data);
    printf("銷燬成功!\n");
  }

}

//將檔案中的內容載入回記憶體
void AddrBookLoad(AddrBook* addr_book){
  if (addr_book = NULL){
    printf("通訊錄為空!\n");
    return;
  }
  FILE* fp = fopen(FILE_PATH,"r");
  if (fp = NULL){
    printf("開啟檔案失敗!\n");
    return;
  }
  while (!feof(fp)){
    if (addr_book->size >= addr_book->capacity){
      AddrBookRelloc(addr_book);
    }
    size_t cur = addr_book->size;
    fscanf(fp,"%s%s%s\n",addr_book->data[i].addr);
    addr_book->size++;
  }
  fclose(fp);
}



//===============
//以下為測試程式碼
//===============

void menu(){
  AddrBook addr_book;
  AddrBookInit(&addr_book);
  AddrBookLoad(&addr_book);

  while (1){
    printf("============1.列印通訊錄=============\n");
    printf("============2.增加聯絡人=============\n");
    printf("============3.刪除聯絡人=============\n");
    printf("============4.查詢聯絡人=============\n");
    printf("============5.修改聯絡人=============\n");
    printf("============6.銷燬通訊錄=============\n");
    printf("============0.退出通訊錄=============\n");
    int choice = 0;
    printf("請輸入所需功能:");
    scanf("%d",&choice);
    switch (choice){
    case DISPLAY:
      AddrBookDisplay(&addr_book);
      break;
    case ADD:
      AddrBookAdd(&addr_book);
      AddrBookSave(&addr_book);
      break;
    case ERASE:
      AddrBookErase(&addr_book);
      break;
    case FIND:
      AddrBookFind(&addr_book);
      break;
    case MODIFY:
      AddrBookModify(&addr_book);
      AddrBookSave(&addr_book);
      break;
    case DESTROY:
      AddrBookDestroy(&addr_book);
      break;
    case EXIT:
      printf("退出通訊錄!\n");
      break;
    default:
      printf("請輸入正確選擇:");
      break;
    }
  }
}

int main(){
  menu();
  return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。