C語言 通訊錄管理系統(容量可變)

2021-07-28 00:15:38 字數 3649 閱讀 3273

在實現容量可變的通訊錄之前,我們得想弄清楚一下幾個函式。

malloc函式

函式原型:

extern void *malloc(unsigned int num_bytes);

功能: 分配長度為num_bytes位元組的記憶體塊

返回值: 返回值型別是void *,所以我們可以把分配好的空間強制型別轉化成你要使用的型別。如果記憶體分配成功則返回指向被分配記憶體的指標,否則返回空指標null。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。函式返回的指標一定要適當對齊,使其可以用於任何資料物件。

calloc函式

函式原型:

void* calloc (size_t num, size_t size);

功能: 用來動態地分配記憶體空間並初始化為0,calloc() 在記憶體中動態地分配 num 個長度為size的連續空間,並將每乙個位元組都初始化為0.所以它的結果是分配了 num*size 個位元組長度的記憶體空間,並且每個位元組的值都是0。

返回值 : 返回值型別是void *,所以我們可以把分配好的空間強制型別轉化成你要使用的型別。分配成功返回指向該記憶體的位址,失敗則返回 null。

注意:如果 size 的值為 0,那麼返回值會因標準庫實現的不同而不同,可能是 null,也可能不是,但返回的指標不應該再次被引用。

realloc函式

函式原型:

extern void *realloc(void *mem_address, unsigned int newsize);

功能: 更改已經分配的記憶體空間,更改的大小可大可小。

1. 如果新的大小小於原記憶體大小,realloc僅僅是改變索引的資訊,但這樣可能會導致資料丟失,慎用!

2 . 如果新的大小大於原記憶體大小,則有以下情況:

先判斷當前的指標是否有足夠的連續空間。

1)如果當前記憶體段後面有足夠的記憶體空間,則直接擴充套件這段記憶體空間,即擴大mem_address指向的位址,並且將mem_address返回。

2)如果當前記憶體段後面的記憶體空間不夠分配,則先按照newsize指定的大小重新分配一段空間,將原空間的資料從頭到尾拷貝到新分配的記憶體空間,而後釋放原來mem_address所指記憶體空間(注意:原指標是自動釋放,不需要使用free),同時返回新分配的記憶體空間的首位址。即重新分配儲存器塊的位址。

3)如果申請失敗,將返回null,此時,原來的指標仍然有效。

注意:如果呼叫成功,不管當前記憶體段後面的空閒空間是否滿足要求,都會釋放掉原來的指標,重新返回乙個指標,只是返回的指標有可能和原來的指標一樣,這也意味著不能再次釋放掉原來的指標。

以上就是關於這幾個函式的介紹。因為經常會用到這幾個函式,所以一定要掌握。這次的容量可變的通訊錄正是使用了這幾個函式,來實現動態增容的效果。

tongxunlu.h

#ifndef _tongxunlu_h_

#define _tongxunlu_h_

#define _crt_secure_no_warnings

#define name_maxnum 20

#define ***_maxnum 5

#define tele_maxnum 12

#define addr_maxnum 10

#define max 1000

#define max_init 2 //最大容量

#define max_rise 2 //增加容量

#include

#include

#include

#include

typedef struct person

person;

typedef struct tongxunlu_list

list,*list_p;

void add(list_p list); //新增聯絡人

void display(list_p list); //顯示聯絡人資訊

void del(list_p list); //刪除指定聯絡人

void search(list_p list); //查詢指定聯絡人

void revise(list_p list); //修改指定聯絡人

void sort_name(list_p list); //聯絡人按照姓名排序

void empty(list_p list); //清空聯絡人

#endif

tongxunlu.c

#include"tongxunlu.h"

static void init(list_p list) //初始化通訊錄空間

list->size=0;

list->capacity=max_init;

}void menu()

void add(list_p list) //新增聯絡人

else

}scanf("%s",list->data[list->size].name);

scanf("%d",&(list->data[list->size].age));

scanf("%s",list->data[list->size].***);

scanf("%s",list->data[list->size].tele);

scanf("%s",list->data[list->size].addr);

list->size++;

printf("新增成功\n");

}static int find_position(list_p list,char *str) //查詢

}return -1;

}void del(list_p list) //刪除指定聯絡人

; scanf("%s",str);

ret=find_position(list,str);

if(ret != -1)

list->size--;

}else

}void search(list_p list) //查詢指定聯絡人

; scanf("%s",str);

ret=find_position(list,str);

if(ret != -1)

else

}void revise(list_p list) //修改指定聯絡人

; scanf("%s",str);

ret=find_position(list,str);

if(ret != -1)

}else

}void display(list_p list) //顯示聯絡人資訊

}void empty(list_p list) //清空聯絡人列表

void sort_name(list_p list) //以名字排序聯絡人

}if(flag == 0)

break;

}}static void free(list_p list) //釋放通訊錄空間

int main()}}

system("pause");

return

0;}

C語言 通訊錄管理系統(容量固定)

話不多說,直接上 tongxunlu.h ifndef tongxunlu h define tongxunlu h define crt secure no warnings 1 include include include typedef struct tongxunlu list void ...

C語言 電子通訊錄管理系統

include include define false 0 define true 1 typedef struct node data nodedata typedef struct node node void menu node s 新增好友 void newfriend node s tm...

C 通訊錄管理系統

總結一下自己的查漏補缺 1 while裡面利用乙個return 0 可以終止無限迴圈 2 主函式裡面的函式呼叫自定義函式傳入的引數用 取出位址,但是定義函式的時候利用 去接收 傳過來的位址。我之前一直弄錯。3 此類裡面利用結構體巢狀。通訊錄有很多人,每個人有名字,年齡等 因此首先定義乙個結構體儲存個...