单链表实现通讯录

文章介绍了如何使用C语言中的顺序表(单链表)实现通讯录功能,包括创建节点、添加、删除、查找、修改和展示联系人信息,以及相应的函数实现和内存管理。
摘要由CSDN通过智能技术生成

不过多赘述了

顺序表的增删查改-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/bkmoo/article/details/137566495?spm=1001.2014.3001.5502

使用顺序表实现通讯录-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/bkmoo/article/details/137676561?spm=1001.2014.3001.5502这里没有使用文件操作只是简单的使用单链表创造一次性的单链表,主要体现是单链表的使用。

首先创建头文件,用来放置函数的声明。contact.h文件,函数的功能分别是创建节点(初始化),通讯录的增删查改和展示通讯录,销毁通讯录。

contact.h代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100

//前置声明
typedef struct SListNode contact;

//用户数据
typedef struct PersonInfo
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char tel[TEL_MAX];
    char addr[ADDR_MAX];
}PeoInfo;

struct SListNode
{
    PeoInfo* pival;
    contact* next;
};




//创建节点//初始化通讯录
contact* newNode();
//添加通讯录数据
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文件放置函数功能实现的代码

创建节点,包含对节点初始化contact* newNode()

contact* newNode()
{
    contact* Node = (contact*)malloc(sizeof(contact));
    Node->pival = (PeoInfo*)malloc(sizeof(PeoInfo));
    Node->next = NULL;
    return Node;
}

要记住使用结构体指针储存数据时要分配内存空间,否则就会报错

增加联系人void AddContact(contact* con)

//添加
void AddContact(contact* con)
{
    //PeoInfo arr;
    contact* pcur = con;
    contact* newnode = newNode();
    contactadd(newnode);
    while (pcur->next != NULL)
    {
        pcur = pcur->next;
    }
    pcur->next = newnode; // 在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址
    //因此要先解引用后链接(->相当于一层解引用)
 }

先创建节点初始化,输入数据后。得到一个完整的节点后进行操作,不然就很乱,这样更容易操作。

在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址,因此要先解引用后链接(->相当于一层解引用)

这里使用到的contactadd函数是输入联系人内容的操作contactadd

void contactadd(contact* con)
{
    //PeoInfo* ret = (PeoInfo*)malloc(sizeof(PeoInfo));
    printf("请输入联系人姓名:\n");
    scanf("%s", con->pival->name);

    printf("请输入联系人性别:\n");
    scanf("%s", con->pival->sex); 

    printf("请输入联系人年龄:\n");
    scanf("%d", &(con->pival->age));

    printf("请输入联系人电话\n");
    scanf("%s", con->pival->tel);

    printf("请输入联系人地址:\n");
    scanf("%s", con->pival->addr);
}

查找操作void FindContact(contact* con)

实现查找操作要先创建一个函数用来寻找节点,方便后续的删除修改操作。一般查找联系人是以人名来找,因此还要一个name数组。

查找节点的函数contact* findContact(contact* con, char a[])

contact* findContact(contact* con, char a[])
{

    con = con->next;
    while (con != NULL)
    {
        if (strcmp(con->pival->name, a) == 0)
        {
            return con;
        }
        con = con->next;
    }
    return NULL;
}

//查找
void FindContact(contact* con)
{
    printf("请输入要查找的联系人名字:\n");
    char a[NAME_MAX];
    scanf("%s", a);

    contact* ret = findContact(con, a);
    if (ret)
    {
        printf("找到了\n");
    }
    else
    {
        printf("没找到\n");
    }

}

删除联系人

删除操作需要先找到要删除的联系人使用contact* findContact(contact* con, char a[])函数

//删除
void DelContact(contact* con)
{
    contact* pcur = con;

    printf("请输入要删除的联系人名字:\n");
    char a[NAME_MAX];
    scanf("%s", a);
    contact* ret = findContact(con, a);
    if (ret)
    {
        while (pcur->next != ret)
        {
            pcur = pcur->next;
        }
        pcur->next = ret->next;
        free(ret);
        ret = NULL;
    }
    else
    {
        printf("查无此人\n");
    }
}

修改联系人数据void ModifyContact(contact** con)

需要先找到需要修改的联系人

//修改
void ModifyContact(contact** con)
{
    contact* pcur = con;

    printf("请输入要修改的联系人名字:\n");
    char a[NAME_MAX];
    scanf("%s", a);

    contact* ret = findContact(con, a);

    if (ret)
    {
        contactadd(ret);
    }
    else
    {
        printf("查无此人\n");
    }
}

