C語(yǔ)言編程內(nèi)存分配通訊錄靜態(tài)實(shí)現(xiàn)示例代碼教程
實(shí)現(xiàn)一個(gè)通訊錄:
通訊錄可以用來(lái)存儲(chǔ)1000個(gè)人的信息,每個(gè)人的信息包括:姓名、性別、年齡、電話、住址
提供方法:
1. 添加聯(lián)系人信息
2. 刪除指定聯(lián)系人信息
3. 查找指定聯(lián)系人信息
4. 修改指定聯(lián)系人信息
5. 顯示所有聯(lián)系人信息
6. 清空所有聯(lián)系人
7. 以名字排序所有聯(lián)系人
首先我們采用順序表的方式來(lái)實(shí)現(xiàn)一個(gè)通訊錄,順序表就是一種靜態(tài)的模式。但是呢,靜態(tài)的方式存在著一些明顯的弊端,比如說(shuō):(1)信息少了存在空間浪費(fèi)現(xiàn)象,信息多了存在空間不足的現(xiàn)象;(2)無(wú)法對(duì)信息進(jìn)行保存,沒(méi)有實(shí)用性.所以呢,后期會(huì)提供動(dòng)態(tài)方式和文件的方式。
為了結(jié)構(gòu)清晰我使用了三個(gè)文件來(lái)進(jìn)行封裝,Contact.h封裝結(jié)構(gòu)體以及函數(shù)的聲明,test.c封裝主函數(shù),Contact.c用來(lái)封裝函數(shù)的算法。
下來(lái)進(jìn)行代碼實(shí)現(xiàn):
Contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONTACT_H__ //防止重定義
#define __CONTACT_H__
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
enum OP
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
DISPLAY,
SORT,
CLEAR
};
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 25
#define MAX 1000
typedef struct PerInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];
int size;
}Contact,*Pcon;
void init_contact(Pcon pcon);
void _add_contact(Pcon pcon);
void _display_contact(Pcon pcon);
void _del_contact(Pcon pcon);
void _search_contact(Pcon pcon);
void _modify_contact(Pcon pcon);
void _sort_contact(Pcon pcon);
void _clear_contact(Pcon pcon);
#endif
Test.c
#include "Contact.h"
void menu()
{
printf("***** 1.add 2.del ****\n");
printf("***** 3.modify 4.search ****\n");
printf("***** 5.display 6.sort ****\n");
printf("***** 7.clear 0.exit ****\n");
}
int main()
{
Contact con;
int input = 1;
init_contact(&con);
while(input)
{
menu();
printf("請(qǐng)選擇>:");
scanf("%d",&input);
switch(input)
{
case ADD:
_add_contact(&con);
break;
case DEL:
_del_contact(&con);
break;
case SEARCH:
_search_contact(&con);
break;
case MODIFY:
_modify_contact(&con);
break;
case DISPLAY:
_display_contact(&con);
break;
case SORT:
_sort_contact(&con);
break;
case CLEAR:
_clear_contact(&con);
break;
case EXIT:
break;
default:
printf("選擇錯(cuò)誤\n");
break;
}
}
return 0;
}
Contact.c
#include"Contact.h"
void init_contact(Pcon pcon) //進(jìn)行初始化
{
memset(pcon->data, 0, MAX*sizeof(PeoInfo));
pcon->size = 0;
}
static int find(Pcon pcon,char arr[]) //由于在修改,刪除,查詢的地方都需要查找通訊錄的元素,所以對(duì)find進(jìn)行封裝
{
int i=0;
for(i=0;i<pcon->size;i++)
{
if(strcmp(pcon->data[i].name,arr)==0)
return i;
}
return -1;
}
void _add_contact(Pcon pcon)
{
if(pcon->size<MAX)
{
printf("準(zhǔn)備添加一個(gè)新成員!\n");
printf("請(qǐng)輸入姓名:");
scanf("%s",pcon->data[pcon->size].name);
printf("請(qǐng)輸入性別:");
scanf("%s",pcon->data[pcon->size].sex);
printf("請(qǐng)輸入年齡:");
scanf("%d",&(pcon->data[pcon->size].age));
printf("請(qǐng)輸入住址:");
scanf("%s",pcon->data[pcon->size].addr);
printf("請(qǐng)輸入聯(lián)系人電話:");
scanf("%s",pcon->data[pcon->size].tele);
printf("添加成功!\n");
(pcon->size)++; //每添加一個(gè)人,通訊錄總?cè)藬?shù)得加1
}
else
{
printf("通訊錄已經(jīng)滿了!\n");
}
}
void _display_contact(Pcon pcon)
{
int i=0;
printf("%s\t%s\t%s\t%s\t%s\n","name","sex","age","tele","addr");
for(i=0;i<pcon->size;i++)
{
printf("%s\t%s\t%d\t%s\t%s\n",pcon->data[i].name,
pcon->data[i].sex,pcon->data[i].age,pcon->data[i].tele,pcon->data[i].addr);
}
}
void _del_contact(Pcon pcon)
{
int ret=0;
char name[NAME_MAX]={0};
if(pcon->size==0)
{
printf("當(dāng)前通訊錄為空!\n");
return;
}
else
{
printf("請(qǐng)輸入要?jiǎng)h除人的姓名:\n");
scanf("%s",name);
ret=find(pcon,name);
if(ret!=-1)
{
pcon->data[ret]=pcon->data[(pcon->size)-1];
pcon->size--; //刪除的方法是將數(shù)組中最后一個(gè)成員移到要?jiǎng)h除的成員位置上
printf("刪除成功!\n");
}
else
{
printf("未找到要?jiǎng)h除的對(duì)象!\n");
}
}
}
void _search_contact(Pcon pcon)
{
int ret=0;
char name[NAME_MAX]={0};
printf("請(qǐng)輸入要查找的人的姓名:\n");
scanf("%s",name);
ret=find(pcon,name);
if(ret!=-1)
{
printf("%s\t%s\t%d\t%s\t%s\t",pcon->data[ret].name,
pcon->data[ret].sex,pcon->data[ret].age,pcon->data[ret].tele,
pcon->data[ret].addr);
}
else
printf("未找到所要查找的人!\n");
}
void _modify_contact(Pcon pcon)
{
int select=0;
int ret=0;
char modify[20]={0};
int year=0;
char name[NAME_MAX]={0};
printf("請(qǐng)輸入要修改的人的姓名:\n");
scanf("%s",name);
ret=find(pcon,name);
if(ret!=-1)
{
printf("1.name\n 2.sex\n 3.age\n 4.tele\n 5addr\n");
printf("請(qǐng)輸入要修改的項(xiàng):");
scanf("%d",&select);
switch(select)
{
case 1:
printf("請(qǐng)輸入新的名字:");
scanf("%s",modify);
strcpy(pcon->data[ret].name,modify);
printf("修改成功!\n");
break;
case 2:
printf("請(qǐng)輸入新的性別:");
scanf("%s",modify);
strcpy(pcon->data[ret].sex,modify);
printf("修改成功!\n");
break;
case 3:
printf("請(qǐng)輸入新的電話號(hào):");
scanf("%s",modify);
strcpy(pcon->data[ret].tele,modify);
printf("修改成功!\n");
break;
case 4:
printf("請(qǐng)輸入新的地址:");
scanf("%s",modify);
strcpy(pcon->data[ret].addr,modify);
printf("修改成功!\n");
break;
case 5:
printf("請(qǐng)輸入新的年齡:");
scanf("%s",year);
pcon->data[ret].age=year;
printf("修改成功!\n");
break;
default:
printf("修改失??!\n");
break;
}
}
else
{
printf("未找到所要修改的人!\n");
}
}
void _sort_contact(Pcon pcon)
{
PeoInfo tmp={0};
int i=0;
int j=0;
int flag=0; //表示有序
for(i=1;i<(pcon->size)-1;i++)
{
flag=0;
for(j=1;j<(pcon->size)-i-1;j++)
{
if(strcmp((pcon->data[j].name),(pcon->data[j+1].name))>0)
tmp=pcon->data[j];
pcon->data[j]=pcon->data[j+1];
pcon->data[j+1]=tmp;
flag=1;
}
if(flag==0)
break;
}
}
void _clear_contact(Pcon pcon)
{
pcon->size=0;
printf("通訊錄已清空!\n");
}
以上就是C語(yǔ)言編程內(nèi)存分配通訊錄靜態(tài)實(shí)現(xiàn)示例代碼教程的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言實(shí)現(xiàn)靜態(tài)通訊錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++?sqlite3數(shù)據(jù)庫(kù)配置使用教程
SQLite 是一種嵌入式的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它是一個(gè)開(kāi)源項(xiàng)目,已經(jīng)被廣泛應(yīng)用于各種應(yīng)用程序和操作系統(tǒng)中,這篇文章主要介紹了C++?sqlite3數(shù)據(jù)庫(kù)配置使用,需要的朋友可以參考下2023-08-08
C語(yǔ)言中的結(jié)構(gòu)體的入門學(xué)習(xí)教程
這篇文章主要介紹了C語(yǔ)言中的結(jié)構(gòu)體的入門學(xué)習(xí)教程,以struct語(yǔ)句定義的結(jié)構(gòu)體是C語(yǔ)言編程中的重要基礎(chǔ),需要的朋友可以參考下2015-12-12
C語(yǔ)言讀取data.json文件并存入MySQL數(shù)據(jù)庫(kù)小案例(推薦)
本文介紹如何使用C語(yǔ)言結(jié)合cJSON庫(kù)讀取JSON文件,并將數(shù)據(jù)存儲(chǔ)到MySQL數(shù)據(jù)庫(kù)中,示例代碼包括創(chuàng)建MySQL表的SQL語(yǔ)句和C語(yǔ)言代碼,以及如何編譯和運(yùn)行程序,確保已安裝必要的庫(kù)以支持程序運(yùn)行2024-10-10
C++使用alsa庫(kù)實(shí)現(xiàn)播放聲音文件
這篇文章主要為大家詳細(xì)介紹了Linux系統(tǒng)上C++如何使用alsa庫(kù)播放聲音文件,文中示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
c++使用Easyx圖形庫(kù)實(shí)現(xiàn)飛機(jī)大戰(zhàn)
本文詳細(xì)講解了c++使用Easyx圖形庫(kù)實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
教你Visual?Studio?2022如何新建一個(gè)C語(yǔ)言工程(圖文詳解)
這篇文章主要介紹了Visual?Studio?2022如何新建一個(gè)C語(yǔ)言工程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09

