一、制作链式存储通讯录
1.列表原理:每一个节点都有一个且只有一个直接后继节点与直接前继节点,起始节点无前继节点,终止节点无后继节点
2.运用链式存储原理制作通讯录:
(1、通过C语言中结构体的定义能够实现节点与后继节点的之间的链接
typedef struct d
{
frid* DATA;
struct d* next;
}dir,frd;
每个节点中的DATA用于存储数据,同时next指针用于存储该节点后继节点的地址,以实现节点与节点的连接
(2、通过typedef赋于节点中DATA数据的数据类型,由于是制作通讯录,则该DATA类型中应该存储朋友的信息
typedef struct frd
{
char name[12];
char phonenumber[15];
char sex[4];
char address[40];
char age[3];
char id[10];
}frid;
(3、 通讯录的建立:由于头节点没有前继节点,所以通过需要建立一个空DATA的节点结构体用以定位头节点。头结点的创建如下:
dir* dir_creat()
{
dir* directory_head = (dir*)malloc(sizeof(dir));
assert(directory_head != NULL);
directory_head->DATA = 0;
directory_head->next = NULL;
return directory_head;
}
(4、由此,通过编写节点插入函数、节点查找函数、节点删除函数等函数,即可实现对通讯录的管理,
eg:
(5、通讯录的保存与加载:通过函数fwrite与fread,即可实现将数据写入到文件以及从文件中将数据取出(注:写入数据时,打开文件时以“wb”模式打开,以二进制进行存储,加载数据时以“rb”模式打开,由于每次以“wb”模式打开文件都会将文件中已有内容进行删除再进行写入,所以每次对通讯录进行增加信息时必须要先加载文件数据,再进行插入新的数据,然后进行保存)
数据的保存:
void dir_save(dir* diirector)
{
FILE* fp = fopen("director.data", "wb");
if (fp == NULL)
{
perror("director:");
return;
}
else
{
if (diirector->next != NULL)
{
do {
if (diirector->next != NULL)
{
diirector = diirector->next;
fwrite(diirector->DATA, sizeof(frid), 1, fp);
}
else
{
fwrite(diirector->DATA, sizeof(frid), 1, fp);
}
} while (diirector->next != NULL);
printf("successfully saven");
}
else
printf("无信息写入n");
}
fclose(fp);
fp = NULL;
}
数据的加载:
void dir_load(dir* director)
{
FILE* fp = fopen("director.data", "rb");
if (fp == NULL)
{
perror("director:");
return;
}
else
{
while (1)
{
frid* tmp=(frid*)malloc(sizeof(frid));
assert(tmp != NULL);
int i = (int)fread(tmp, sizeof(frid), 1, fp);
if( i== 0)
break;
frd* f=(frd*)malloc(sizeof(frd));
assert(f != NULL);
f=frd_create(tmp);
frd_insert(director, f);
}
printf("successfully loadedn");
}
fclose(fp);
fp = NULL;
}
3结尾、通过此项目的编写对于malloc函数的认识
本次通讯录中对于数据的插入以及数据的加载与存储的实现都需要创建局部临时变量并且存储其数据,但如果只是简单的在函数中或者某一代码块创建指针指向所创建的局部临时变量并使用其指针,当程序走出函数或者代码块时则会发现,所创建的指向局部临时变量的指针中的内容未空。在写数据加载如果这样写,就会发现每次加载都可以使通讯录链表的节点很好的创建,但是打印节点内容时,会发现内容为空。而通过malloc函数对函数中或代码块中所创建的指向所创建的局部临时变量的指针进行内存分配(内存分配大小为局部变量的大小)就可以很好的解决该问题。总结:malloc函数对于内存空间的分配除了用free函数释放掉,在整个程序的生命周期中是一直存在的,可以通过此使局部变量的数据得到很好的保存。