展示操作void ShowContact(contact* con)

//展示
void ShowContact(contact* con)
{
    con = con->next;
    while (con != NULL)
    {
        printf("姓名:%s ", con->pival->name);
        printf("性别:%s", con->pival->sex);
        printf("年龄:%d", con->pival->age);
        printf("电话:%s", con->pival->tel);
        printf("地址:%s", con->pival->addr);
        printf("\n");
        con = con->next;
    }
}

最后销毁链表

//销毁
void DestroyContact(contact** con)
{
    contact* pcur = *con;
    contact* perv = pcur->next;
    while (pcur)
    {
        free(pcur->pival);
        free(pcur);
        pcur = perv;
        if (pcur == NULL)
        {
            break;
        }
        perv = perv->next;
    }
}

contact.c代码

#include "contact.h"

void prin(contact* con)
{
	con = con->next;
	while (con != NULL)
	{
		printf("姓名:%s ", con->pival->name);
		printf("性别:%s", con->pival->sex);
		printf("年龄:%d", con->pival->age);
		printf("电话:%s", con->pival->tel);
		printf("地址:%s", con->pival->addr);
		printf("\n");
		con = con->next;
	}
}



contact* newNode()
{
	contact* Node = (contact*)malloc(sizeof(contact));
	Node->pival = (PeoInfo*)malloc(sizeof(PeoInfo));
	Node->next = NULL;
	return Node;
}

//联系人数据
void contactadd(contact* con)
{
	//PeoInfo* ret = (PeoInfo*)malloc(sizeof(PeoInfo));
	printf("请输入联系人姓名:\n");
	scanf("%s", con->pival->name);

	printf("请输入联系人性别:\n");
	scanf("%s", con->pival->sex); 

	printf("请输入联系人年龄:\n");
	scanf("%d", &(con->pival->age));

	printf("请输入联系人电话\n");
	scanf("%s", con->pival->tel);

	printf("请输入联系人地址:\n");
	scanf("%s", con->pival->addr);
}
//添加
void AddContact(contact* con)
{
	//PeoInfo arr;
	contact* pcur = con;
	contact* newnode = newNode();
	contactadd(newnode);//先创建,初始化,输入数据后。即一个完整的节点后进行操作,不然就很乱
	while (pcur->next != NULL)
	{
		pcur = pcur->next;
	}
	pcur->next = newnode; // 在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址
	//因此要先解引用后链接(->相当于一层解引用)
 }

contact* findContact(contact* con, char a[])
{

	con = con->next;
	while (con != NULL)
	{
		if (strcmp(con->pival->name, a) == 0)
		{
			return con;
		}
		con = con->next;
	}
	return NULL;
}
//查找
void FindContact(contact* con)
{
	printf("请输入要查找的联系人名字:\n");
	char a[NAME_MAX];
	scanf("%s", a);

	contact* ret = findContact(con, a);
	if (ret)
	{
		printf("找到了\n");
	}
	else
	{
		printf("没找到\n");
	}

}
//删除
void DelContact(contact* con)
{
	contact* pcur = con;

	printf("请输入要删除的联系人名字:\n");
	char a[NAME_MAX];
	scanf("%s", a);
	contact* ret = findContact(con, a);
	if (ret)
	{
		while (pcur->next != ret)
		{
			pcur = pcur->next;
		}
		pcur->next = ret->next;
		free(ret);
		ret = NULL;
	}
	else
	{
		printf("查无此人\n");
	}
}



//修改
void ModifyContact(contact** con)
{
	contact* pcur = con;

	printf("请输入要修改的联系人名字:\n");
	char a[NAME_MAX];
	scanf("%s", a);

	contact* ret = findContact(con, a);

	if (ret)
	{
		contactadd(ret);
	}
	else
	{
		printf("查无此人\n");
	}
}

//展示
void ShowContact(contact* con)
{
	con = con->next;
	while (con != NULL)
	{
		printf("姓名:%s ", con->pival->name);
		printf("性别:%s", con->pival->sex);
		printf("年龄:%d", con->pival->age);
		printf("电话:%s", con->pival->tel);
		printf("地址:%s", con->pival->addr);
		printf("\n");
		con = con->next;
	}
}

//销毁
void DestroyContact(contact** con)
{
	contact* pcur = *con;
	contact* perv = pcur->next;
	while (pcur)
	{
		free(pcur->pival);
		free(pcur);
		pcur = perv;
		if (pcur == NULL)
		{
			break;
		}
		perv = perv->next;
	}
}

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值