基于链表通讯录基础C代码(解析后补)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
//链表基本数据类型
typedef struct PhonePage {
	int nid;//联系人分配ID
	char* name;//联系人姓名
	char* tel;//联系人电话号码
	struct PhonePage* pNext;//内置下一结点路径
}Page;
Page* GeneratePage(int nid, char* name, char* tel);
typedef struct PageNum {
	int nCurrent;//当前页数
	int nSum;    //总条数
	int nTotle;   //总页数
	int nCount; //每页显示条数
}Num;
//链表基本功能
void AddPage(Page** ppHead, Page** ppEnd, Page* pNode);
void InsertPage(Page** ppHead, Page** ppEnd, Page* ppNode, int n);
void DeletePage(Page** ppHead, Page** ppEnd, int n);
//模拟数据输入
int Generatenid();
char* GenerateName();
char* GenerateTel();
//模拟数据输入总成函数
void Input(Page** ppHead, Page** ppEnd, int n);


//页数显示功能
Num* num(Page* pHead);
//页面打印功能
void Show(Page* pHead, Num* pPage);
页面下菜单栏
int g_MenuType;
void ShowMenu(Num* pPage);
//翻页功能实现
char Turnpage(Num* pPage, Page* pHead);
//浏览
char Browse(Page* pHead);
//数据输入
char* Getstring();
Page* GetPage();
//数据查询
void Search(Page* pHead);
//数据删除
void Delete(Page** ppHead, Page** ppEnd);

int main()
{

	Page* pHead = NULL;
	Page* pEnd = NULL;
	Input(&pHead, &pEnd, 101);
	while (1)
	{
		printf("按1.浏览信息\n");
		printf("按2.添加信息\n");
		printf("按3.查询信息\n");
		printf("按4.删除信息\n");
		printf("按5.退出系统\n");

		char c;
		scanf_s(" %c", &c);
		switch (c)
		{
		case'1':
			g_MenuType = 1;
			Browse(pHead);
			break;
		case'2':
			AddPage(&pHead, &pEnd, GetPage());
			break;
		case'3':
			g_MenuType = 3;
			Search(pHead);
			break;
		case'4':
			g_MenuType = 4;
			Delete( &pHead, &pEnd);
			break;
		case'5':
			return 0;
			break;
		}
	}

}
//数据生成
Page* GeneratePage(int id, char* nname, char* ntel)
{
	Page* pTemp = malloc(sizeof(Page));
	pTemp->nid = id;
	pTemp->name = nname;
	pTemp->tel = ntel;
	pTemp->pNext = NULL;
	return pTemp;
}
int Generatenid()
{
	static int n = 1;
	return n++;
}
char* GenerateName()
{

	char* str = malloc(6);//开五个字节空间
	for (int i = 0; i < 5; i++)
	{
		str[i] = rand() % 26 + 97;//rand()%26+'a0;'

	}
	str[5] = '\0';
	return str;
}
char* GenerateTel()
{
	char* str = malloc(12);
	switch (rand() % 4)
	{
	case 0:
		str[0] = '1';
		str[1] = '3';
		str[2] = '5';
		break;
	case 1:
		strcpy_s(str, 12, "155");

		break;
	case 2:
		strcpy_s(str, 12, "157");
		break;
	case 3:
		strcpy_s(str, 12, "177");
		break;
	}
	for (int i = 3; i < 11; i++)
	{
		str[i] = rand() % 10 + '0';
	}
	str[11] = '\0';
	return str;

}
void Input(Page** ppHead, Page** ppEnd, int n)
{
	srand(time(NULL));
	for (int i = 0; i < n; i++)
	{
		AddPage(ppHead, ppEnd, GeneratePage(Generatenid(), GenerateName(), GenerateTel()));

	}
}
//页面显示功能
Num* num(Page* pHead)
{
	Num* pPage = malloc(sizeof(Num));
	pPage->nCurrent = 0;
	pPage->nCount = 10;
	pPage->nSum = 0;
	while (pHead != NULL)
	{
		pPage->nSum++;
		pHead = pHead->pNext;
	}
	pPage->nTotle = (pPage->nSum) % (pPage->nCount) == 0 ?
		(pPage->nSum) / (pPage->nCount) :
		(pPage->nSum) / (pPage->nCount) + 1;
	return pPage;

}
//页面打印
void Show(Page* pHead, Num* pPage)
{
	int nBegin = (pPage->nCurrent - 1) * pPage->nCount + 1;
	int nEnd = pPage->nCurrent * pPage->nCount;
	int a = 0;
	while (pHead != NULL)
	{
		a++;
		if (a >= nBegin && a <= nEnd)
		{
			printf("%d	%s	%s\n", pHead->nid, pHead->name, pHead->tel);
		}
		pHead = pHead->pNext;
	}
}
//页面下菜单栏

