c语言通讯录

1.静态版本

#define  _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>

#define max 100
typedef struct peo       //人的信息
{ 
	char name[20];
	int age;
	char sex[10];
	char tele[12];
	char addr[30];
}peo;               //把struct peo重命名(简化)为 peo

typedef struct contact       //通讯录信息
{
	peo data[max];
	int count ;    //count负责记录当前通讯录人数
}contact;

void initcontact(contact* con);
void addcontact(contact* con);
void showcontact(contact* con); 
void delcontact(contact* con);
void searchcontact(contact* con);
void modifycontact(contact* con);
void sortcontact(contact* con);
#define  _CRT_SECURE_NO_WARNINGS
#include"add.h"

void initcontact(contact* con)
{
	con->count = 0;
	memset(con->data, 0, sizeof(con->data));
}

void addcontact(contact* con)
{
	if (con->count == max)
	{
		printf("已经装不下了~\n");
		return;
	}
	printf("输入名字:");
	scanf("%s", con->data[con->count].name);

	printf("输入年龄:");
	scanf("%d", &(con->data[con->count].age));  //别忘了取地址

	printf("输入性别:");
	scanf("%s", con->data[con->count].sex);

	printf("输入手机号:");
	scanf("%s", con->data[con->count].tele);

	printf("输入地址:");
	scanf("%s", con->data[con->count].addr);
	(con->count)++;
	printf("添加成功\n");
}

