让我详细讲解一下“C语言链表案例学习之通讯录的实现”的完整攻略。
1. 案例简介
本案例的目的是通过实现一个简单的通讯录程序,来学习C语言链表的原理和操作。程序主要功能涵盖通讯录添加、删除、修改以及查询。
2. 程序架构
程序的整体结构如下所示:
头文件声明
结构体定义
函数声明
主函数
函数实现
其中,头文件声明包含stdio.h、stdlib.h以及string.h,结构体定义包含三个结构体:单个联系人通讯录数据的Node结构体、通讯录的HeadNode结构体和联系人信息Contact结构体。函数声明包含CreateList()、AddNode()、PrintList()、DeleteNode()、ModifyNode()、QueryNode()、ClearList()七个函数,主函数负责程序的启动和关闭。函数实现主要包括各个功能函数的具体操作。
3. 主要函数说明
3.1 CreateList()
该函数的作用是创建一个通讯录链表并初始化。该函数会创建一个HeadNode结构体作为链表的头结点,并返回该结构体的地址。HeadNode结构体中包含一个指向第一个联系人节点的Node结构体指针。此外,HeadNode结构体还包含一个整型变量Size,表示当前链表中联系人的数量。函数代码如下:
HeadNode* CreateList()
{
HeadNode* head =(HeadNode*)malloc(sizeof(HeadNode)); //创建头结点
head->next = NULL;
head->size = 0;
return head;
}
3.2 AddNode()
该函数的作用是将一个联系人信息添加到通讯录链表的末尾。该函数会先创建一个Node结构体,并将联系人信息放入结构体中;然后将该结构体插入到链表的尾部。最后,更新HeadNode结构体中Size的值。函数代码如下:
void AddNode(HeadNode* head)
{
Node* node = (Node*)malloc(sizeof(Node)); //创建新结点
Contact* contact = (Contact*)malloc(sizeof(Contact)); //为联系人信息分配内存空间
printf("请输入联系人姓名:");
scanf("%s",contact->name);
printf("请输入联系人电话:");
scanf("%s",contact->phone);
node->contact = contact;
node->next = NULL;
//如果链表为空,新结点为头结点
if(head->next == NULL)
{
head->next = node;
}
//如果链表不为空,则将结点加入到链表末尾
else
{
Node* last = head->next; //指向第一个结点
while(last->next != NULL)
{
last = last->next;
}
last->next = node;
}
head->size++; //更新链表中联系人的数量
}
3.3 PrintList()
该函数的作用是打印整个通讯录链表。该函数会遍历整个链表,将每个联系人的信息依次输出。函数代码如下:
void PrintList(HeadNode* head)
{
printf("联系人姓名\t联系人电话\n");
Node* node = head->next; //指向第一个结点
while(node != NULL)
{
printf("%s\t\t%s\n",node->contact->name,node->contact->phone);
node = node->next;
}
}
3.4 DeleteNode()
该函数的作用是删除通讯录中指定联系人的信息。该函数的实现过程如下:
- 首先依次遍历链表的每个结点,找到等于指定联系人姓名的结点;
- 将该结点从链表中删除,同时释放该结点所占用的内存空间;
- 更新HeadNode结构体中Size的值。
函数代码如下:
void DeleteNode(HeadNode* head,char* name)
{
Node* node = head->next; //指向第一个结点
Node* last = head; //指向头结点
while(node != NULL)
{
if(strcmp(node->contact->name,name) == 0)
{
last->next = node->next;
free(node);
head->size--; //更新链表中联系人的数量
printf("删除成功!\n");
return;
}
else
{
last = last->next;
node = node->next;
}
}
printf("未找到联系人,请确认联系人信息是否正确!\n");
}
3.5 ModifyNode()
该函数的作用是修改通讯录中指定联系人的信息。该函数的实现过程如下:
- 首先依次遍历链表的每个结点,找到等于指定联系人姓名的结点;
- 将该结点中的联系人信息修改为新的信息;
- 完成修改操作。
函数代码如下:
void ModifyNode(HeadNode* head,char* name)
{
Node* node = head->next; //指向第一个结点
while(node != NULL)
{
if(strcmp(node->contact->name,name) == 0)
{
printf("请重新输入联系人电话:");
scanf("%s",node->contact->phone);
printf("修改成功!\n");
return;
}
else
{
node = node->next;
}
}
printf("未找到联系人,请确认联系人信息是否正确!\n");
}
3.6 QueryNode()
该函数的作用是根据指定联系人姓名查询通讯录。该函数会遍历整个链表,对于每个结点进行判断,如果联系人姓名等于指定的姓名,则输出该联系人的详细信息。函数代码如下:
void QueryNode(HeadNode* head,char* name)
{
Node* node = head->next; //指向第一个结点
while(node != NULL)
{
if(strcmp(node->contact->name,name) == 0)
{
printf("联系人姓名\t联系人电话\n");
printf("%s\t\t%s\n",node->contact->name,node->contact->phone);
return;
}
else
{
node = node->next;
}
}
printf("未找到联系人,请确认联系人信息是否正确!\n");
}
3.7 ClearList()
该函数的作用是清空整个通讯录链表。该函数会遍历整个链表,依次删除链表中的每个结点,并释放其所占用的内存空间。函数代码如下:
void ClearList(HeadNode* head)
{
Node* node = head->next; //指向第一个结点
Node* temp; //用于释放结点空间的临时指针
while(node != NULL)
{
temp = node;
node = node->next;
free(temp);
}
head->next = NULL;
head->size = 0; //更新链表中联系人的数量
printf("通讯录已清空!\n");
}
4. 示例说明
4.1 添加联系人
运行程序,在输入命令后输入"a",按照提示输入联系人姓名和电话,即可完成添加操作,如下示例所示:
请输入命令:a
请输入联系人姓名:张三
请输入联系人电话:13388888888
添加成功!
请输入命令:
4.2 删除联系人
运行程序,在输入命令后输入"d",按照提示输入联系人姓名,即可完成删除操作,如下示例所示:
请输入命令:d
请输入要删除的联系人姓名:张三
删除成功!
请输入命令:
4.3 修改联系人
运行程序,在输入命令后输入"m",按照提示输入联系人姓名和电话,即可完成修改操作,如下示例所示:
请输入命令:m
请输入要修改的联系人姓名:张三
请重新输入联系人电话:15099999999
修改成功!
请输入命令:
4.4 查询联系人
运行程序,在输入命令后输入"q",按照提示输入联系人姓名,即可完成查询操作,如下示例所示:
请输入命令:q
请输入要查询的联系人姓名:张三
联系人姓名 联系人电话
张三 15099999999
请输入命令:
4.5 清空通讯录
运行程序,在输入命令后输入"c",即可完成清空操作,如下示例所示:
请输入命令:c
通讯录已清空!
请输入命令:
以上就是完整的“C语言链表案例学习之通讯录的实现”的攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言链表案例学习之通讯录的实现 - Python技术站