void ShowMenu(Num* pPage)
{
	switch (g_MenuType)
	{
	case 1:
		printf("当前第%d页 共%d页 共%d条  上一页W 下一页S 返回B\n", pPage->nCurrent, pPage->nTotle, pPage->nSum);
		break;
	case 3:
		printf("当前第%d页 共%d页 共%d条  上一页W 下一页S 重新查询C 返回B\n", pPage->nCurrent, pPage->nTotle, pPage->nSum);
		break;
	case 4:
		printf("当前第%d页 共%d页 共%d条  上一页W 下一页S 按D后输入ID删除信息 返回B\n", pPage->nCurrent, pPage->nTotle, pPage->nSum);
		break;
	}

}
//翻页功能实现
char Turnpage(Num* pPage, Page* pHead)
{
	char c = 's';
	while (1)
	{
		switch (c)
		{
		case 'w':
			if (pPage->nCurrent != 1)
			{
				pPage->nCurrent--;
				Show(pHead, pPage);
				ShowMenu(pPage);

				break;
			}
			else
			{
				printf("已经是第一页了。\n下一页S 返回B\n");
				break;
			}


		case 's':
			if (pPage->nCurrent < pPage->nTotle)
			{
				pPage->nCurrent++;
				Show(pHead, pPage);
				ShowMenu(pPage);

				break;
			}
			else
			{
				printf("已经是最后一页了。\n上一页W 返回B\n");

				break;
			}
		case 'b':
			return 'b';
			break;
		case 'd':
			return 'd';
			break;
		case 'c':
			return 0;
			break;
		default:
			printf("按键未识别。\n");
			break;
		}
		scanf_s(" %c", &c);

	}
}
//浏览
char Browse(Num* pHead)
{
	Num* pPage = num(pHead);
	char c = Turnpage(pPage, pHead);
	free(pPage);
	pPage = NULL;
	return c;
}
//输入
char* Getstring()
{
	int nSize = 5;
	char* str = malloc(nSize);
	int nCount = 0;
	char c;
	scanf_s("   ");
	while ((c = getchar()) != '\n')
	{
		str[nCount] = c;
		nCount++;
		if (nCount == nSize)
		{
			nSize += 5;
			str = realloc(str, nSize);
		}
	}
	str[nCount] = '\0';
	return str;

}
Page* GetPage()
{
	Page* pTemp = malloc(sizeof(Page));
	pTemp->nid = Generatenid();
	printf("请输入姓名:\n");
	pTemp->name = Getstring();
	printf("请输入电话:\n");
	pTemp->tel = Getstring();
	pTemp->pNext = NULL;
	return pTemp;
}
//数据查询
void Search(Page* pHead)
{
	Page* pMark = pHead;
	char* str;
	Page* pNewHead = NULL;
	Page* pNewEnd = NULL;
	while (1)
	{
		while (1)
		{

			printf("请输入关键字:\n");
			str = Getstring();
			printf("确认按A 按任意键重新输入\n");
			char c;
			scanf_s("  %c", &c);
			if ('a' == c)
			{
				break;
			}
			else
			{
				free(str);
				str = NULL;
			}
		}


		pHead = pMark;
		while (pHead != NULL)
		{
			if ((strncmp(str, pHead->name, strlen(str)) == 0) || (strncmp(str, pHead->tel, strlen(str)) == 0))
			{
				Page* pTemp = malloc(sizeof(Page));
				pTemp->nid = pHead->nid;
				pTemp->name = pHead->name;
				pTemp->tel = pHead->tel;
				pTemp->pNext = NULL;
				AddPage(&pNewHead, &pNewEnd, pTemp);
			}
			pHead = pHead->pNext;
		}
		

		char b=Browse(pNewHead);
		
		while (pNewHead != NULL)
		{
				Page* ppMark = pNewHead;
				pNewHead = pNewHead->pNext;
				free(ppMark);
		        ppMark=NULL;
		}
		pNewEnd = NULL;

		
		if (b == 'b'||b=='d')
		{
			break;
		}
	}


	//遍历链表
	//关键字与姓名和电话同时核对
	//如果匹配成功,则赋值结点到新链表上
	//调用浏览功能

}
//数据删除
void Delete(Page** ppHead, Page** ppEnd)
{
	Search(*ppHead);
	int id;
	scanf_s("   %d", &id);
	DeletePage(ppHead, ppEnd, id);
	printf("删除完成。\n");
}










//链表操作函数
//链表添加
void AddPage(Page** ppHead, Page** ppEnd, Page* pNode)
{
	if (*ppHead == NULL)
	{
		*ppHead = pNode;

	}
	else
	{
		(*ppEnd)->pNext = pNode;
	}
	*ppEnd = pNode;
};
//链表插入
void InsertPage(Page** ppHead, Page** ppEnd, Page* ppNode, int n)
{

	if (n == ((*ppHead)->nid))
	{
		ppNode->pNext = *ppHead;
		*ppHead = ppNode;
		return;
	}

	Page* pMark = *ppHead;

	while (pMark->pNext != NULL)
	{
		if (pMark->pNext->nid == n)
		{
			ppNode->pNext = pMark->pNext;
			pMark->pNext = ppNode;
			return;
		}

		pMark = pMark->pNext;
	}

	(*ppEnd)->pNext = ppNode;
	*ppEnd = ppNode;
	return;
}
//链表删除
void DeletePage(Page** ppHead, Page** ppEnd, int n)
{
	Page* pMark = NULL;
	if (n == (*ppHead)->nid)
	{
		Page* pMark = *ppHead;
		*ppHead = (*ppHead)->pNext;
		free(pMark);
		return;
	}
	pMark = *ppHead;
	while (pMark->pNext != NULL)
	{
		if (((pMark->pNext->nid == n)) && (pMark->pNext->nid != (*ppEnd)->nid))
		{
			Page* pMark2 = pMark->pNext;
			pMark->pNext = pMark->pNext->pNext;
			free(pMark2);
			return;
		}
		else if ((pMark->pNext->nid == (*ppEnd)->nid) && ((*ppEnd) == n))
		{
			Page* pMark2 = pMark->pNext;
			*ppEnd = pMark;
			pMark->pNext = pMark->pNext->pNext;
			free(pMark2);
			return;
		}
		pMark = pMark->pNext;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值