【数据结构】c语言,通过动态顺序表实现通讯录,内附源码

实现底层代码顺序表

(这个在我之前的文章里有写)这里就直接使用了

seqlist.h

#pragma once

#include <stdio.h>
#include "contact.h"

typedef struct contactinfo datatype;//更改数据类型为通讯录类型

//创造一个顺序表
typedef struct seqlist
{
	datatype* a;//需要储存的数据
	int size;//有效数据个数
	int capacity;//空间容量
}SL;

//初始化
void init(SL* L);//表的三个数据都要改


//销毁
void destroy(SL* L);//销毁是表中的一个数据空间,而这个数据空间的类型是表的结构体类型

//头插
void push_front(SL* L, datatype x);

//尾插
void push_back(SL *L,datatype x);

//头删
void dele_front(SL *L);

//尾删
void dele_back(SL *L);

//打印
void display(SL *L);

//判空
int empty(SL* L);

//指定位置之前插入
void insert_pos(SL *L,int position,datatype x);

//删除指定位置
void dele_pos(SL* L, int position);

//扩容
void check_capacity(SL* L);

//查找
int find(SL* L, datatype x);

seqlist.c

void init(SL* L)
{
	/*L->a = NULL;
	L->size = 0;
	L->capacity = 0;*/
	L->a = (datatype*)malloc(sizeof(datatype) * 4);
	if (L->a == NULL)
	{
		printf("初始化失败!");
		exit(-1);
	}
	L->size = 0;
	L->capacity = 4;
}

void destroy(SL* L)
{
	if(L->a)
	free(L->a);//把空间删掉
	L->a = NULL;//防止野指针
	L->capacity = L->size = 0;

}

void push_front(SL* L, datatype x)
{
	assert(L);
	//空间够不够?,扩容
	if (L->size == L->capacity)
	{
		datatype* temp = (datatype*)realloc(L->a, L->capacity * sizeof(datatype) * 2);//存储数据的空间扩大二倍
		if (temp == NULL)
		{
			printf("realloc fail!\n");
			return;
		}
		L->a = temp;//使得a指向扩大的空间首地址
		L->capacity = L->capacity * 2;
	}


	//插入
	int end = L->size - 1;//指向最后一个数字的位置
	while (end >= 0)//等于0的时候还要再往后移
	{
		L->a[end + 1] = L->a[end];
		end--;
	}
	L->a[0] = x;
	L->size++;
}


void push_back(SL* L, datatype x)
{
	if (L == NULL)
	{
		printf("没找到该表!"); exit(-1);
	}
	//空间够不够?不够需要扩容
	if (L->size == L->capacity)
	{
		/*int newcapcity = L->capacity == 0 ? 4 : 2 * L->capacity;*/
		datatype* temp=(datatype *)realloc(L->a, L->capacity * sizeof(datatype) * 2);//存储数据的空间扩大二倍
		if (temp == NULL)
		{
			printf("realloc fail!\n");
			return;
		}
		L->a = temp;//使得a指向扩大的空间首地址
		L->capacity = L->capacity * 2;
	}

	//插入
	L->a[L->size] = x;
	L->size++;
}


void dele_front(SL* L)//只需要把后面的数前移,直到最后一个元素也移动
{
	int start = 0;
	while (start < L->size - 1)
	{
		L->a[start] = L->a[start + 1];
		start++;
	}
	L->size--;
}

void dele_back(SL* L)//尾删无需扩容
{
	L->size--;
}

int empty(SL* L)
{
	if (L->size == 0)
	{
		return 1;
	}
	else return 0;
} 
         
void check_capacity(SL *L)
{
	if (L->size == L->capacity)
	{
		/*int newcapcity = L->capacity == 0 ? 4 : 2 * L->capacity;*/
		datatype* temp = (datatype*)realloc(L->a, L->capacity * sizeof(datatype) * 2);//存储数据的空间扩大二倍
		if (temp == NULL)
		{
			printf("realloc fail!\n");
			return;
		}
		L->a = temp;//使得a指向扩大的空间首地址
		L->capacity = L->capacity * 2;
	}
}


void insert_pos(SL* L, int position, datatype x)
{
	assert(L);
	check_capacity(L);
	assert(position >= 0 && position <= L->size);


	int end = L->size - 1;
	for (end; end >= position; end--)
	{
		L->a[end + 1] = L->a[end];
	}
	L->a[position] = x;
	L->size++;
}


