C語言實現可排序通訊錄的示例代碼
1.目的
寫一個實用型通訊錄,它有如下功能:
顯示目錄
void ShowMenu() { printf("#######################\n"); printf("#1.Add 2.Del 3.Search #\n"); printf("#4.Mod 5.Show 6.Clear #\n"); printf("#7.Sort 0.Exit #\n"); printf("#######################\n"); printf("please select#"); }
1.添加聯系人
2.刪除聯系人
3.查找聯系人
4.修改聯系人
5.顯示通訊錄
6.清除通訊錄
7.排序通訊錄
2.分部流程
1.初始化通訊錄
void InitContact(contact_t **ct) { *ct = (contact_t *)malloc(sizeof(contact_t) + INIT_NUM*sizeof(person_t)); if (*ct == NULL){ perror("malloc"); exit(1); } (*ct)->size = 0; (*ct)->cap = INIT_NUM; printf("Using Default Init!\n"); }
2.添加聯系人
添加聯系人人時要考慮幾個問題
1.新加的聯系人是否已經存在瞭
2.通訊錄是否已經添加滿瞭 : a.沒有滿,繼續添加 b.滿瞭,實現自動擴容
void AddFriend(contact_t **ct) { assert(ct); //通訊錄已經滿瞭呢?自動擴容 if (!IsFull(*ct) || Inc(ct))//如果沒有滿,則執行後續插入,如果滿瞭,自動擴容&&擴容成功 { person_t p; printf("請輸入新增用戶的姓名:"); scanf("%s", p.name);//name是一個數組 printf("請輸入新增用戶的性別:"); scanf("%s", p.sex); printf("請輸入新增用戶的年紀:"); scanf("%d", &(p.age)); printf("請輸入新增用戶的電話:"); scanf("%s", p.telphone); printf("請輸入新增用戶的地址:"); scanf("%s", p.address); //判定當前用戶是否已經存在 if (IsExist(*ct, &p)){ printf("%s 已經存在,請不要重復插入\n", p.name); return; } //(*ct)->friend[(*ct)->size] = p; memcpy((*ct)->friends + (*ct)->size, &p, sizeof(p)); (*ct)->size += 1; printf("新增用戶%s成功\n", p.name); } else{ printf("擴容失敗\n"); } }
3.判斷聯系人是否存在
static int IsExist(contact_t *ct, person_t *p){ assert(ct); assert(p); int i = 0; for (; i < ct->size; i++){ if (strcmp(ct->friends[i].name, p->name) == 0){ return 1; } } return 0; }
4.判斷通訊錄是否已滿
static int IsFull(contact_t *ct) { return ct->cap == ct->size; }
5.判斷通訊錄是否為空
static int IsEmpty(contact_t *ct) { return ct->size == 0; }
6.通訊錄擴容
static int Inc(contact_t **ct) { assert(ct); contact_t *ct_temp = (contact_t *)realloc(*ct, sizeof(contact_t) + ((*ct)->cap + INC_SIZE)*sizeof(person_t)); if (ct_temp == NULL){ return 0; } *ct = ct_temp; (*ct)->cap += INC_SIZE; printf("自動擴容成功\n"); return 1; }
7.核心函數
實現在通訊錄裡找到目標聯系人,如果有此人,返回這個聯系人所在數組中的索引
static int SearchCore(contact_t *ct, const char *name) { assert(ct); assert(name); int i = 0; for (; i < ct->size; i++) { person_t *p = ct->friends + i; if (strcmp(name, p->name) == 0){ return i; } } return -1; }
8.查找聯系人
1.先判斷是否存在這個聯系人
2.存在,輸出這個聯系人的信息
3.不存在,數組不存此聯系人
void SearchFriend(contact_t *ct) { assert(ct); printf("請輸入你要查找的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性別", "年紀", "電話", "地址"); if (i >= 0){ person_t *p = ct->friends + i; printf("| %-10s | %-10s | %-10d | %-10s | % 10s | \n", p->name, p->sex, p->age, p->telphone, p->address); } else{ printf("你要查找的人%s不存在\n", name); } return; }
9.修改聯系人
1.在輸入想修改的聯系人姓名之後,先判斷這個聯系人是否存在於通訊錄中
2.如果存在,定義一個指針指向該聯系人存在的位置
void ModFriend(contact_t *ct) { assert(ct); printf("請輸入你要修改的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); if (i >= 0){ //person_t p; person_t *p= (ct->friends + i); printf("請輸入修改用戶的姓名:"); scanf("%s", p->name);//name是一個數組 printf("請輸入修改用戶的性別:"); scanf("%s", p->sex); printf("請輸入修改 用戶的年紀:"); scanf("%d", &(p->age)); printf("請輸入修改用戶的電話:"); scanf("%s", p->telphone); printf("請輸入修改用戶的地址:"); scanf("%s", p->address); //(*ct)->friend[(*ct)->size] = p; memcpy((ct)->friends + (ct)->size, &p, sizeof(p)); printf("修改用戶%s成功\n", p->name); } else{ printf("你要修改的聯系人%s不存在\n",name); } }
10.清空通訊錄
隻要令size=0,就清空瞭
void ClearContact(contact_t *ct) { assert(ct); ct->size = 0; }
11.刪除聯系人
不考慮順序問題,可直接讓最後一個聯系人的信息覆蓋此要刪除的聯系人
void DelFriend(contact_t *ct) { assert(ct); printf("請輸入你要刪除的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); if (i >= 0){ //將最後的人的信息直接覆蓋到當前位置 ct->friends[i] = ct->friends[ct->size - 1]; ct->size -= 1; printf("刪除成功\n"); } else { printf("你要刪除的人%s不存在\n", name); } }
12.顯示通訊錄
void ShowContact(contact_t *ct){ assert(ct); int i = 0; printf("|cap:%d|size:%d|\n", ct->cap, ct->size); printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性別", "年紀", "電話", "地址"); for (; i < ct->size; i++){ person_t *p = ct->friends + i; printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", p->name, p->sex, p->age, p->telphone, p->address); } }
13.比較聯系人
static int CmpPerson(const void *p1,const void *p2) { assert(p1); assert(p2); person_t *_p1 = (person_t *)p1; person_t *_p2 = (person_t *)p2; return strcmp(_p1->name, _p2->name); }
14.通訊錄排序
void SortContact(contact *ct) { assert(ct); if (!IsEmpty(ct)){ qsort(ct->friends, ct->size, sizeof(person_t), CmpPerson); } }
3.總代碼展示
main.c
#include "contact.h" void ShowMenu() { printf("#######################\n"); printf("#1.Add 2.Del 3.Search #\n"); printf("#4.Mod 5.Show 6.Clear #\n"); printf("#7.Sort 0.Exit #\n"); printf("#######################\n"); printf("please select#"); } int main(){ contact_t *ct = NULL; InitContact(&ct); int quit = 0; while (!quit){ int select = 0; ShowMenu(); scanf("%d", &select); switch (select){ case 1: AddFriend(&ct);//添加用戶是要進行自動擴容的 break; case 2: DelFriend(ct); break; case 3: SearchFriend(ct); break; case 4: ModFriend(ct); break; case 5: ShowContact(ct); break; case 6: ClearContact(ct); break; case 7: SortContact(ct); break; case 0: //SaveContact(ct); //break; return 0; default: break; } } //free(ct); system("pause"); return 0; }
contact.c
#include "contact.h" //初始化通訊錄 void InitContact(contact_t **ct) { *ct = (contact_t *)malloc(sizeof(contact_t) + INIT_NUM*sizeof(person_t)); if (*ct == NULL){ perror("malloc"); exit(1); } (*ct)->size = 0; (*ct)->cap = INIT_NUM; } //判斷聯系人是否存在 static int IsExist(contact_t *ct, person_t *p){ assert(ct); assert(p); int i = 0; for (; i < ct->size; i++){ if (strcmp(ct->friends[i].name, p->name) == 0){ return 1; } } return 0; } // //判斷通訊錄是否已滿 static int IsFull(contact_t *ct) { return ct->cap == ct->size; } // //判斷通訊錄是否為空 static int IsEmpty(contact_t *ct) { return ct->size == 0; } / //通訊錄擴容 static int Inc(contact_t **ct) { assert(ct); contact_t *ct_temp = (contact_t *)realloc(*ct, sizeof(contact_t) + ((*ct)->cap + INC_SIZE)*sizeof(person_t)); if (ct_temp == NULL){ return 0; } *ct = ct_temp; (*ct)->cap += INC_SIZE; printf("自動擴容成功\n"); return 1; } //添加新的聯系人 void AddFriend(contact_t **ct) { assert(ct); //通訊錄已經滿瞭呢?自動擴容 if (!IsFull(*ct) || Inc(ct))//如果沒有滿,則執行後續插入,如果滿瞭,自動擴容&&擴容成功 { person_t p; printf("請輸入新增用戶的姓名:"); scanf("%s", p.name);//name是一個數組 printf("請輸入新增用戶的性別:"); scanf("%s", p.sex); printf("請輸入新增用戶的年紀:"); scanf("%d", &(p.age)); printf("請輸入新增用戶的電話:"); scanf("%s", p.telphone); printf("請輸入新增用戶的地址:"); scanf("%s", p.address); //判定當前用戶是否已經存在 if (IsExist(*ct, &p)){ printf("%s 已經存在,請不要重復插入\n", p.name); return; } //(*ct)->friend[(*ct)->size] = p; memcpy((*ct)->friends + (*ct)->size, &p, sizeof(p)); (*ct)->size += 1; printf("新增用戶%s成功\n", p.name); } else{ printf("擴容失敗\n"); } } / //核心函數 static int SearchCore(contact_t *ct, const char *name) { assert(ct); assert(name); int i = 0; for (; i < ct->size; i++) { person_t *p = ct->friends + i; if (strcmp(name, p->name) == 0){ return i; } } return -1; } // //查找聯系人 void SearchFriend(contact_t *ct) { assert(ct); printf("請輸入你要查找的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性別", "年紀", "電話", "地址"); if (i >= 0){ person_t *p = ct->friends + i; printf("| %-10s | %-10s | %-10d | %-10s | % 10s | \n", p->name, p->sex, p->age, p->telphone, p->address); } else{ printf("你要查找的人%s不存在\n", name); } return; } // //修改聯系人 void ModFriend(contact_t *ct) { assert(ct); printf("請輸入你要修改的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); if (i >= 0){ //person_t p; person_t *p= (ct->friends + i); printf("請輸入修改用戶的姓名:"); scanf("%s", p->name);//name是一個數組 printf("請輸入修改用戶的性別:"); scanf("%s", p->sex); printf("請輸入修改 用戶的年紀:"); scanf("%d", &(p->age)); printf("請輸入修改用戶的電話:"); scanf("%s", p->telphone); printf("請輸入修改用戶的地址:"); scanf("%s", p->address); //(*ct)->friend[(*ct)->size] = p; memcpy((ct)->friends + (ct)->size, &p, sizeof(p)); printf("修改用戶%s成功\n", p->name); } else{ printf("你要修改的聯系人%s不存在\n",name); } } //清空通訊錄 void ClearContact(contact_t *ct) { assert(ct); ct->size = 0; } /// //刪除好友 void DelFriend(contact_t *ct) { assert(ct); printf("請輸入你要刪除的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); if (i >= 0){ //將最後的人的信息直接覆蓋到當前位置 ct->friends[i] = ct->friends[ct->size - 1]; ct->size -= 1; printf("刪除成功\n"); } else { printf("你要刪除的人%s不存在\n", name); } } // //顯示通訊錄 void ShowContact(contact_t *ct){ assert(ct); int i = 0; printf("|cap:%d|size:%d|\n", ct->cap, ct->size); printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", "姓名", "性別", "年紀", "電話", "地址"); for (; i < ct->size; i++){ person_t *p = ct->friends + i; printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", p->name, p->sex, p->age, p->telphone, p->address); } } //比較聯系人 static int CmpPerson(const void *p1,const void *p2) { assert(p1); assert(p2); person_t *_p1 = (person_t *)p1; person_t *_p2 = (person_t *)p2; return strcmp(_p1->name, _p2->name); } / //通訊錄排序 void SortContact(contact *ct) { assert(ct); if (!IsEmpty(ct)){ qsort(ct->friends, ct->size, sizeof(person_t), CmpPerson); } }
contact.h
#ifndef _CINTACT_H_
#define _CONTACT_H_
//person 內部的元素的大小
#define NAME_SIZE 32
#define SEX_SIZE 8
#define TELPHONE_SIZE 16
#define ADDRESS_SIZE 128
#include <stdio.h>
#include <Windows.h>
#include <assert.h>
#pragma warning(disable:4996)
//通訊的初始信息
#define INIT_NUM 1000//通訊錄初始大小
#define INC_SIZE 5//每次擴容擴5個
//文件信息
#define SAVE_FILE "save.txt"
typedef struct person{
char name[NAME_SIZE];
char sex[SEX_SIZE];
int age;
char telphone[TELPHONE_SIZE];
char address[ADDRESS_SIZE];
//int ok;
}person_t;
typedef struct contact{
FILE *save;
int cap; //容量
int size; //當前有效好友
person_t friends[0];//柔性數組
}contact_t;
void InitContact(contact_t **ct);
void AddFriend(contact_t **ct);
void ShowContact(contact_t *ct);
void ModFriend(contact_t *ct);
void SearchFriend(contact_t *ct);
void ClearContact(contact_t *ct);
void DelFriend(contact_t *ct);
void SortContact(contact_t *ct);
#endif
到此這篇關於C語言實現可排序通訊錄的示例代碼的文章就介紹到這瞭,更多相關C語言 可排序通訊錄內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!