C语言通讯录

通讯录

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
typedef struct Node
{
	int id;
	char* name;
	char* tel;
	struct Node* pNext;

}List;
typedef struct PAGE
{
	int CurrentPage;//当前页
	int OnePageInfo;//每页显示多少条
	int TotalPage;//总页数
	int TotalInfo;//总条数

}Page;
List* GetNode();
void AddNode();
int Getid();
char* Getname();
char* GetTel();
void InitInfo();
Page* GetPage(List* pHead, int n);
void ShowInfo(List* pHead, Page* pPage);
void TurnPage(Page* pPage, List* pHead);
void ShowMenu(Page* pPage);
void Browse(List* pHead);
List* GetNodeIn();
char* GetString();
void Search(List* pHead);
int main()
{
	List* pHead = NULL;
	List* pEnd = NULL;
	char c = '\n';

	InitInfo(&pHead, &pEnd, 102);

	while (1)
	{
		printf("1.浏览信息\n");
		printf("2.添加信息\n");
		printf("3.查询信息\n");	
		printf("q.退出\n");
		scanf_s(" %c",&c);
		switch (c)
		{
		case '1':
			Browse(pHead);
			break;
		case '2':
			AddNode(&pHead, &pEnd, GetNodeIn());
			printf("添加成功\n");
			break;
		case '3':
			Search(pHead);
			break;
		case 'q':
			return 0;
			break;
		}
	}
	return 0;
}
List* GetNode()
{
	List* pTemp = (List*)malloc(sizeof(List));

	pTemp->id = Getid();
	pTemp->name = Getname();
	pTemp->tel = GetTel();
	pTemp->pNext = NULL;

	return pTemp;
}
void AddNode(List** ppHead, List** ppEnd, List* pNode)
{
	if (*ppHead == NULL)
	{
		*ppHead = pNode;
	}
	else
	{
		(*ppEnd)->pNext = pNode;
	}
	*ppEnd = pNode;
}
int Getid()
{
	static int id = 0;
	id++;
	return id;
}
char* Getname()
{
	char* str = (char*)malloc(6);

	int i;
	for (i = 0; i < 5; i++)
	{
		str[i] = rand() % 26 + 97;
	}
	str[i] = '\0';
	return str;
}
char* GetTel()
{
	char* str = (char*)malloc(12);

	switch (rand() % 4)
	{
	case 0:
		str[0] = '1';
		str[1] = '3';
		str[2] = '3';
		break;
	case 1:
		str[0] = '1';
		str[1] = '5';
		str[2] = '5';
		break;
	case 2:
		str[0] = '1';
		str[1] = '7';
		str[2] = '7';
		break;
	case 3:
		str[0] = '1';
		str[1] = '8';
		str[2] = '8';
		break;
	}
	int i;
	for (i = 3; i < 11; i++)
	{
		str[i] = rand() % 10 + '0';
	}
	str[i] = '\0';

	return str;
}
void InitInfo(List** ppHead, List** ppEnd, int n)
{
	srand((unsigned int)time(NULL));

	int i;
	for (i = 0; i < n; i++)
	{
		AddNode(ppHead, ppEnd, GetNode());
	}

}
Page* GetPage(List* pHead, int n)
{
	Page* pPage = (Page*)malloc(sizeof(Page));
	pPage->CurrentPage = 0;
	pPage->OnePageInfo = n;
	pPage->TotalInfo = 0;
	while (pHead != NULL)
	{
		pPage->TotalInfo++;
		pHead = pHead->pNext;
	}
	if (pPage->TotalInfo % n == 0)
	{
		pPage->TotalPage = pPage->TotalInfo / n;
	}
	else
	{
		pPage->TotalPage = pPage->TotalInfo / n + 1;
	}

	/*pPage->TotalPage = pPage->TotalInfo == 0? pPage->TotalInfo / n : pPage->TotalInfo / n + 1;*/
	//三目运算符 代替简单的if else;

	return pPage;
}
void ShowInfo(List* pHead, Page* pPage)
{
	int begin = (pPage->CurrentPage - 1) * pPage->OnePageInfo + 1;
	int end = pPage->CurrentPage * pPage->OnePageInfo;
	int count = 0;
	while (pHead != NULL)
	{
		count++;
		if (begin <= count && count <= end)
		{
			printf("%d	%s	%s\n", pHead->id, pHead->name, pHead->tel);
		}

		pHead = pHead->pNext;
	}
}
void TurnPage(Page* pPage, List* pHead)
{
	char c = 's';

	while (1)
	{
		switch (c)
		{
		case 'w':
			if (pPage->CurrentPage > 1)
			{
				pPage->CurrentPage--;
				ShowInfo(pHead, pPage);
				ShowMenu(pPage);
			}
			else
			{
				printf("已经是第一页了\n");
			}
			break;

		case 's':
			if (pPage->CurrentPage < pPage->TotalPage)
			{
				pPage->CurrentPage++;
				ShowInfo(pHead, pPage);
				ShowMenu(pPage);
			}
			else
			{
				printf("已经是最后一页了\n");
			}
			break;
		case 'b':
			return;
			break;
		default:
			printf("按错了\n");
			break;
		}
		scanf_s(" %c", &c);
	}
}
void ShowMenu(Page* pPage)
{
	printf("当前第%d页 共%d页 总共%d条 w上一页 s下一页 b返回\n", pPage->CurrentPage, pPage->TotalPage
		, pPage->TotalInfo);

}
void Browse(List* pHead)
{
	Page* pPage = GetPage(pHead, 10);

	TurnPage(pPage, pHead);

	free(pPage);
	pPage = NULL;
}
List* GetNodeIn()
{
	List* pTemp = (List*)malloc(sizeof(List));

	pTemp->id = Getid();
	printf("请输入姓名\n");
	pTemp->name = GetString();
	printf("请输入电话\n");
	pTemp->tel = GetString();
	pTemp->pNext = NULL;
	return pTemp;
}
char* GetString()
{
	int size = 5;
	char* str = (char*)malloc(size);
	int count = 0;
	char c;

	scanf_s(" ");
	while ((c = getchar()) != '\n')
	{
		str[count] = c;
		count++;
		if (count == size)
		{
			size += 5;
			str = (char*)realloc(str, size);
		}
	}
	str[count] = '\0';
	return str;
}
void Search(List* pHead)
{
	List* pNewHead = NULL;
	List* pNewEnd = NULL;
	List* pTemp = NULL;
	List* pDel = NULL;

	char* str = NULL;
	while (1)
	{
		printf("请输入\n");
		str = GetString();
		printf("按a确认 按其他键重新输入\n");
		if (getchar() == 'a')
		{
			break;
		}
		else
		{
			free(str);
			str = NULL;
		}
	}
	while (pHead != NULL)
	{
		if (strncmp(pHead->name, str, strlen(str)) == 0 || 
			strncmp(pHead->tel, str, strlen(str)) == 0)
		{
			pTemp = (List*)malloc(sizeof(List));
			pTemp->id =pHead->id ; 
			pTemp->name = pHead->name;
			pTemp->tel = pHead->tel;
			pTemp->pNext = NULL;
			AddNode(&pNewHead, &pNewEnd, pTemp);
		}
		pHead = pHead->pNext;
	}
	Browse(pNewHead);
	while (pNewHead != NULL)
	{
		pDel = pNewHead;
		pNewHead = pNewHead->pNext;
		free(pDel);
		pDel = NULL;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值