使用顺序表实现通讯录

本文介绍了如何利用顺序表的数据结构实现通讯录功能,包括初始化、添加、删除、查找和修改联系人,以及相应的数据结构定义和操作函数实现。
摘要由CSDN通过智能技术生成

顺序表的增删查改-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/bkmoo/article/details/137566495?spm=1001.2014.3001.5501顺序表已实现,下面借助顺序表的功能实现通讯录。

通讯录都有什么功能呢,有增加联系人,删除联系人,查找联系人,修改联系人,还有通讯录的查看,还有什么呢,还要有退出功能。

首先创建contact.h头文件,声明需要实现的功能

但是再.h文件中需要创建struct PersonInfo结构体,用来储存联系人的属性,如联系人的姓名,性别,年龄,电话,地址。

然后在顺序表中将定义arr数组的类型改为PersonInfo类型。

typedef PeoInfo SLDataType;

// 动态顺序表 -- 按需申请
typedef struct SeqList
{
    SLDataType* arr;
    int size;     // 有效数据个数
    int capacity; // 空间容量
}SL;

typedef SL contact;

使用typedef替换,这样一来就顺序表中的SLDataType类型就全替换了。

#pragma once
#define NAME_MAX 100

#define SEX_MAX 4

#define TEL_MAX 11

#define ADDR_MAX 100



//前置声明
typedef struct SeqList contact;


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



//初始化通讯录

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文件,用于功能的实现。

初始化跟销毁直接引用顺序表中已经实现的功能即可。

//初始化通讯录

void InitContact(contact* con)
{
    SLInit(con);
}

//销毁通讯录数据

void DestroyContact(contact* con)
{
    SLDestroy(con);
}

添加联系人操作,可以先定义 PeoInfo brr数组,用来储存数据,然后用SLPushFront(con, brr)接收,实现插入。

//添加通讯录数据

void AddContact(contact* con)
{
    assert(con);
    PeoInfo brr;
    printf("请输入姓名:\n");
    scanf("%s", brr.name);
    printf("请输入性别:\n");
    scanf("%s", brr.sex);
    printf("请输入年龄:\n");
    scanf("%d", &brr.age);
    printf("请输入电话:\n");
    scanf("%s", brr.tel);
    printf("请输入地址:\n");
    scanf("%s", brr.addr);

    SLPushFront(con, brr);
}
 

删除联系人操作,需要先找到联系人,然后使用顺序表SL.c的功能 SLErase(con, ret),任意位置删除,进行删除操作。一般查找是用联系人的名字查找,先创建一个FindContactname查找联系人,返回值就是con->arr数组中位置。找到后使用 SLErase(con, ret)函数进行删除操作。最后打印一下删除成功,提示程序员删除操作已执行。

int FindContactname(contact* con, char name[])
{
    int i = 0;
    for (i = 0; i < con->size; i++)
    {
        if (strcmp(name, con->arr[i].name) == 0)
        {
            return i;
        }
    }
    return -1;
}
//删除通讯录数据
void DelContact(contact* con)
{
    printf("请输入联系人名字:\n");
    char name[NAME_MAX];
    scanf("%s", name);
    int ret = FindContactname(con, name);
    if (ret < 0)
    {
        printf("该联系人不存在\n");
        return 1;
    }
    SLErase(con, ret);
    printf("删除成功\n");
}

查找通讯录也是用到FindContactname函数。

//查找通讯录数据

void FindContact(contact* con)
{
    char Name[NAME_MAX];
    printf("请输入你要查找的名字:\n");
    scanf("%s", Name);
    int ret = FindContactname(con, Name);
    if (ret < 0)
    {
        printf("查无此人\n");
    }
    else
    {
        printf("找到了\n");
        printf("姓名:%s  性别:%s  年龄:%d  电话:%s  地址:%s \n",
        con->arr[ret].name, con->arr[ret].sex, con->arr[ret].age, con->arr[ret].tel, con->arr[ret].addr);
    }

}
 

展示通讯录就很好实现了,只需要挨个打印即可。

//展示通讯录数据

void ShowContact(contact* con)
{
    int i = 0;
    for (i = 0; i < con->size; i++)
    {
        printf("姓名:%s  性别:%s  年龄:%d  电话:%s  地址:%s \n",
        con->arr[i].name, con->arr[i].sex, con->arr[i].age, con->arr[i].tel, con->arr[i].addr);
    }
}
 

一下是contact.c的代码

#include "SL.h"

