关于双向链表的详细了解请见博主的另一篇博客,本文旨在对单链表进行应用,采用C语言编写。文章来源地址https://www.toymoban.com/news/detail-853953.html
一、驱动层
1.1 List.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"Contact.h"
typedef peoInfo ListDataType;
typedef struct ListNode
{
ListDataType data;
struct ListNode* next; // 指针保存下⼀个节点的地址
struct ListNode* prev; // 指针保存前⼀个节点的地址
}ListNode;
//初始化双向链表
ListNode* ListInit(ListDataType x);
//销毁双向链表
void ListDestroy(ListNode* phead);
//尾插
void ListPushBack(ListNode* phead, ListDataType x);
//删除指定位置的数据
void ListDelete(ListNode* pos);
1.2 List.c
#include"List.h"
#include<string.h>
//重复开辟空间操作单独封装
ListNode* ListBuyNode(ListDataType x)
{
ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
if (newnode==NULL)
{
perror("malloc");
exit(1);
}
newnode->data = x;
newnode->next = newnode;
newnode->prev = newnode;
return newnode;
}
//初始化双向链表
ListNode* ListInit(ListDataType x)
{
ListNode* phead = ListBuyNode(x);
return phead;
}
//销毁双向链表
void ListDestroy(ListNode* phead)
{
assert(phead);
ListNode* temp=NULL;
while (phead->next != phead)
{
temp = phead->next;
free(temp);
temp = NULL;
phead = phead->next;
}
free(phead);
phead = NULL;
}
//尾插
void ListPushBack(ListNode* phead, ListDataType x)
{
assert(phead);
ListNode* newnode = ListBuyNode(x);
newnode->prev = phead->prev;
newnode->next = phead;
phead->prev->next = newnode;
phead->prev = newnode;
}
// 删除指定位置的数据
void ListDelete(ListNode* pos)
{
assert(pos);
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
free(pos);
pos = NULL;
}
二、调用层
2.1 Contact.h
#pragma once
#define NAME_MAX 100
#define GENDER_MAX 4
#define TEL_MAX 11
#define ADDRESS_MAX 100
struct ListNode;
//用户数据
typedef struct PersonInformation
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char address[ADDRESS_MAX];
}peoInfo;
typedef struct ListNode Contact;
//初始化通讯录
Contact* ContactInit();
//添加通讯录数据
void ContactAdd(Contact* con);
//删除通讯录数据
void ContactDel(Contact* con);
//展示通讯录数据
void ContactShow(Contact* con);
//查找通讯录数据
void ContactFind(Contact* con);
//修改通讯录数据
void ContactModify(Contact* con);
//销毁通讯录数据
void ContactDestroy(Contact* con);
2.2 Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
#include"List.h"
#include<string.h>
Contact* FindByname(Contact* con, char* cmp)
{
Contact* pcur = con->next;
while (pcur!=con)
{
if (strcmp(pcur->data.name, cmp) == 0)
{
return pcur;
break;
}
pcur = pcur->next;
}
return NULL;
}
//初始化通讯录
Contact* ContactInit()
{
peoInfo info;
strcpy(info.name, "-1");
strcpy(info.gender, "-1");
info.age = -1;
strcpy(info.tel, "-1");
strcpy(info.address, "-1");
return ListInit(info);
}
//添加通讯录数据
void ContactAdd(Contact* con)
{
peoInfo info;
printf("请输入要添加的联系人姓名\n");
scanf("%s", info.name);
printf("请输入要添加的联系人性别\n");
scanf("%s", info.gender);
printf("请输入要添加的联系人年龄\n");
scanf("%d", &info.age);
printf("请输入要添加的联系人电话\n");
scanf("%s", info.tel);
printf("请输入要添加的联系人住址\n");
scanf("%s", info.address);
ListPushBack(con, info);
}
//删除通讯录数据
void ContactDel(Contact* con)
{
char name[NAME_MAX];
printf("请输入要删除的联系人姓名\n");
scanf("%s", name);
Contact* ret = FindByname(con, name);
if (ret != NULL)
{
ListDelete(ret);
printf("删除成功!\n");
}
else
{
printf("数据不存在!\n");
return;
}
}
//展示通讯录数据
void ContactShow(Contact* con)
{
Contact* pcur = con->next;
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
while (pcur != con)
{
printf("%s ", pcur->data.name);
printf("%s ", pcur->data.gender);
printf("%d ", pcur->data.age);
printf("%s ", pcur->data.tel);
printf("%s ", pcur->data.address);
printf("\n");
pcur = pcur->next;
}
}
//查找通讯录数据
void ContactFind(Contact* con)
{
assert(con);
assert(con->next != con);
char name[NAME_MAX];
printf("请输入要查找的联系人姓名\n");
scanf("%s", name);
Contact* ret = FindByname(con, name);
if (ret != NULL)
{
printf("查找成功!\n");
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%s ", ret->data.name);
printf("%s ", ret->data.gender);
printf("%d ", ret->data.age);
printf("%s ", ret->data.tel);
printf("%s ", ret->data.address);
printf("\n");
}
else
{
printf("数据不存在!\n");
return;
}
}
//修改通讯录数据
void ContactModify(Contact* con)
{
char name[NAME_MAX];
printf("请输入要修改的联系人姓名\n");
scanf("%s", name);
Contact* ret = FindByname(con, name);
if (ret != NULL)
{
printf("请输入新的联系人姓名\n");
scanf("%s", ret->data.name);
printf("请输入新的联系人性别\n");
scanf("%s", ret->data.gender);
printf("请输入新的联系人年龄\n");
scanf("%d", &(ret->data.age));
printf("请输入新的联系人电话\n");
scanf("%s", ret->data.tel);
printf("请输入新的联系人住址\n");
scanf("%s", ret->data.address);
printf("修改成功!\n");
}
else
{
printf("数据不存在!\n");
return;
}
}
//销毁通讯录数据
void ContactDestroy(Contact* con)
{
ListDestroy(con);
}
三、主函数
3.1 main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"List.h"
#include"Contact.h"
void menu()
{
printf("******************通讯录******************\n");
printf("*******1.增加联系人 2.删除联系人********\n");
printf("*******3.修改联系人 4.查找联系人********\n");
printf("*******5.展示联系人 0. 退出 *********\n");
printf("******************************************\n");
}
int main()
{
int a = -1;
Contact* con = ContactInit();
do {
menu();
printf("请选择您的操作:\n");
scanf("%d", &a);
switch (a)
{
case 1:
ContactAdd(con);
break;
case 2:
ContactDel(con);
break;
case 3:
ContactModify(con);
break;
case 4:
ContactFind(con);
break;
case 5:
ContactShow(con);
break;
case 0:
printf("退出通讯录....\n");
break;
default:
printf("输入错误,请重新选择您的操作!\n");
break;
}
} while (a != 0);
ContactDestroy(&con);
return 0;
}
文章来源:https://www.toymoban.com/news/detail-853953.html
到了这里,关于基于双向链表的通讯录C语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!