前面已经介绍过单链表的具体实现,基于单链表,只要修改节点数据类型,修改相应代码就可以实现通讯录的增删查改功能。
具体实现如下:
//Contact.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define NAME_MAX 100
#define SEX_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
//用户数据
typedef struct PersonInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}PeoInfo;
typedef PeoInfo SLTDataType;
typedef struct SListNode //单链表节点结构
{
SLTDataType data; //数据类型,重命名便于改变数据类型
struct SListNode* next; //这里还不能使用SLTNode,顺序问题
}SLTNode; //重命名
//前置声明
typedef struct SListNode contact;
//创建联系人
contact* ConBuynode();
//初始化通讯录
void InitContact(contact** con);
//添加通讯录数据
void AddContact(contact** con);
//删除通讯录数据
void DelContact(contact** con);
//展示通讯录数据
void ShowContact(contact* con);
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact** con);
//销毁通讯录数据
void DestroyContact(contact** con);
//Contact.c
#include "Contact.h"
//创造节点
SLTNode* SLTBuyNode()
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));//申请空间
if (newnode == NULL)//申请失败
{
perror("MALLOC FAIL!\n");
exit(1);
}
printf("请输入姓名:");
scanf("%s", newnode->data.name);
printf("请输入性别:");
scanf("%s", newnode->data.sex);
printf("请输入年龄:");
scanf("%d", &newnode->data.age);
printf("请输入电话:");
scanf("%s", newnode->data.tel);
printf("请输入住址:");
scanf("%s", newnode->data.addr);
newnode->next = NULL;
return newnode;
}
//创建联系人
contact* ConBuynode()
{
contact* newnode = SLTBuyNode();
return newnode;
}
//初始化通讯录
void InitContact(contact** con)
{
assert(con);
*con = SLTBuyNode();//修改为第一个节点的地址
}
//添加通讯录数据//尾插
void AddContact(contact** con)
{
assert(con);
contact* newnode = ConBuynode();
contact* pcur = *con;
while (pcur->next)//遍历到尾节点
{
pcur = pcur->next;
}
pcur->next = newnode;
}
//删除通讯录数据
void DelContact(contact** con)
{
assert(con);
assert(*con);
char name[NAME_MAX];
printf("请输入需要删除的名字:");
scanf("%s", name);
contact* prev = NULL;
contact* pcur = *con;
while (pcur!= NULL)
{
if (strcmp(name, pcur->data.name) == 0)
{
if (pcur == *con)//一个节点的情况
{
*con = pcur->next;
free(pcur);
printf("删除成功\a\a\a\n");
return;
}
else
{
prev->next = pcur->next;
free(pcur);
printf("删除成功\a\a\a\n");
return;
}
}
prev = pcur;
pcur = pcur->next;
}
printf("该联系人不存在\a\a\a\n");
}
//展示通讯录数据
void ShowContact(contact* con)
{
assert(con);
contact* pcur = con;
printf("名字\t性别\t年龄\t电话\t地址\n");
while (pcur)
{
printf("%s\t", (pcur->data).name);
printf("%s\t", pcur->data.sex);
printf("%d\t", pcur->data.age);
printf("%s\t", pcur->data.tel);
printf("%s\t", pcur->data.addr);
pcur = pcur->next;
printf("\n");
}
}
//查找通讯录数据//名字查询
void FindContact(contact* con)
{
assert(con);
char name[NAME_MAX];
printf("请输入需要查找的名字:");
scanf("%s",name);
contact* pcur = con;
while (pcur)
{
if (strcmp(name,pcur->data.name) == 0)
{
printf("名字\t性别\t年龄\t电话\t地址\n");
printf("%s\t", (pcur->data).name);
printf("%s\t", pcur->data.sex);
printf("%d\t", pcur->data.age);
printf("%s\t", pcur->data.tel);
printf("%s\t\n", pcur->data.addr);
return;
}
pcur = pcur->next;
}
printf("不存在该联系人\a\a\a\n");
}
//修改通讯录数据
void ModifyContact(contact** con)
{
assert(con);
assert(*con);
char name[NAME_MAX];
printf("请输入需要修改的名字:");
scanf("%s", name);
contact* pcur = *con;
while (pcur)
{
if (strcmp(name, pcur->data.name) == 0)
{
printf("\n请修改名字:");
scanf("%s", pcur->data.name);
printf("请修改性别:");
scanf("%s", pcur->data.sex);
printf("请修改年龄:");
scanf("%d", &pcur->data.age);
printf("请修改电话:");
scanf("%s", pcur->data.tel);
printf("请修改地址:");
scanf("%s", pcur->data.addr);
printf("\n");
return;
}
pcur = pcur->next;
}
printf("不存在该联系人\a\a\a\n");
}
//销毁通讯录数据
void DestroyContact(contact** con)
{
contact* prev = *con;
contact* next = *con;
while (prev)
{
next = next->next;
free(prev);
prev = next;
}
*con = NULL;
}