#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;
}
}
基于链表通讯录基础C代码(解析后补)
于 2023-06-09 23:03:27 首次发布