通訊錄動態版(動態內存開闢)

實現一個通訊錄;
通訊錄可以用來存儲1000個人的信息,每個人的信息包括:
姓名、性別、年齡、電話、住址

提供方法:
1. 添加聯繫人信息
2. 刪除指定聯繫人信息
3. 查找指定聯繫人信息
4. 修改指定聯繫人信息
5. 顯示所有聯繫人信息
6. 清空所有聯繫人

7. 以名字排序所有聯繫人

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define M 2//初始通訊錄大小
#define N 5//每次增容的大小
//姓名、性別、年齡、電話、住址
typedef struct people
{
	char name[20];
	char sex[10];
	int age;
	int tel;
	char addr[50];
}Peo;

typedef struct Ppeople
{
	Peo *peo;
	int count;//當前實際所存聯繫人數量
	int num;//通訊錄總的容量
}Con,*pCon;
void print(pCon p, int k)//打印信息函數
{
		printf("姓名:%s\t",p->peo[k].name);
		printf("性別:%s\t",p->peo[k].sex);
		printf("年齡:%d\t",p->peo[k].age);
		printf("電話:%d\t",p->peo[k].tel);
		printf("住址:%s\n",p->peo[k].addr);
}
void Scanf(pCon p, int k)//輸入信息函數
{
	printf("請輸入姓名:");
	scanf("%s",p->peo[k].name);
	printf("請輸入性別:");
	scanf("%s",p->peo[k].sex);
	printf("請輸入年齡:");
	scanf("%d",&p->peo[k].age);
	printf("請輸入電話:");
	scanf("%d",&p->peo[k].tel);
	printf("請輸入住址:");
	scanf("%s",p->peo[k].addr);
}
void cheak_cap(pCon p)//檢查當前通訊錄的大小
{
	if(p->count == p->num)
	{
		Peo *ptr = (Peo*)realloc(p->peo,(p->count+N)*sizeof(Peo));
		if(ptr==NULL)
		{
			printf("out of memory\n");
			exit(EXIT_FAILURE);
		}
		else
		{
			p->peo = ptr;
			p->num += N;
		}
	}
}
void Add(pCon p)//添加聯繫人
{
	int i = 0;
	cheak_cap(p);
	Scanf(p,p->count);
	p->count++;
	printf("添加聯繫人成功!\n");
}

void Delete(pCon p)//刪除聯繫人
{
	int k = 0;
	char arr[20] = {0};
	int i = 0;
	int find(pCon p, char* arr);
	if(p->count == 0)
	{
		printf("通訊錄爲空!\n");
	}
	else
	{
		printf("請輸入所要刪除的聯繫人姓名:");
		scanf("%s",arr);
		k = find(p,arr);
		if(k == -1)
			printf("無此聯繫人!");
		else if(k>=0)
		{
			for(i=k; i<p->count-1; i++)
			{
				p->peo[i]=p->peo[i+1];
			}
			p->count--;
			Sleep(1000);
			printf("刪除成功!\n");
		}
	}
}

int find(pCon p, char* arr)//查找聯繫人是否存在
{
	int i = 0;
	for(i=0; i < p->count; i++)
	{
		if(strcmp(arr,p->peo[i].name)==0)
			return i;
	}
	return -1;
}
void Find(pCon p)//查找聯繫人
{
	int k = 0;
	char arr[20] = {0};
	int i = 0;
	int find(pCon p, char* arr);
	if(p->count == 0)
	{
		printf("通訊錄爲空!\n");
	}
	else
	{
		printf("請輸入所要查找的聯繫人姓名:");
		scanf("%s",arr);
		k = find(p,arr);
		if(k == -1)
			printf("無此聯繫人!");
		else if(k>=0)
		{
			print(p, k);

		}
	}
}
void revise(pCon p)//修改聯繫人
{
	int k = 0;
	char arr[20] = {0};
	int i = 0;
	int find(pCon p, char* arr);
	if(p->count == 0)
	{
		printf("通訊錄爲空!\n");
	}
	else
	{
		printf("請輸入所要修改的聯繫人姓名:");
		scanf("%s",arr);
		k = find(p,arr);
		if(k == -1)
			printf("無此聯繫人!");
		else if(k>=0)
		{
			printf("請輸入要修改的信息:\n");
			Scanf(p,k);
			print(p,k);
			printf("修改完成!\n");
		}
	}
}

void show(pCon p)//顯示所有聯繫人
{
	int j = 0;
	if(p->count==0)
	{
		printf("通訊錄爲空!\n");
	}
	else
	{
		while(j<p->count)
		{
			print(p, j);
			j++;
		}
	}
}
void delete_all(pCon p)//刪除所有聯繫人
{
	if(p->count==0)
	{
		printf("通訊錄爲空!\n");
	}
	else
	{
		p->count=0;
		printf("已清空!");
	}
}
void sort(pCon p)//按名字排序所有聯繫人
{
	int i = 0;
	int j = 0;
	int n=0;
	if(p->count==0)
	{
		printf("通訊錄爲空!\n");
	}
	else
	{
		for(i=0; i<p->count-1; i++)
		{
			n=i;
			for(j=i+1;j<p->count; j++)
			{
				if(strcmp(p->peo[n].name,p->peo[j].name)>0)
					n=j;
			}
			if(n!=i)
			{
				Peo tmp;
				tmp = p->peo[n];
				p->peo[n] = p->peo[i];
				p->peo[i] = tmp;
			}
		}
		printf("排序完成!\n");
	}
}
void menu()//菜單
{
	printf("\n");
	printf("\t\t\t***************************通訊錄*************************\n");
	printf("\n");
	printf("\t\t\t************** 1.	添加聯繫人信息      **************\n");
	printf("\t\t\t************** 2.	刪除指定聯繫人信息  **************\n");
	printf("\t\t\t************** 3.	查找指定聯繫人信息  **************\n");
	printf("\t\t\t************** 4.	修改指定聯繫人信息  **************\n");
	printf("\t\t\t************** 5.	顯示所有聯繫人信息  **************\n");
	printf("\t\t\t************** 6.	清空所有聯繫人      **************\n");
	printf("\t\t\t************** 7.	以名字排序所有聯繫人**************\n");
	printf("\t\t\t************** 0.	退出                **************\n");
}
void init(pCon p)//開闢內存以及初始化
{
	p->peo = (Peo*)malloc(M*sizeof(Peo));
	if(p->peo==NULL)
	{
		printf("out of memory!\n");
		exit(EXIT_FAILURE);
	}
	else
	{
		memset(p->peo,0,M*sizeof(Peo));
		p->count = 0;
		p->num = M;
	}
}
int main()
{

	int input = 1;
	Con con;
	init(&con);
	while(input)
	{
		menu();
		printf("請選擇您所要進行的操作:");
		scanf("%d",&input);
		switch(input)
		{
			case 1:Add(&con);
				break;
			case 2:Delete(&con);
				break;
			case 3:Find(&con);
				break;
			case 4:revise(&con);
				break;
			case 5:show(&con);
				break;
			case 6:delete_all(&con);
				break;
			case 7:sort(&con);
				break;
			case 0:
				input = 0;
				break;
			default:
				printf("輸入有誤,請重新輸入!");
				break;
		}
	}
	free(con.peo);
	system("pause");
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章