/*********************************************************************************************************************************
File Name: ******
Author: *** Date: 2016-12-08
Description: 用链表实现通讯录功能
Functionlist: Create_List_Tail();//添加好友
SelectSort(); //对好友进行升序排序
Search(); //查找好友
Delete_Node(); //删除好友
DisPlayAll(); //显示所有好友信息
DisPlay(); //打印当前创建好友
Meun(); //主菜单
FunMeun(); //功能菜单
main(); //主函数
***********************************************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 0
#define ERROR -1
#define MALLOC_ERROR -2
typedef struct node
{
long ID; //ID号
char Name[20]; //姓名
char MobNum[13]; //手机号码
char Addr[50]; //地址
char CpyNum[13]; //公司电话
struct node *next; //结点指针
}Node;
typedef Node *PNode; //重命名结点指针类型
//尾插法创建链表(添加好友信息)
int Create_List_Tail(PNode h, long ID, char *Name, char *MobNum, char *Addr, char *CpyNum)
{
if (h == NULL)
{
return ERROR;
}
PNode node = (PNode)malloc(sizeof(Node)/sizeof(char));
if (node == NULL)
{
return MALLOC_ERROR;
}
printf("创建用户\n");
printf ("请输入ID: ");
scanf ("%ld", &node->ID);
printf ("请输入姓名: ");
scanf ("%s", node->Name);
printf ("请输入手机号码: ");
scanf ("%s", node->MobNum);
printf ("请输入家庭地址: ");
scanf ("%s", node->Addr);
printf ("请输入公司电话: ");
scanf ("%s", node->CpyNum);
node->next = NULL;
//找到最后一个结点
PNode temp = h;
while (temp->next)
{
temp = temp->next;
}
temp->next = node;
return OK;
}
//对链表用选择排序法进行升序排序(通过ID号)
PNode SelectSort(PNode head)
{
PNode first; //排列后有序链的表头指针
PNode tail; //排列后有序链的表尾指针
PNode p_min; //保留键值更小的节点的前驱节点的指针
PNode min; //存储最小节点
PNode p; //当前比较的节点
first = NULL;
while(head != NULL) //在链表中找键值最小的节点
{
//注意:这里for语句就是体现选择排序思想的地方
for (p = head, min = head; p->next != NULL; p = p->next) //循环遍历链表中的节点,找出此时最小的节点
{
if ((p->next->ID) < (min->ID)) //找到一个比当前min小的节点
{
p_min = p; //保存找到节点的前驱节点:显然p->next的前驱节点是p
min = p->next; //保存键值更小的节点
}
}
//上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表
//第一件事
if (first == NULL) //如果有序链表目前还是一个空链表
{
first = min; //第一次找到键值最小的节点
tail = min; //注意:尾指针让它指向最后的一个节点
}
else //有序链表中已经有节点
{
tail->next = min; //把刚找到的最小节点放到最后,即让尾指针的next指向它
tail = min; //尾指针也要指向它
}
//第二件事
if (min == head) //如果找到的最小节点就是第一个节点
{
head = head->next; //显然让head指向原head->next,即第二个节点,就OK
}
else //如果不是第一个节点
{
p_min->next = min->next; //前次最小节点的next指向当前min的next,这样就让min离开了原链表
}
}
if (first != NULL) //循环结束得到有序链表first
{
tail->next = NULL; //单向链表的最后一个节点的next应该指向NULL
}
head = first;
return head;
}
//查找好友
/* PNode Search(PNode h, char *Name)
{
while (h && strcmp(h->Name,Name) != 0)
{
h = h->next;
}
if (h->next == NULL && strcmp(h->Name,Name) != 0)
{
printf ("Sorry 亲,无此好友 \n");
}
return h;
} */
//查找好友
void Search(PNode head, char *Name)
{
PNode p = head;
PNode q = NULL;
while (p != NULL && (p->next) != NULL)
{
q = p->next;
if (q != NULL && strcmp(q->Name,Name) == 0)
{
printf ("好友信息: ID: %ld 姓名: %s 手机号码: %s 家庭地址: %s 公司电话: %s\n", q->ID, q->Name, q->MobNum, q->Addr, q->CpyNum);
return;
}
else if (q->next == NULL && strcmp(q->Name,Name) != 0)
{
printf ("Sorry 亲,您的通讯录没有该好友!\n");
printf ("请重新输入主菜单指令: 0~4 \n");
}
p = p->next;
}
}
//删除好友信息
void Delete_Node(PNode head, char *Name)
{
PNode p = head;
PNode q = NULL;
while (p != NULL && (p->next) != NULL)
{
q = p->next;
if (q != NULL && strcmp(q->Name,Name) == 0)
{
p->next = q->next;
free(q);
printf ("该好友已成功删除\n");
}
else if (q->next == NULL && strcmp(q->Name,Name) != 0)
{
printf ("Sorry亲,您的通讯录没有该好友!\n");
printf ("请重新输入主菜单指令: 0~4 \n");
}
p = p->next;
}
}
//打印当前所有结点(好友)
void DisPlayAll(PNode h)
{
if (h == NULL)
{
return;
}
PNode temp = h->next;//链表第一个结点指针
while (temp)
{
printf ("ID: %ld 姓名: %s 手机号码: %s 家庭地址: %s 公司电话: %s\n\n", temp->ID, temp->Name, temp->MobNum, temp->Addr, temp->CpyNum);
temp = temp->next;
}
printf ("\n");
}
// 打印当前创建结点(好友)
void DisPlay(PNode h)
{
if (h == NULL)
{
return;
}
PNode temp = h->next; // 链表第一个结点指针
while (temp)
{
if (temp->next == NULL)
{
printf ("\n\t......用户%s已成功创建......\n", temp->Name);
}
temp = temp->next;
}
printf ("\n");
}
//主菜单
int Menu()
{
printf ("************************************************************\n");
printf ("* 欢迎进入通讯录管理系统! *\n");
printf ("************************************************************\n");
printf ("* 1)添加好友 *\n");
printf ("* 2)列表好友信息 *\n");
printf ("* 3)搜索好友 *\n");
printf ("* 4)删除好友 *\n");
printf ("************************************************************\n");
printf ("*********添加好友: 1 查看当前好友信息: 2**************\n");
printf ("*********搜索好友: 3 删除好友: 4**************\n");
printf ("******************显示主菜单: 0*****************************\n");
printf ("************************************************************\n\n");
}
//功能菜单
int FunMeun()
{
printf ("\n\n");
printf (" * * ***** * * ****** **** 功能选择: \n");
printf (" * * * * * * * ** \n");
printf (" * * * * * * * ** 显示主菜单: 0\n");
printf (" ****** ***** * * * * ** 添加好友: 1\n");
printf (" * * * * * * * 查看当前好友信息: 2\n");
printf (" * * * * * * * ** 搜索好友: 3\n");
printf (" * * ***** * * ****** ** 删除好友: 4\n\n");
}
//功能选择函数
int Select()
{
int choice;
while (1)
{
scanf("%d", &choice);
if (!(choice>=0 && choice<=4))
{
printf ("\n\t输入错误,重选0-4:\n\n");
continue;
}
else
{
break;
}
}
return choice;
}
int main()
{
long ID; //ID号
char Name[20]; //姓名
char MobNum[13]; //手机号码
char Addr[50]; //地址
char CpyNum[13]; //公司电话
PNode head_node = (PNode)malloc(sizeof(Node)/sizeof(char));
if (head_node == NULL)
{
return ERROR;
}
head_node->next = NULL;
Menu();//显示主界面
while (1)
{
switch(Select())
{
case 0:
{
Menu();
}break;
case 1://添加好友
{
if (head_node)
{
if (Create_List_Tail(head_node, ID, Name, MobNum, Addr, CpyNum) != OK)
{
return ERROR;
}
}
DisPlay(head_node);//打印当前好友创建信息
head_node = SelectSort(head_node); //创建完成就进行排序,防止后面程序出错
FunMeun();
}break;
case 2://显示好友信息
{
printf ("*******************当前好友信息***********************\n");
//head_node = SelectSort(head_node); //显示好友前先通过ID号对好友信息进行升序
DisPlayAll(head_node);//显示所有好友信息
FunMeun();
}break;
case 3://查找好友
{
printf ("请输入你要查找好友的姓名: \n");
scanf ("%s", Name);
Search(head_node,Name);
FunMeun();
}break;
case 4://删除好友
{
printf ("请输入要删除好友的姓名\n");
scanf ("%s", Name);
Delete_Node(head_node,Name);
FunMeun();
}break;
default:
{
return ERROR;
}
}
}
return 0;
}
File Name: ******
Author: *** Date: 2016-12-08
Description: 用链表实现通讯录功能
Functionlist: Create_List_Tail();//添加好友
SelectSort(); //对好友进行升序排序
Search(); //查找好友
Delete_Node(); //删除好友
DisPlayAll(); //显示所有好友信息
DisPlay(); //打印当前创建好友
Meun(); //主菜单
FunMeun(); //功能菜单
main(); //主函数
***********************************************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 0
#define ERROR -1
#define MALLOC_ERROR -2
typedef struct node
{
long ID; //ID号
char Name[20]; //姓名
char MobNum[13]; //手机号码
char Addr[50]; //地址
char CpyNum[13]; //公司电话
struct node *next; //结点指针
}Node;
typedef Node *PNode; //重命名结点指针类型
//尾插法创建链表(添加好友信息)
int Create_List_Tail(PNode h, long ID, char *Name, char *MobNum, char *Addr, char *CpyNum)
{
if (h == NULL)
{
return ERROR;
}
PNode node = (PNode)malloc(sizeof(Node)/sizeof(char));
if (node == NULL)
{
return MALLOC_ERROR;
}
printf("创建用户\n");
printf ("请输入ID: ");
scanf ("%ld", &node->ID);
printf ("请输入姓名: ");
scanf ("%s", node->Name);
printf ("请输入手机号码: ");
scanf ("%s", node->MobNum);
printf ("请输入家庭地址: ");
scanf ("%s", node->Addr);
printf ("请输入公司电话: ");
scanf ("%s", node->CpyNum);
node->next = NULL;
//找到最后一个结点
PNode temp = h;
while (temp->next)
{
temp = temp->next;
}
temp->next = node;
return OK;
}
//对链表用选择排序法进行升序排序(通过ID号)
PNode SelectSort(PNode head)
{
PNode first; //排列后有序链的表头指针
PNode tail; //排列后有序链的表尾指针
PNode p_min; //保留键值更小的节点的前驱节点的指针
PNode min; //存储最小节点
PNode p; //当前比较的节点
first = NULL;
while(head != NULL) //在链表中找键值最小的节点
{
//注意:这里for语句就是体现选择排序思想的地方
for (p = head, min = head; p->next != NULL; p = p->next) //循环遍历链表中的节点,找出此时最小的节点
{
if ((p->next->ID) < (min->ID)) //找到一个比当前min小的节点
{
p_min = p; //保存找到节点的前驱节点:显然p->next的前驱节点是p
min = p->next; //保存键值更小的节点
}
}
//上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表
//第一件事
if (first == NULL) //如果有序链表目前还是一个空链表
{
first = min; //第一次找到键值最小的节点
tail = min; //注意:尾指针让它指向最后的一个节点
}
else //有序链表中已经有节点
{
tail->next = min; //把刚找到的最小节点放到最后,即让尾指针的next指向它
tail = min; //尾指针也要指向它
}
//第二件事
if (min == head) //如果找到的最小节点就是第一个节点
{
head = head->next; //显然让head指向原head->next,即第二个节点,就OK
}
else //如果不是第一个节点
{
p_min->next = min->next; //前次最小节点的next指向当前min的next,这样就让min离开了原链表
}
}
if (first != NULL) //循环结束得到有序链表first
{
tail->next = NULL; //单向链表的最后一个节点的next应该指向NULL
}
head = first;
return head;
}
//查找好友
/* PNode Search(PNode h, char *Name)
{
while (h && strcmp(h->Name,Name) != 0)
{
h = h->next;
}
if (h->next == NULL && strcmp(h->Name,Name) != 0)
{
printf ("Sorry 亲,无此好友 \n");
}
return h;
} */
//查找好友
void Search(PNode head, char *Name)
{
PNode p = head;
PNode q = NULL;
while (p != NULL && (p->next) != NULL)
{
q = p->next;
if (q != NULL && strcmp(q->Name,Name) == 0)
{
printf ("好友信息: ID: %ld 姓名: %s 手机号码: %s 家庭地址: %s 公司电话: %s\n", q->ID, q->Name, q->MobNum, q->Addr, q->CpyNum);
return;
}
else if (q->next == NULL && strcmp(q->Name,Name) != 0)
{
printf ("Sorry 亲,您的通讯录没有该好友!\n");
printf ("请重新输入主菜单指令: 0~4 \n");
}
p = p->next;
}
}
//删除好友信息
void Delete_Node(PNode head, char *Name)
{
PNode p = head;
PNode q = NULL;
while (p != NULL && (p->next) != NULL)
{
q = p->next;
if (q != NULL && strcmp(q->Name,Name) == 0)
{
p->next = q->next;
free(q);
printf ("该好友已成功删除\n");
}
else if (q->next == NULL && strcmp(q->Name,Name) != 0)
{
printf ("Sorry亲,您的通讯录没有该好友!\n");
printf ("请重新输入主菜单指令: 0~4 \n");
}
p = p->next;
}
}
//打印当前所有结点(好友)
void DisPlayAll(PNode h)
{
if (h == NULL)
{
return;
}
PNode temp = h->next;//链表第一个结点指针
while (temp)
{
printf ("ID: %ld 姓名: %s 手机号码: %s 家庭地址: %s 公司电话: %s\n\n", temp->ID, temp->Name, temp->MobNum, temp->Addr, temp->CpyNum);
temp = temp->next;
}
printf ("\n");
}
// 打印当前创建结点(好友)
void DisPlay(PNode h)
{
if (h == NULL)
{
return;
}
PNode temp = h->next; // 链表第一个结点指针
while (temp)
{
if (temp->next == NULL)
{
printf ("\n\t......用户%s已成功创建......\n", temp->Name);
}
temp = temp->next;
}
printf ("\n");
}
//主菜单
int Menu()
{
printf ("************************************************************\n");
printf ("* 欢迎进入通讯录管理系统! *\n");
printf ("************************************************************\n");
printf ("* 1)添加好友 *\n");
printf ("* 2)列表好友信息 *\n");
printf ("* 3)搜索好友 *\n");
printf ("* 4)删除好友 *\n");
printf ("************************************************************\n");
printf ("*********添加好友: 1 查看当前好友信息: 2**************\n");
printf ("*********搜索好友: 3 删除好友: 4**************\n");
printf ("******************显示主菜单: 0*****************************\n");
printf ("************************************************************\n\n");
}
//功能菜单
int FunMeun()
{
printf ("\n\n");
printf (" * * ***** * * ****** **** 功能选择: \n");
printf (" * * * * * * * ** \n");
printf (" * * * * * * * ** 显示主菜单: 0\n");
printf (" ****** ***** * * * * ** 添加好友: 1\n");
printf (" * * * * * * * 查看当前好友信息: 2\n");
printf (" * * * * * * * ** 搜索好友: 3\n");
printf (" * * ***** * * ****** ** 删除好友: 4\n\n");
}
//功能选择函数
int Select()
{
int choice;
while (1)
{
scanf("%d", &choice);
if (!(choice>=0 && choice<=4))
{
printf ("\n\t输入错误,重选0-4:\n\n");
continue;
}
else
{
break;
}
}
return choice;
}
int main()
{
long ID; //ID号
char Name[20]; //姓名
char MobNum[13]; //手机号码
char Addr[50]; //地址
char CpyNum[13]; //公司电话
PNode head_node = (PNode)malloc(sizeof(Node)/sizeof(char));
if (head_node == NULL)
{
return ERROR;
}
head_node->next = NULL;
Menu();//显示主界面
while (1)
{
switch(Select())
{
case 0:
{
Menu();
}break;
case 1://添加好友
{
if (head_node)
{
if (Create_List_Tail(head_node, ID, Name, MobNum, Addr, CpyNum) != OK)
{
return ERROR;
}
}
DisPlay(head_node);//打印当前好友创建信息
head_node = SelectSort(head_node); //创建完成就进行排序,防止后面程序出错
FunMeun();
}break;
case 2://显示好友信息
{
printf ("*******************当前好友信息***********************\n");
//head_node = SelectSort(head_node); //显示好友前先通过ID号对好友信息进行升序
DisPlayAll(head_node);//显示所有好友信息
FunMeun();
}break;
case 3://查找好友
{
printf ("请输入你要查找好友的姓名: \n");
scanf ("%s", Name);
Search(head_node,Name);
FunMeun();
}break;
case 4://删除好友
{
printf ("请输入要删除好友的姓名\n");
scanf ("%s", Name);
Delete_Node(head_node,Name);
FunMeun();
}break;
default:
{
return ERROR;
}
}
}
return 0;
}