一 图说C语言 | 用C语言实现一个简单的通讯录( 二 )


(二)定义头指针 。
PADDRBOOK head = NULL;
我们定义一个结构指针类型的全局变量head,并将其初始化值为NULL 。在C语言中,NULL是一个宏,其对应的值为0,即head被初始化为一个空指针 。类似火车头一样,我们将用这个指针来指向链表中的第一个数据节点,所以我们通常将它称之为“头指针”,由于初始阶段并没有任何一个数据节点,所以将其初始化为一个空指针 。
(三)创建节点 。
PADDRBOOK create_addrbook_node( constchar* name, unsignedage, constchar* addr, constchar* phnum)
PADDRBOOK p = (PADDRBOOK) malloc( sizeof(ADDRBOOK));
if(p == NULL)
returnNULL;
strcpy(p-_name, name);
p-_age = age;
strcpy(p-_address, addr);
strcpy(p-_phone_num, phnum);
p-next = NULL;
returnp;
该函数能够在堆内存中创建一个通讯录类型的节点,四个形参分别对应节点的数据域部分的姓名、年龄、地址和电话号码,返回值则为指向该节点的指针 。
在函数体中,我们首先使用标准库函数malloc(stdlib.h头文件)在堆中申请一块内存,参数为申请内存的大小,我们用sizeof运算符来获取通讯录节点的大小作为其实参 。返回值为指向分配内存的首字节地址的指针,我们用节点指针类型变量p来保存它 。
接着,我们用if语句判断堆内存申请是否成功,如果失败的话直接让函数返回NULL 。
若堆内存申请成功,我们就可以将形参值赋给内存节点的各数据成员了 。这里需要注意的是,对于那些字符数组类型的成员不能采用直接赋值的形式,我们可以借助标准库函数strcpy(string.h头文件)来进行字符数组的拷贝 。
因为在创建节点阶段,并不知是否有下一个节点,所以统一将next指针赋值为NULL是个好习惯 。
最后,函数返回在堆内存中创建的节点的指针 。
(四)向链表添加节点 。
voidadd_addrbook( constchar* name, unsignedage, constchar* addr, constchar* phnum)
PADDRBOOK p = create_addrbook_node(name, age, addr, phnum);
if(head == NULL) //链表为空
head = p;
else//链表不为空
PADDRBOOK pPreNode = head;
while(pPreNode-next) //下一节点不为空
pPreNode = pPreNode-next; //让pPreNode指向下一节点
pPreNode-next = p; //将新创建节点的地址赋给链表最后节点的next成员
该函数可以向单向链表添加一个节点 。四个形参的意义与创建节点函数的四个形参意义相同,函数无返回值 。函数的具体功能为通过参数在堆内存中创建一个节点,并将节点放到链表的末端 。
在函数体中,首先将四个形参传递给创建节点函数create_addrbook_node,通过调用create_addrbook_node函数在堆中创建一个节点 。
接下来判断头指针是否为空:如果为空的话,说明当前链表为空,就让头指针指向这个新创建的节点;如果不为空的话,说明链表不为空,那么就需要从头指针指向的节点一个一个向后找,直到最后一个节点,并让这个节点的next指针指向新创建的节点 。代码中,链表为空的情况下,直接将新创建节点的地址赋给head即可;链表不为空的情况下,我们定义一个临时指针pPreNode,将其初始值设为头指针,然后通过while循环不断测试其next成员的值是否为空,在循环体中通过pPreNode = pPreNode-next这条语句来给pPreNode重新赋值,能让pPreNode指向下一个节点,当循环退出时,pPreNode所指节点的next成员为空指针,表示pPreNode现已指向了链表中的最后那个节点,此时,我们将新创建节点的地址赋给最后节点的next成员就可以了 。此刻,大家需谨记的是,新创建的节点俨然已经成为了链表中的最后那个节点了 。
(五)按姓名查找节点 。


以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!

「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助: