双向循环链表写的通讯录。请多多指教!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node
{
int id;
char name[20];
char phone[11];
char addr[30];
struct node *next,*prior;
};
typedef struct node Node;
typedef struct node *Link;
void creat_link(Link *head);
void creat_node(Link *newnode,Link *head);
void insert_head_node(Link newnode,Link *head);
int del_node_id(int id,Link *head);
void id_valuation(Link *head);
int del_node_name(char *name,Link *head);
void again_add(Link *head);
void add(Link *head);
void select_people(char *name,Link *head);
void my_select(Link *head);
void display(Link *head);
void del(Link *head);
void mod(Link *head);
void menu(Link *head);
//创建链表
void creat_link(Link *head)
{
*head = (Link)malloc(sizeof(Node));
if(!(*head))
{
printf("malloc error!\n");
exit(-1);
}
(*head)->next = *head;
(*head)->prior = *head;
}
//创建节点
void creat_node(Link *newnode,Link *head)
{
Link p = (*head)->next;
*newnode = (Link)malloc(sizeof(Node));
if(!(*newnode))
{
printf("malloc error!\n");
exit(-1);
}
else
{
(*newnode)->next = p->next;
p->next->prior = *newnode;
(*newnode)->prior = p;
p->next = *newnode;
}
}
//头插
void insert_head_node(Link newnode, Link *head)
{
newnode -> next =(*head) -> next;
(*head) -> next->prior = newnode;
newnode->prior = *head;
(*head) ->next = newnode;
}
//创建姓名结点
int del_node_name(char *name,Link *head)
{
Link p = (*head)->next;
while(p != (*head))
{
if(strcmp(p->name,name) == 0)
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
p = NULL;
return 0;
}
p = p->next;
}
return -1;
}
int del_node_id(int id,Link *head)
{
Link p = (*head)->next;
while(p != (*head))
{
if(p->id == id);
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
p = NULL;
return 0;
}
p = p->next;
}
return -1;
}
void id_valuation(Link *head)
{
int del_node_id(int id,Link *head);
int i = 0;
Link p = (*head)->next;
while(p != (*head))
{
p -> id = ++i;
p = p->next;
}
}
void again_add(Link *head)
{
char symbol;
getchar();
printf("\n是否继续添加好友? Y/N\n");
scanf("%c",&symbol);
if(symbol == 'y')
{
add(head);
}
return ;
}
//添加联系人
void add(Link *head)
{
void again_add(Link *head);
system("clear");
Link p;
Link q = (*head)->next;
p = (Link)malloc(sizeof(Node));
printf("联系人姓名: ");
scanf("%s",p->name);
printf("手机号码: ");
scanf("%s",p->phone);
printf("家庭住址: ");
scanf("%s",p->addr);
if(q->next == *head)
{
insert_head_node(p,head);
id_valuation(head);
printf("添加成功!\n");
again_add(head);
return ;
}
q = q->next;
if(q->prior == *head && strcmp(p->name,q->name) < 0)
{
insert_head_node(p,&(q->prior));
id_valuation(head);
printf("添加成功!\n");
again_add(head);
return;
}
q = q->next;
while(q != *head)
{
if(strcmp(p->name,q->prior->name) > 0 && strcmp(p->name,q->name) <= 0)
{
insert_head_node(p,&(q->prior));
id_valuation(head);
printf("添加成功!\n");
again_add(head);
return ;
}
q = q->next;
}
insert_head_node(p,&(q->prior));
id_valuation(head);
printf("添加成功!\n");
again_add(head);
return ;
}
//查询联系人
void select_people(char *name,Link *head)
{
int flag = 0;
Link p = (*head)->next;
while(p != (*head))
{
if(strcmp(p->name,name) == 0)
{
flag = 1;
printf("ID: %d\n",p->id);
printf("姓名: %s\n",p->name);
printf("手机号码: %s\n",p->phone);
printf("家庭住址: %s\n",p->addr);
}
p = p->next;
}
if(0 == flag)
{
printf("\n没有该联系人!!");
}
}
void my_select(Link *head)
{
system("clear");
char name[20];
printf("输入要查找人姓名: ");
scanf("%s",name);
select_people(name,head);
printf("\n");
}
//显示联系人
void display(Link *head)
{
system("clear");
Link p = (*head)->next;
if((*head)->next == (*head))
{
printf("empty!\n");
return;
}
else
{
while(p != (*head))
{
printf("ID: %d\n",p->id);
printf("联系人姓名: %s\n",p->name);
printf("手机号码: %s\n",p->phone);
printf("家庭住址: %s\n",p->addr);
p = p->next;
}
}
}
//删除联系人
void del(Link *head)
{
int id;
char name[20];
int i = 0;
Link p = (*head)->next;
printf("输入要删除人的名字:\n");
scanf("%s",name);
while(p != (*head))
{
if(strcmp(p->name,name) == 0)
{
i++;
}
p = p->next;
}
if(0 == i)
{
printf("无此好友!");
return;
}
if(1 == i)
{
del_node_name(name,head);
}
else
{
system("pause");
printf("你要删除的人有以下几人:\n");
select_people(name,head);
printf("输入你要删除人的ID:");
scanf("%d",&id);
del_node_id(id,head);
}
printf("删除成功!");
id_valuation(head);
return;
}
//修改联系人
void mod(Link *head)
{
char dest[20];
Link p = (*head)->next;
int id;
int flag = 0;
printf("输入要修改信息的联系人名字\n");
scanf("%s",dest);
while(p != (*head))
{
if(strcmp(p->name,dest) == 0)
{
flag = 1;
printf("ID: %d\n",p->id);
printf("姓名: %s\n",p->name);
printf("手机号码: %s\n",p->phone);
printf("家庭住址: %s\n",p->addr);
}
p = p->next;
}
if(flag == 0)
{
printf("\n没有此联系人!!\n");
return ;
}
p = (*head)->next;
printf("输入要修改联系人的ID:");
scanf("%d",&id);
while(p != (*head))
{
if( id == p->id )
{
printf("\n请做修改:\n");
printf("手机号码: ");
scanf("%s",p->phone);
printf("家庭住址: ");
scanf("%s",p->addr);
return ;
}
p = p->next;
}
}
void menu(Link *head)
{
system("clear");
int order;
printf("\t\t\t+=================================================+\n");
printf("\t\t\t| |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 多功能电子通讯录 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 版本:1.0|\n");
printf("\t\t\t|-------------------------------------------------|\n");
printf("\t\t\t| 1:添加好友信息 2:查看好友信息 |\n");
printf("\t\t\t|-------------------------------------------------|\n");
printf("\t\t\t| 3:搜索好友信息 4:删除好友信息 |\n");
printf("\t\t\t|-------------------------------------------------|\n");
printf("\t\t\t| 5:修改好友信息 6:退出该通讯录 |\n");
printf("\t\t\t+=================================================+\n");
printf("\n\t\t\t ★请输入需要的操作(1~5): ");
scanf("%d",&order);
switch(order)
{
case 1:
{
add(head);
getchar();
menu(head);
break;
}
case 2:
{
display(head);
getchar();
getchar();
menu(head);
break;
}
case 3:
{
my_select(head);
getchar();
getchar();
menu(head);
break;
}
case 4:
{
del(head);
getchar();
getchar();
menu(head);
break;
}
case 5:
{
mod(head);
getchar();
getchar();
menu(head);
menu(head);
break;
}
case 6:
{
exit(1);
break;
}
default:
{
getchar();
printf("\n\t\t\t\t!!此序号无对应功能,按任意键回到主菜单!!\n");
getchar();
getchar();
getchar();
menu(head);
}
}
}
int main()
{
Link head;
Link newnode;
//Link newnode;
creat_link(&head);
//creat_node(&newnode,&head);
menu(&head);
//add(head);
// display(head);
// menu();
//select(head);
return 0;
}