int FindContactname(contact* con, char name[])
{
	int i = 0;
	for (i = 0; i < con->size; i++)
	{
		if (strcmp(name, con->arr[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}


//初始化通讯录

void InitContact(contact* con)
{
	SLInit(con);
}

//添加通讯录数据

void AddContact(contact* con)
{
	assert(con);
	PeoInfo brr;
	printf("请输入姓名:\n");
	scanf("%s", brr.name);
	printf("请输入性别:\n");
	scanf("%s", brr.sex);
	printf("请输入年龄:\n");
	scanf("%d", &brr.age);
	printf("请输入电话:\n");
	scanf("%s", brr.tel);
	printf("请输入地址:\n");
	scanf("%s", brr.addr);

	SLPushFront(con, brr);
}

//删除通讯录数据
void DelContact(contact* con)
{
	printf("请输入联系人名字:\n");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindContactname(con, name);
	if (ret < 0)
	{
		printf("该联系人不存在\n");
		return 1;
	}
	SLErase(con, ret);
	printf("删除成功\n");
}

//展示通讯录数据

void ShowContact(contact* con)
{
	int i = 0;
	for (i = 0; i < con->size; i++)
	{
		printf("姓名:%s  性别:%s  年龄:%d  电话:%s  地址:%s \n",
		con->arr[i].name, con->arr[i].sex, con->arr[i].age, con->arr[i].tel, con->arr[i].addr);
	}
}


//查找通讯录数据

void FindContact(contact* con)
{
	char Name[NAME_MAX];
	printf("请输入你要查找的名字:\n");
	scanf("%s", Name);
	int ret = FindContactname(con, Name);
	if (ret < 0)
	{
		printf("查无此人\n");
	}
	else
	{
		printf("找到了\n");
		printf("姓名:%s  性别:%s  年龄:%d  电话:%s  地址:%s \n",
		con->arr[ret].name, con->arr[ret].sex, con->arr[ret].age, con->arr[ret].tel, con->arr[ret].addr);
	}

}

//修改通讯录数据

void ModifyContact(contact* con)
{
	char Name[NAME_MAX];
	printf("请输入你要修改的名字:\n");
	scanf("%s", Name);
	int ret = FindContactname(con, Name);
	if (ret < 0)
	{
		printf("查无此人\n");
	}
	else
	{
		PeoInfo brr;
		printf("请输入姓名:\n");
		scanf("%s", brr.name);
		printf("请输入性别:\n");
		scanf("%s", brr.sex);
		printf("请输入年龄:\n");
		scanf("%d", &brr.age);
		printf("请输入电话:\n");
		scanf("%s", brr.tel);
		printf("请输入地址:\n");
		scanf("%s", brr.addr);

		SLInsert(con, ret, brr);
		printf("修改成功\n");
	}
}

//销毁通讯录数据

void DestroyContact(contact* con)
{
	SLDestroy(con);
}

最后就是在主函数使用了

这里先创建了一个菜单,用来显示操作。


void menu()
{
    printf("***************通讯录***************\n");
    printf("*****1.增加联系人  2.删除联系人*****\n");
    printf("*****3.查找联系人  4.修改联系人*****\n");
    printf("*****5.查看通讯录  0.  退  出  *****\n");
    printf("************************************\n");
}
 

一下是test.c代码实现


#include "SL.h"


void menu()
{
	printf("***************通讯录***************\n");
	printf("*****1.增加联系人  2.删除联系人*****\n");
	printf("*****3.查找联系人  4.修改联系人*****\n");
	printf("*****5.查看通讯录  0.  退  出  *****\n");
	printf("************************************\n");
}

int main()
{

	contact con;
	InitContact(&con);
	int p = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &p);
		printf("\n");
		switch (p)
		{
		case 1:
			printf("增加联系人:\n");
			AddContact(&con);
			break;
		case 2:
			printf("删除联系人:\n");
			DelContact(&con);
			break;
		case 3:
			printf("查找联系人:\n");
			char name[NAME_MAX];
			printf("请输入联系人名字:\n");
			FindContact(&con,name);
			break;
		case 4:
			printf("修改联系人:\n");
			ModifyContact(&con);
			break;
		case 5:
			printf("查看通讯录:\n");
			ShowContact(&con);
			break;
		case 0:
			printf("退出成功");
			break;
		default:
			printf("不存在此项操作! 请重新输入\n");
		}

	} while (p);

	DestroyContact(&con);
	return 0;
}

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,我们需要定义通讯录的联系人实体类: ```java public class Contact { private String name; private String phoneNumber; private String email; public Contact(String name, String phoneNumber, String email) { this.name = name; this.phoneNumber = phoneNumber; this.email = email; } public String getName() { return name; } public String getPhoneNumber() { return phoneNumber; } public String getEmail() { return email; } @Override public String toString() { return "Name: " + name + ", Phone number: " + phoneNumber + ", Email: " + email; } } ``` 接下来,我们需要实现顺序表类: ```java public class ContactList { private Contact[] contacts; private int size; public ContactList(int capacity) { contacts = new Contact[capacity]; size = 0; } public int getSize() { return size; } public void addContact(Contact contact) { if (size == contacts.length) { throw new RuntimeException("Contact list is full"); } contacts[size++] = contact; } public Contact getContact(int index) { if (index < 0 || index >= size) { throw new RuntimeException("Invalid index"); } return contacts[index]; } public void removeContact(int index) { if (index < 0 || index >= size) { throw new RuntimeException("Invalid index"); } for (int i = index; i < size - 1; i++) { contacts[i] = contacts[i + 1]; } contacts[size - 1] = null; size--; } public void updateContact(int index, Contact contact) { if (index < 0 || index >= size) { throw new RuntimeException("Invalid index"); } contacts[index] = contact; } public Contact[] getAllContacts() { Contact[] result = new Contact[size]; for (int i = 0; i < size; i++) { result[i] = contacts[i]; } return result; } } ``` 然后,我们可以在主函数中使用顺序表类来实现通讯录: ```java public static void main(String[] args) { ContactList contactList = new ContactList(10); contactList.addContact(new Contact("Alice", "1234567890", "alice@example.com")); contactList.addContact(new Contact("Bob", "2345678901", "bob@example.com")); contactList.addContact(new Contact("Charlie", "3456789012", "charlie@example.com")); contactList.removeContact(1); contactList.updateContact(0, new Contact("Alice", "0987654321", "alice@example.com")); Contact[] contacts = contactList.getAllContacts(); for (Contact contact : contacts) { System.out.println(contact); } } ``` 输出结果: ``` Name: Alice, Phone number: 0987654321, Email: alice@example.com Name: Charlie, Phone number: 3456789012, Email: charlie@example.com ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值