C語言實現(xiàn)一個簡易通訊錄
本文實現(xiàn)一個通訊錄,是基于C語言的IO文件操作、數(shù)據(jù)結(jié)構(gòu)里面的順序表實現(xiàn)。
具體功能
實現(xiàn)了
1、信息的添加
2、信息的顯示
3、信息的修改(修改單一屬性)
4、將內(nèi)存中的信息保存到文件中去
5、將文件中的信息加載到內(nèi)存中(每次程序運行數(shù)據(jù)就會丟失)
6、信息的刪除
7、信息的查找(按照各自的屬性查找)
8、給每一條信息設(shè)置了唯一的標(biāo)識id
9、通訊錄的銷毀
頭文件中的聲明
在c語言中我們采用結(jié)構(gòu)體來記錄每一個人的具體信息
用順序表的數(shù)據(jù)結(jié)構(gòu)來來對數(shù)據(jù)的操作
#ifndef __ADDRESSBOOK_H__ #define __ADDRESSBOOK_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> #define NAME_MAX 200 //名字 #define GENDER_MAX 100 // 性別 #define ADDRESS_MAX 200 // 地址 #define NUMBER_MAX 200 // 電話 #define SEQLIST_MAX 1000 // 存儲的最大信息數(shù)量 #define FILE_PATH "address_book.txt" // 寫入文件的位置 typedef struct person_inf { char name[NAME_MAX]; char gender[GENDER_MAX]; char number[NUMBER_MAX]; char address[ADDRESS_MAX]; }person_inf; typedef struct address_book { size_t size; person_inf data[SEQLIST_MAX]; }address_book; //初始化通訊錄 void address_book_init(address_book *book); //添加信息 void address_book_add(address_book *book); //顯示信息 void address_book_display(address_book *book); //刪除所有信息 void address_book_delete_all(address_book *book); //保存信息 void address_book_save(address_book *book); //加載信息 void address_book_load(address_book *book); //修改信息 void address_book_update(address_book *book); //刪除信息 void address_book_delete(address_book *book); //查找信息 void address_book_find(address_book *book); //銷毀通訊錄 void adderss_book_destory(address_book *book); #endif
函數(shù)的定義
在這里我們實現(xiàn)了,基本的增刪查改,保存信息加載信息。
#define _CRT_SECURE_NO_WARNINGS #include "AddressBook.h" //初始化通訊錄 void address_book_init(address_book *book) { if(book == NULL) { return ; } book->size = 0; } //添加信息 void address_book_add(address_book *book) { size_t cur = 0; if(book == NULL) { printf("book is NULL\n"); return ; } cur = book->size; ++book->size; printf("添加信息\n"); printf("請輸入要添加的姓名\n"); scanf("%s",book->data[cur].name); printf("請輸入要添加的性別\n"); scanf("%s",book->data[cur].gender); printf("請輸入要添加的電話\n"); scanf("%s",book->data[cur].number); printf("請輸入要添加的地址\n"); scanf("%s",book->data[cur].address); printf("添加成功\n"); return; } //顯示信息 void address_book_display(address_book *book) { size_t j = 0; if(book == NULL) { return ; } printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n"); for(j=0; j< book->size; j++) { printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",j,book->data[j].name, book->data[j].gender,book->data[j].number, book->data[j].address); } } //保存信息 void address_book_save(address_book *book) { size_t i = 0; FILE *fp = fopen(FILE_PATH,"w"); if(book == NULL) { return ; } if(fp == NULL) { printf("打開文件失敗\n"); return ; } //fprintf(fp,"序號\t\t姓名\t\t性別\t\t電話\t\t地址\n"); for(i=0; i< book->size; i++) { fprintf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name, book->data[i].gender,book->data[i].number, book->data[i].address); } fclose(fp); } //加載信息 void address_book_load(address_book *book) { size_t len = 0; size_t i = 0; FILE *fp = fopen(FILE_PATH,"r"); if(book == NULL) { return ; } if(fp == NULL) { printf("打開文件失敗\n"); return ; } // 把光標(biāo)移動到文件末尾 fseek(fp,0,SEEK_END); // 從光標(biāo)到文件首偏移的字節(jié)數(shù) len = ftell(fp); if(len == 0) { printf("通訊錄為空\n\n"); return ; } // rewind函數(shù)是將fp指針指向文件的開始 rewind(fp); while(!feof(fp)) { fscanf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",&i,book->data[book->size].name,//name是數(shù)組,在調(diào)用數(shù)組名時候降級為指針 book->data[i].gender,book->data[book->size].number, book->data[book->size].address); i++; ++book->size; } fclose(fp); } //修改信息 void address_book_update(address_book *book) { size_t i = 0; if(book == NULL) { return ; } printf("請輸入要修改的編號\n"); scanf("%u",&i); if(i > book->size || i < 0) { printf("輸入為非法值\n"); return ; } printf("修改信息\n"); printf("姓名修改為\n"); scanf("%s",book->data[i].name); printf("性別修改為\n"); scanf("%s",book->data[i].gender); printf("修改電話為\n"); scanf("%s",book->data[i].number); printf("地址修改為\n"); scanf("%s",book->data[i].address); printf("修改成功\n"); return ; } //刪除信息 void address_book_delete(address_book *book) { size_t i = 0; if(book == NULL) { return ; } printf("請輸入要刪除的編號\n"); scanf("%u",&i); if(i > book->size) { printf("輸入為非法值\n"); return ; } while(i < book->size) { book->data[i] = book->data[i+1]; i++; } book->size--; printf("刪除成功\n"); return; } //刪除所有信息 void address_book_delete_all(address_book *book) { if(book == NULL) { return ; } book->size = 0; } //查找信息 void address_book_find(address_book *book) { int flag = 0; size_t i = 0; int choice = 0; char f_name[50]; char f_number[50]; if(book == NULL) { //book為空指針; return ; } printf("請輸入要查找的方式\n"); printf("************************\n"); printf("*1.姓名查找 2.電話號查找\n"); printf("************************\n"); scanf("%d",&choice); if (choice == 1) { //姓名查找 printf("請輸入查找的姓名或者關(guān)鍵字\n"); scanf("%s",f_name); printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n"); while(i < book->size) { if(strstr(book->data[i].name,f_name)) //用strstr函數(shù)來查關(guān)鍵字 { flag = 1; printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name, book->data[i].gender,book->data[i].number, book->data[i].address); } i++; } if(flag == 0) printf("未查找到\n"); } else if (choice == 2) { //電話號碼查找 printf("請輸入查找的電話號或者關(guān)鍵號碼\n"); scanf("%s",f_number); printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n"); while(i < book->size) { if(strstr(book->data[i].number,f_number)) { flag = 1; printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name, book->data[i].gender,book->data[i].number, book->data[i].address); } i++; } if(flag == 0) { printf("未查找到\n"); } } else { printf("選擇錯誤\n"); } } /*fseek(fp,100L,0);把文件內(nèi)部指針移動到離文件開頭100字節(jié)處; fseek(fp,100L,1);把文件內(nèi)部指針移動到離文件當(dāng)前位置100字節(jié)處; fseek(fp,-100L,2);把文件內(nèi)部指針退回到離文件結(jié)尾100字節(jié)處。 ftell(fp);利用函數(shù) ftell() 也能方便地知道一個文件的長。 如以下語句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp)+1; 首先將文件的當(dāng)前位置移到文件的末尾,然后調(diào)用函數(shù)ftell()獲得當(dāng)前 位置相對于文件首的位移,該位移值等于文件所含字節(jié)數(shù)。 */ //銷毀通訊錄 void adderss_book_destory(address_book *book) { FILE *fp = fopen(FILE_PATH,"w"); if(book == NULL) { return ; } if(fp == NULL) { printf("打開文件失敗\n"); return ; } fseek(fp,0,SEEK_SET); rewind(fp); fclose(fp); printf("銷毀成功\n"); }
主函數(shù)的實現(xiàn)(主要的框架)
實現(xiàn)是采用枚舉來標(biāo)識要使用哪種功能,其中要注意的是,我們在將程序運行起來時候就需要加載我們的以前文件中的信息。還有就是我們要在每次添加一條信息,或者刪除,修改都需要保存,既內(nèi)存中和IO文件中保存寫入一次
enum { EXIT, DISPLAY, ADD, UPDATE, Y_DELETE, FIND, DESTORY }; //菜單 void menu() { int choice = 0; address_book book; address_book_init(&book); address_book_load(&book); while(1) { printf("===============================\n"); printf("1.顯示通訊錄\n"); printf("2.添加\n"); printf("3.修改\n"); printf("4.刪除\n"); printf("5.查找\n"); printf("6.銷毀\n"); printf("0.退出\n"); printf("===============================\n"); scanf("%d",&choice); system("cls"); switch (choice) { case DISPLAY: address_book_display(&book); break; case ADD: address_book_add(&book); address_book_save(&book); break; case UPDATE: address_book_update(&book); address_book_save(&book); break; case Y_DELETE: address_book_delete(&book); address_book_save(&book); break; case FIND: address_book_find(&book); break; case DESTORY: adderss_book_destory(&book); address_book_delete_all(&book); break; case EXIT: return ; break; default: printf("輸入值非法\n"); break; } } } int main() { menu(); return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)
數(shù)據(jù)結(jié)構(gòu)作為每一個IT人不可回避的問題,本文基于C++編寫,下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊詳解
這篇文章主要為大家詳細(xì)介紹了C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03C++數(shù)據(jù)結(jié)構(gòu)紅黑樹全面分析
今天的這一篇博客,我要跟大家介紹二叉搜索樹中的另一顆樹——紅黑樹,它主要是通過控制顏色來控制自身的平衡,但它的平衡沒有AVL樹的平衡那么嚴(yán)格2022-02-02隊列的動態(tài)鏈?zhǔn)酱鎯崿F(xiàn)代碼分享
DynaLnkQueue.cpp - 動態(tài)鏈?zhǔn)疥犃校搓犃械膭討B(tài)鏈?zhǔn)酱鎯崿F(xiàn)2014-02-02