亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言動態與靜態分別實現通訊錄的方法

發布時間:2022-02-28 09:27:58 來源:億速云 閱讀:127 作者:iii 欄目:開發技術

這篇文章主要講解了“C語言動態與靜態分別實現通訊錄的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言動態與靜態分別實現通訊錄的方法”吧!

一.靜態通訊錄的實現

1.環境的分工邏輯

由于過程有點長,便于理解,所以一共會用到三個文件

分別是兩個源文件test.c、contact.c ,還有一個頭文件contact.h來實現

test.c是主體,是通訊錄的測試邏輯

contact.c是通訊錄的實現邏輯

contact.h是實現通訊錄函數的聲明

2.待實現的功能

通訊錄的每一個功能是相對獨立的

所以可以分別用不同的函數來實現各個部分的功能

contact.c包含的函數分別以下內容:

1.結構體的初始化

2.添加聯系人

3.展示聯系人

4.刪除聯系人

5.查找聯系人

6.修改聯系人

具體代碼如下:

3.contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
//通訊錄可以用來存儲1000個人的信息,每個人的信息包括:姓名、性別、年齡、電話、住址
typedef struct  Introduction
{
	char name[20];
	char sex[10];
	int  age;
	char tele[20];
	char addr[30];
} Introduction;
typedef struct contact
{
	Introduction data[1000];
	int sz;
}contact;
 
//結構體的初始化
void Initcontact(contact* pc);
//添加聯系人
void Add(contact* pc);
//展示聯系人
void show(contact* pc);
//刪除聯系人
void Dele(contact* pc);
//查找聯系人
void Find(contact* pc);
//修改聯系人
void Exchange(contact* pc);

4.contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void Initcontact(contact* pc)//結構體的初始化
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));
}
 
void Add(contact* pc)//添加聯系人
{
    //判斷是否未滿
    if (pc->sz == 1000)
    {
        printf("通訊錄已滿\n");
        return;
    }
    printf("請輸入名字>:");
    scanf("%s", pc->data[pc->sz].name);
    printf("請輸入年齡>:");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("請輸入性別:>");
    scanf("%s", pc->data[pc->sz].sex);
    printf("請輸入電話:>");
    scanf("%s", pc->data[pc->sz].tele);
    printf("請輸入地址:>");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;
    printf("增加聯系人成功\n");
}
 
void show(contact* pc)//展示聯系人
{
    int i = 0;
    printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年齡", "性別", "電話", "地址");
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ",
        pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    }
}
 
int SearchByName(contact* pc, char name[])
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->data[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}
 
void Dele(contact* pc)//刪除聯系人
{
    int i = 0; char name[10];
    printf("輸入要刪除人的名字>:\n");
    scanf("%s", name);
    if (pc->sz == 0)
    {
        printf("通訊錄為空,無法刪除\n");
    }
    //判斷是否有聯系人
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("找不到聯系人\n");
    }
    else
    {
        for (i = pos; i < pc->sz - 1; i++)
        {
            pc->data[i] = pc->data[i + 1];
        }
        pc->sz--;
        printf("刪除聯系人成功\n");
    }
}
 
 
void Find(contact* pc)//查找聯系人
{
    char name[10];
    printf("輸入要查找人的名字>:\n");
    scanf("%s", name);
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("通訊錄中無查找人的名字");
    }
    else
    {
        printf("查找的人信息為:>");
        printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年齡", "性別", "電話", "地址");
        printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ",
        pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
    }
}
 
 
void Exchange(contact* pc)//修改聯系人
{
    char name[10];
    printf("輸入要修改人的名字>:\n");
    scanf("%s", name);
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("通訊錄中無修改人的名字");
    }
    else
    {
        printf("請輸入名字>:");
        scanf("%s", pc->data[pos].name);
        printf("請輸入年齡>:");
        scanf("%d", &(pc->data[pos].age));
        printf("請輸入性別:>");
        scanf("%s", pc->data[pos].sex);
        printf("請輸入電話:>");
        scanf("%s", pc->data[pos].tele);
        printf("請輸入地址:>");
        scanf("%s", pc->data[pos].addr);
        printf("修改成功");
    }
}

5.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
	printf("**********************************************\n");
	printf("*******     1.Add        2.Dele      *********\n");
	printf("*******     3.Find       4.Exchange **********\n");
	printf("*******     5.show       0.exit     **********\n");
	printf("**********************************************\n");
}
int main()
{
	int input = 0;
	contact con;
    Initcontact(&con);
	do
	{
		menu();
		printf("請輸入一個數>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Add(&con);
			break;
		case 2:
			Dele(&con);
			break;
		case 3:
			Find(&con);
			break;
		case 4:
			Exchange(&con);
			break;
		case 5:
			show(&con);
			break;
		case 0:
			printf("退出通訊錄\n");
			break;
		default:
			printf("選擇錯誤\n");
		}
 
	} while (input);
	return 0;
}

6.實現效果

C語言動態與靜態分別實現通訊錄的方法

二.通訊錄動態的實現

相較于靜態的實現,兩者的差別并不大

前者是用一個固定數組來實現元素的儲存

后者則是用動態申請的內存來實現儲存,優點是可以節省內存

區別在于

通訊錄的初始化,這里引用了capcity容量來比較已有的容量

來判斷內存的使用量,便于擴容

其次就是Add函數,增加聯系人

最后再對釋放的內存進行釋放

代碼如下:

1.contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
 
typedef struct Introduction
{
	char name[20];
	char sex[10];
	int  age;
	char tele[20];
	char addr[30];
}Introduction;
 