void dele_pos(SL* L, int position)
{
	assert(L);
	if (L == NULL)
	{
		return;
	}
	for (position; position < L->size - 1; position++)
	{
		L->a[position] = L->a[position + 1];
	}
	L->size--;
}

int find(SL* L,datatype x)
{
	assert(L);
	int i = 0;
	/*for (i = 0; i <= L->size - 1; i++)
	{
		if ()
		{
			printf("找到啦!");
			return i;
		 }	
	}*/
	if (i == L->size)
	{
		printf("找不到!"); return -1;
	}
}

再实现contact 顺序表

contact.h

//通讯录存储的不是单一一个类型,而是一个复合类型结构体
typedef struct contactinfo//这里为定义一个需要存储的数据类型,而非表
{
	char name[100];
	char sex[10];
	int age;
	char tel[15];
	char addr[100];
}cinfo;

//通讯录底层是顺序表来实现
typedef struct seqlist contact;//只是声明,在contact.c里面用



//初始化
void init_contact(contact *L);//这里面传的是顺序表

//销毁
void destroy_contact(contact* L);

//添加联系人
void contactADD(contact *L);

//删除联系人
void contactDele(contact* L);

//修改联系人
void contactModify(contact* L);

//查看通讯录
void contactShow(contact* L);

//查找联系人
int contactFindByName(contact* L,char name[]);

void contactFind(contact* L);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
#include "seqlist.h"
#include <string.h>


void init_contact(contact* L)
{
	init(L);

}


void destroy_contact(contact* L)
{
	destroy(L);
}

void contactADD(contact* L)
{
	cinfo people;///创造一个结构体变量接受数据
	printf("请输入联系人姓名:\n");
	scanf("%s", people.name);
	printf("请输入联系人性别:\n");
	scanf("%s", people.sex);
	printf("请输入联系人年龄:\n");
	scanf("%d", &people.age);//
	printf("请输入联系人电话:\n");
	scanf("%s", people.tel);
	printf("请输入联系人地址:\n");
	scanf("%s", people.addr);
	push_back(L, people);
}


void contactDele(contact* L)
{
	printf("请输入要删除的用户名称:\n");
	char name[100];
	scanf("%s", name);
	int position = contactFindByName(L,name);
	if (position < 0)
	{
		printf("联系人不存在!\n");
		return;
	}
	dele_pos(L, position);
}

void contactModify(contact* L)
{
	printf("请输入要修改的用户名称:\n");
	char name[100];
	scanf("%s", name);
	int position = contactFindByName(L,name);
	if (position < 0)
	{
		printf("要修改的用户不存在!\n");
		return;
	}
	printf("请输入联系人姓名:\n");
	scanf("%s", L->a[position].name);
	printf("请输入联系人性别:\n");
	scanf("%s", L->a[position].sex);
	printf("请输入联系人年龄:\n");
	scanf("%d", &L->a[position].age);//
	printf("请输入联系人电话:\n");
	scanf("%s", L->a[position].tel);
	printf("请输入联系人地址:\n");
	scanf("%s", L->a[position].addr);

}

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


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

void contactFind(contact* L)
{
	printf("请输入要查找的用户名称:\n");
	char name[100];
	scanf("%s", name);
	int position = contactFindByName(L,name);
	if (position < 0)
	{
		printf("联系人不存在!\n");
		return;
	}
	printf("%-10s %-5s %-5s %-20s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%-10s %-5s %-5d %-20s %-20s\n", L->a[position].name,
			L->a[position].sex, L->a[position].age, L->a[position].tel, L->a[position].addr);

}

主函数

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "seqlist.h"
#include "contact.h"

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


int main()
{
	int op = -1;
	contact L;
	init_contact(&L);
	do
	{
		menu();
		printf("请选择你的操作:\n");
		scanf("%d", &op);
		switch (op)
		{
		case 1:
			contactADD(&L);
			break;
		case 2:
			contactDele(&L);
				break;
		case 3:
			contactModify(&L);
			break;
		case 4:
			contactFind(&L);
			break;
		case 0:
			printf("good bye!");
			break;
		default:printf("请重新输入:\n");
		}
	} while (op != 0);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值