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


PADDRBOOK find_by_name( constchar* name)
PADDRBOOK p = head;
while(p)
if(! strcmp(p-_name, name)) //若比较结果相同,strcmp返回0
returnp; //比较结果相同,即查找到,返回该节点指针
p = p-next; //让p指向下一个节点
returnNULL; //没有查找过,返回NULL(返回p亦可)
该函数能够按照参数指定的姓名,在链表中查找节点,并返回该节点的指针,若没有找到则返回一个空指针 。
函数体中定义了一个临时指针p,为头指针head的一个副本 。然后,通过while循环遍历链表所有节点,不断使用标准库strcmp函数(string.h头文件)来测试节点中的姓名与参数是否相同,若相同则返回该节点的指针,若不相同则让指针p指向下一个节点 。如此循环,直至链表结尾,也就是当p的值为当前链表最后一个节点的next成员的值时,亦即p的值为NULL,此时,循环结束 。若整个循环过程没有查找到指定姓名的节点,则返回NULL(返回p亦可) 。
(六)打印指定姓名的节点 。
void print_by_name( constchar* name)
PADDRBOOK p;
print_title; //打印标题行
if((p = find_by_name(name)) != NULL) //检查返回指针是否为NULL
printf(fmt_str, p-_name, p-_age, p-_address, p-_phone_num);
有了查找指定姓名节点的函数,现在实现打印指定姓名节点的功能就变得非常容易,我们通过调用find_by_name函数,就可以获得指向该节点的指针 。通过标准库函数printf就可以非常方便地格式化打印出节点中的数据 。唯一需要注意的是,find_by_name函数有可能返回一个空指针,所以在打印节点数据之前,先通过if检查一下指针显得非常有必要 。
为了能够统一打印格式,让显示效果更好一些,我们在程序中使用了专门的打印函数,比如函数体中所使用到的print_title函数,它专门负责打印输出数据的标题行 。而且,我们还使用了格式控制字符串,用来控制printf函数的格式化输出效果 。
constchar* fmt_title = "%-20s%-5s%-25s%12s\n"; //标题行格式化控制字符串
constchar* fmt_str = "%-20s%-5u%-25s%12s\n"; //节点数据格式化控制字符串
voidprint_title
printf(fmt_title, "姓名", "年龄", "地址", "电话号码");
printf( "-------------------------------------------------------------------\n");
大家仔细比对一下就会发现,标题行与节点数据的格式化控制字符串中唯一区别就是关于年龄那一块的,毕竟标题中使用的是字符串,而数据中年龄对应的其实是一个无符号整型数值 。稍微提一下的是,格式化控制字符串中的数字表示的是输出所占的字符宽度,而前面加上-号则表示输出按左对齐的方式进行 。
(七)打印所有节点 。
void print_all
PADDRBOOK p = head;
print_title;
while(p)
printf(fmt_str, p-_name, p-_age, p-_address, p-_phone_num);
p = p-next; //让p指向下一个节点
既然能打印出指定姓名的节点,那么想打印链表所有节点也非难事了,我们只需从头指针所指向节点开始,一个个地打印地所有节点数据即可 。循环的过程和查找指定姓名的节点类似,在此就不再赘述了 。
(八)删除指定姓名的节点 。
添加节点比较简单,就像是给火车加车厢,在最后一节车厢后面再接上一个新车厢就是了 。而删除节点恐怕是链表操作中最难的部分了,要删除的节点是链表中第一个节点或是最后一个节点还好,若删除的是链表中间部分的节点,那就得千万小心了,也许一个不小心,就会造成链表的断裂,造成部分数据丢失,引发内存泄露问题 。
在单向链表中,想要删除一个中间节点更要注意 。例如,我们有一个单向链表,它现在有3个节点A、B、C:


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

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