typedef struct contact
{
	Introduction* data;
	int sz;
	int capcity;
}contact;
 
//結構體的初始化
void Initcontact(contact* pc);
//添加聯系人
void Add(contact* pc);
//展示聯系人
void show(contact* pc);
//刪除聯系人
void Dele(contact* pc);
//查找聯系人
void Find(contact* pc);
//修改聯系人
void Exchange(contact* pc);
//銷毀通訊錄
void destroy(contact*pc);

2.contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
#define TARGET_sz 3   //初始通訊錄目標容量 
 
void Initcontact(contact* pc)//結構體的初始化
{
    assert(pc);//判斷指針的有效性
    pc->sz = 0;
    contact* tmp = 0;
    tmp=(contact*)malloc(sizeof(Introduction)*TARGET_sz);
    if (tmp!=NULL)
    {
        pc->data = tmp;
    }
    else
    {
        printf("擴容失敗,請檢查原因\n");
        return;
    }
    pc->capcity = TARGET_sz;
}
 
void Add(contact* pc)//添加聯系人
{
    assert(pc);
    if (pc->capcity == pc->sz)
    {
        Introduction* tmp = 0;
        tmp=(Introduction*)realloc(pc->data,sizeof(Introduction)*(pc->capcity+2));
        if (tmp != NULL)
        {
            pc->capcity += 2;
            pc->data = tmp;
            printf("擴容成功\n");
        }
        else
        {
            printf("擴容失敗,請檢查原因\n");
        }
    }
    printf("請輸入名字>:");
    scanf("%s", pc->data[pc->sz].name);
    printf("請輸入年齡>:");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("請輸入性別:>");
    scanf("%s", pc->data[pc->sz].sex);
    printf("請輸入電話:>");
    scanf("%s", pc->data[pc->sz].tele);
    printf("請輸入地址:>");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;
    printf("增加聯系人成功\n");
}
 
void show(contact* pc)//展示聯系人
{
    int i = 0;
    printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年齡", "性別", "電話", "地址");
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ",
            pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    }
}
 
int SearchByName(contact* pc, char name[])
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->data[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}
 
void Dele(contact* pc)//刪除聯系人
{
    int i = 0; char name[10];
    printf("輸入要刪除人的名字>:\n");
    scanf("%s", name);
    if (pc->sz == 0)
    {
        printf("通訊錄為空,無法刪除\n");
    }
    //判斷是否有聯系人
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("找不到聯系人\n");
    }
    else
    {
        for (i = pos; i < pc->sz - 1; i++)
        {
            pc->data[i] = pc->data[i + 1];
        }
        pc->sz--;
        printf("刪除聯系人成功\n");
    }
}
 
 
void Find(contact* pc)//查找聯系人
{
    char name[10];
    printf("輸入要查找人的名字>:\n");
    scanf("%s", name);
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("通訊錄中無查找人的名字");
    }
    else
    {
        printf("查找的人信息為:>");
        printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "名字", "年齡", "性別", "電話", "地址");
        printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ",
        pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
    }
}
 
 
void Exchange(contact* pc)//修改聯系人
{
    char name[10];
    printf("輸入要修改人的名字>:\n");
    scanf("%s", name);
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("通訊錄中無修改人的名字");
    }
    else
    {
        printf("請輸入名字>:");
        scanf("%s", pc->data[pos].name);
        printf("請輸入年齡>:");
        scanf("%d", &(pc->data[pos].age));
        printf("請輸入性別:>");
        scanf("%s", pc->data[pos].sex);
        printf("請輸入電話:>");
        scanf("%s", pc->data[pos].tele);
        printf("請輸入地址:>");
        scanf("%s", pc->data[pos].addr);
        printf("修改成功");
    }
}
void destroy(contact* pc)
{
    assert(pc);
    free(pc->data);
    pc->data = NULL;
    pc->capcity = 0;
    pc->sz = 0;
}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
	printf("**********************************************\n");
	printf("*******     1.Add        2.Dele      *********\n");
	printf("*******     3.Find       4.Exchange **********\n");
	printf("*******     5.show       0.exit     **********\n");
	printf("**********************************************\n");
}
int main()
{
	int input = 0;
	contact con;
	Initcontact(&con);
	do
	{
		menu();
		printf("請輸入一個數>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Add(&con);
			break;
		case 2:
			Dele(&con);
			break;
		case 3:
			Find(&con);
			break;
		case 4:
			Exchange(&con);
			break;
		case 5:
			show(&con);
			break;
		case 0:
			destroy(&con);
			printf("退出通訊錄\n");
			break;
		default:
			printf("選擇錯誤\n");
		}
 
	} while (input);
	return 0;
}

感謝各位的閱讀,以上就是“C語言動態與靜態分別實現通訊錄的方法”的內容了,經過本文的學習后,相信大家對C語言動態與靜態分別實現通訊錄的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

连州市| 宝丰县| 滕州市| 左贡县| 玉屏| 扎囊县| 邛崃市| 丽江市| 江门市| 吴江市| 色达县| 丰城市| 青海省| 泰和县| 临高县| 浦城县| 小金县| 湟中县| 库尔勒市| 南召县| 鹤庆县| 淮滨县| 乌什县| 伊通| 邯郸县| 达拉特旗| 中牟县| 武平县| 五寨县| 黔西| 双柏县| 涟源市| 寻乌县| 额济纳旗| 疏勒县| 德阳市| 保定市| 九寨沟县| 兴国县| 赤水市| 海盐县|