通讯录
#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;
}
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;
}
}