void showcontact(const contact* con)
{
	int i = 0;
	printf("%-20s\t %-5s\t %-5s\t %-12s\t %-30s\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < con->count; i++)
	{
		printf("%-20s\t %-5d\t %-5s\t %-12s\t %-30s\n", 
			con->data[i].name, 
			con->data[i].age, 
			con->data[i].sex, 
			con->data[i].tele, 
			con->data[i].addr);
	}
	printf("显示完毕\n");
}

void searchcontact(contact* con)
{
	char name[20] = { 0 };
	printf("输入查找人的名字:");
	scanf("%s", name);
	int pos = findbyname(&con, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
		printf("%-20s\t %-5s\t %-5s\t %-12s\t %-30s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t %-5d\t %-5s\t %-12s\t %-30s\n",
			con->data[pos].name,
			con->data[pos].age,
			con->data[pos].sex,
			con->data[pos].tele,
			con->data[pos].addr);
	}
}

static int findbyname(contact* con, char name[])
{
	int i = 0;
	for (i = 0; i < con->count; i++)
	{
		if (strcmp(con->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void modifycontact(contact* con)
{
	//先查找
	char name[20] = { 0 };
	printf("输入修改的人的名字:");
	scanf("%s", name);
	int pos = findbyname(&con, name);
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	else
	{
		printf("输入名字:");
		scanf("%s", con->data[pos].name);

		printf("输入年龄:");
		scanf("%d", &(con->data[pos].age));  //别忘了取地址

		printf("输入性别:");
		scanf("%s", con->data[pos].sex);

		printf("输入手机号:");
		scanf("%s", con->data[pos].tele);

		printf("输入地址:");
		scanf("%s", con->data[pos].addr);
		printf("修改成功!\n");
	}


}

void delcontact( contact* con)
{
	char name[20] = { 0 };
	if (con->count == 0)
	{
		printf("没得可删\n");
		return;
			
	}
	printf("输入删除人的名字:");
	scanf("%s", name);
	//先查找
	int pos=findbyname(&con, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//再删除
	int i = 0;
	for (i = pos; i < con->count-1; i++)   //一个个往前覆盖就是删除了 
	{
		con ->data[i] = con->data[i + 1];
	}
	(con->count)--; 
}

int cmp_peo_byname(const void* e1,const void* e2)
{
	return strcmp(((peo*)e1)->name, ((peo*)e2)->name);
}

void sortcontact(contact* con)
{
	qsort(con->data,con->count,sizeof(peo), cmp_peo_byname);
	printf("排序完了!\n");
}
#include"add.h"

void menu()
{
	printf("*****************************\n");
	printf("*********    1.add     ******\n");
	printf("*********    2.del     ******\n");
	printf("*********    3.search  ******\n");
	printf("*********    4.modify  ******\n");
	printf("*********    5.show    ******\n");
	printf("*********    6.sort    ******\n");
	printf("*********    0.exit    ******\n");
	printf("*****************************\n");
}

enum option
{
	exit,       //枚举中间用逗号隔开
	add,
	del,
	search,
	modify,
	show,
	sort
};

int main()
{
	peo data[100];       //结构体数组,类似于int[100]
	contact con;
	initcontact(&con);
	int count = 0;
	int input = 0;
	do
	{
		menu();
		printf("请选择: ");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			addcontact(&con);     
			break;
		case del:
			delcontact(&con);
			break;
		case search:
			searchcontact(&con);
			break;
		case modify:
			modifycontact(&con);
			break;
		case show:
			showcontact(&con);
			break;
		case sort:
			sortcontact(&con);
			break;
		case exit:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,重新输入:\n");
			break;
		}

	} while (input);
	return 0;
}

2.动态版本


#define max 100

typedef struct peo       //人的信息
{ 
	char name[20];
	int age;
	char sex[10];
	char tele[12];
	char addr[30];
}peo;               //把struct peo重命名(简化)为 peo

typedef struct contact      
{
	peo* data;       //把数组改成指针,方便以后的扩容
	int count;    
	int capacity;       //当前通讯录的容量
}contact;

void initcontact(contact* con)
{
	con->count = 0;
	con->data = (peo*)calloc(3 , sizeof(peo));
	if (con->data == NULL)
	{
		printf("初始化出现错误:%s\n", strerror(errno));
		return;
	}
	con->capacity = 3;
	return ;
}


void addcontact(contact* con)
{

	if (con->count == con->capacity)
	{
		peo* ptr=realloc(con->data, (con->capacity + 2) * sizeof(peo));
		if (ptr == NULL)
		{
			printf("add出现错误:%s\n", strerror(errno));
			return;
		}
		else
		{
			con->data = ptr;
			con->capacity = con->capacity + 2;
		}
	}
	printf("输入名字:");
	scanf("%s", con->data[con->count].name);

	printf("输入年龄:");
	scanf("%d", &(con->data[con->count].age));  //别忘了取地址

	printf("输入性别:");
	scanf("%s", con->data[con->count].sex);

	printf("输入手机号:");
	scanf("%s", con->data[con->count].tele);

	printf("输入地址:");
	scanf("%s", con->data[con->count].addr);
	(con->count)++;
	printf("添加成功\n");
}

void destroy(contact* con)  //添加在exit之前
{
	free(con->data);
	con->data = NULL; 
}

3.车站表

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

#define maxsize 100

typedef struct sss
{
	int distance;
	char name[50];
	int number;
}chezhan;    //定义基本的数据类型 如 "typedef int ElemType" 

typedef struct ss
{
	chezhan data[maxsize];
	int length;
}SqList;   //定义线性表的物理储存方式


//初始化车站
void initlist(SqList* L)
{
	L->length = 0;
	L->data[0].distance = 0;
	strcpy(L->data[0].name, "未命名");
}

//增加车站 

void End_Insert(SqList* L, int weizhi, int l, const char s[])
{
	int n = weizhi;
	weizhi--;
	L->data[weizhi].distance = l;
	L->data[weizhi].number = n;   //第一站
	strcpy(L->data[weizhi].name, s);
	L->length++;
}

bool Insert(SqList* L)
{
	const char s[50] = {0};
	printf("输入站点名称:");
	scanf("%s", s);
	int weizhi = 0;
	printf("输入战点号码:");
	scanf("%d", &weizhi);
	int l = 0;
	printf("输入站点距离前一站的距离:");
	scanf("%d", &l);

	if (L->length + 1 == weizhi)
	{
		End_Insert(L,weizhi,l,s);
		return true;
	}
	else if (L->length < weizhi)
	{
		return false;
	}
	else
	{
		int i = 0;
		int n = weizhi;
		weizhi--;
		for (i = L->length; i > weizhi; i--)
		{
			L->data[i + 1] = L->data[i];
			L->data[weizhi].distance = l;
			L->data[weizhi].number = n;
			strcpy(L->data[weizhi].name, s);
		}
		L->length++;
		return true;
	}
}

//删除车站 
bool ListDelete(SqList* L)
{
	int weizhi = 0;
	printf("输入要删除战点号码:");
	scanf("%d", &weizhi);

	if (weizhi<1 || weizhi>L->length)
		return false;
	weizhi = weizhi - 1;        //将逻辑符号转成数组下标(物理符号)
	for (int i = weizhi; i < L->length; i++)
	{
		L->data[i] = L->data[i+1];
	}
	for (int i = weizhi; i < L->length; i++)
	{
		L->data[i].number--;
	}
	L->length--;
	return true;
}

//按车站名字查找
int LocateElem_name(SqList* L)
{
	const char s[50] = { 0 };
	printf("输入站点名称:");
	scanf("%s", s);
	int i = 0;
	for (i = 0; i < L->length; i++)
	{
		if (strcmp(L->data[i].name, s) == 0)
		{
			printf("找到了,车站名是%s,距离前一站是%d,这是第%d站\n", L->data[i].name, L->data[i].distance, L->data[i].number);
			return i + 1;    //返回逻辑序号
		}
			
	}
	return 0;   //查找失败
}


//按车站序号查找
int LocateElem_number(SqList* L,int weizhi)
{
	int i = 0;
	for (i = 0; i < L->length; i++)
	{
		if (weizhi == L->data[i].number)
		{
			return i + 1;    //返回逻辑序号
		}
			
	}
	return 0;   //查找失败
}

//修改车站信息
void LocateElem_change(SqList* L)
{
	int weizhi = 0;
	printf("输入要修改的战点号码:");
	scanf("%d", &weizhi);

	const char s[50] = { 0 };
	printf("输入修改后的站点名称:");
	scanf("%s", s);
	int l = 0;
	printf("输入修改后的站点距离前一站的距离:");
	scanf("%d", &l);

	int t = LocateElem_number(L, weizhi)-1;
	strcpy(L->data[t].name, s);
	L->data[t].distance = l;
	printf("修改成功\n");
}

//打印车站
void DisList(SqList* L)
{
	for (int i = 0; i < L->length; i++)
	{
		printf("%d ", L->data[i].number);
		printf("%d ", L->data[i].distance);
		printf("%s \n", L->data[i].name);
	}
	printf("\n");
}

void menu()
{
	printf("*****************************\n");
	printf("*******    1.添加站点     ***\n");
	printf("*******    2.删除站点     ***\n");
	printf("*******    3.查找站点     ***\n");
	printf("*******    4.修改站点     ***\n");
	printf("*******    5.看看车表     ***\n");
	printf("*******    0.退出选择     ***\n");
	printf("*****************************\n");
}


int main()
{
	SqList L;
	initlist(&L);
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Insert(&L);
				break;
		case 2:
			ListDelete(&L);
			break;
		case 3:
			LocateElem_name(&L);
			break;
		case 4:
			LocateElem_change(&L);
			break;
		case 5:
			DisList(&L);
			break;
		case 0:
			printf("取消选择 \n");
			break;
		default:
			printf("选择错误,请重新选择:");
		}
	} while (input);
	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对玛导至昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值