功能包括增删改查排序和显示
//用链表实现简单通讯录
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_SIZE 20
#define ADDR_SIZE 30
#define TELE_SIZE 12
typedef struct Data{
int age; //年龄
int sex; //性别
char name[NAME_SIZE]; //姓名
char addr[ADDR_SIZE]; //地址
char tele[TELE_SIZE]; //电话
}Data;
typedef struct LNode{
Data data;
struct LNode * next;
}LNode,*Link;
enum REUSLT{MALLOC_NO,MALLOC_OK};
void Menu();
void Init_link(Link *);
int create_node(LNode ** LNode);
void insert_node(Link);
void show_node(Link);
void delete_node(Link);
LNode * search_node(Link);
void modify_node(Link);
void sort_node(Link);
void main()
{
int op;
Link head=NULL;
Init_link(&head);
do{
Menu();
printf("请输入您的操作:");
scanf("%d",&op);
switch(op)
{
case 1:
insert_node(head);
break;
case 2:
delete_node(head);
break;
case 3:
search_node(head);
//printf("该功能正在维护!!!\n");
break;
case 4:
modify_node(head);
//printf("该功能正在维护!!!\n");
break;
case 5:
sort_node(head);
//printf("该功能正在维护!!!\n");
break;
case 6:
show_node(head);
break;
case 7:
printf("感谢使用!!!\n");
break;
default:
printf("请重新输入!!!\n");
}
}while(op!=7);
}
void sort_node(Link head)
{
int ret;
LNode *p,*pend,*q,*qend;
if(head->next==NULL||head->next->next==NULL)
return ;
else
{
qend=head->next;
q=qend->next;
while(q)
{
pend=head;
p=pend->next;
ret=strcmp(q->data.name,p->data.name);
while(p!=q&&ret>0)
{
pend=pend->next;
p=p->next;
}
if(p==q)
qend=q;
else
{
qend->next=q->next;
q->next=p;
pend->next=q;
}
q=qend->next;
}
printf("sort_link success!!!\n");
show_node(head);
}
}
void modify_node(Link head)
{
int ret;
Data new_node;
LNode * p=NULL;
p=head->next;
printf("请输入您要修改的用户姓名:");
scanf("%s",new_node.name);
while(p!=NULL)
{
ret=strcmp(new_node.name,p->data.name);
if(ret==0)
break;
p=p->next;
}
if(p==NULL)
{
printf("NOT FOUND!!!\n");
return;
}
else
{
printf("请输入新的用户名:");
scanf("%s",new_node.name);
printf("请输入新的年龄:");
scanf("%d",&new_node.age);
printf("请输入新的性别:(1.mele 2.femele)");
scanf("%d",&new_node.sex);
printf("请输入新的家庭地址:");
scanf("%s",new_node.addr);
printf("请输入新的电话:");
scanf("%s",new_node.tele);
strcpy(p->data.name,new_node.name);
p->data.age=new_node.age;
p->data.sex=new_node.sex;
strcpy(p->data.addr,new_node.addr);
strcpy(p->data.tele,new_node.tele);
printf("modify_node success!!!\n");
}
}
LNode * search_node(Link head)
{
char name[NAME_SIZE];
int ret;
LNode * p =NULL;
p=head->next;
printf("请输入您要查找的用户姓名:");
scanf("%s",name);
while(p!=NULL)
{
ret=strcmp(p->data.name,name);
if(ret==0)
break;
p=p->next;
}
if(p==NULL)
{
printf("NOT FOUND!!!\n");
return NULL;
}
printf("姓名 年龄 性别 家庭地址 电话\n");
printf("%s %d ",p->data.name,p->data.age);
if(p->data.sex==1)
printf("男 ");
else
printf("女 ");
printf("%s %s\n",p->data.addr,p->data.tele);
return p;
}
void delete_node(Link head)
{
int ret;
char del_name[NAME_SIZE];
LNode * p=NULL;
LNode * q=NULL;
q=head;
p=head->next;
printf("请输入您要删除的用户姓名:");
scanf("%s",del_name);
while(p!=NULL)
{
ret=strcmp(del_name,p->data.name);
if(ret==0)
break;
q=q->next;
p=p->next;
}
if(p==NULL)
{
printf("NOT FOUND!!!\n");
return ;
}
q->next=p->next;
free(p);
printf("delete_node success!!!\n");
}
void show_node(Link head)
{
LNode * p=NULL;
p=head->next;
if(p==NULL)
{
printf("EMPTY!!!\n");
return ;
}
printf("姓名 年龄 性别 家庭地址 电话\n");
while(p!=NULL)
{
printf("%s %d ",p->data.name,p->data.age);
if(p->data.sex==1)
printf("男 ");
else
printf("女 ");
printf("%s %s\n",p->data.addr,p->data.tele);
p=p->next;
}
printf("end!\n");
}
void Menu()
{
printf("*********************************************\n");
printf("******* 1.add 2.del ********\n");
printf("******* 3.search 4.modify ********\n");
printf("******* 5.sort 6.show ********\n");
printf("******* 7.exit ********\n");
printf("*********************************************\n");
}
void Init_link(Link * head)
{
create_node(head);
if(!(*head))
{
printf("create_Link error");
exit(-1);
}
(*head)->next=NULL;
}
void insert_node(Link head)
{
char new_name[NAME_SIZE];
char new_addr[ADDR_SIZE];
char new_tele[TELE_SIZE];
int a;
LNode * new_node=NULL;
int ret=create_node(&new_node);
if(ret==MALLOC_NO)
{
printf("create node error!!!\n");
exit(-1);
}
printf("请输入用户名:");
scanf("%s",new_name);
strcpy(new_node->data.name,new_name);
printf("请输入用户年龄:");
scanf("%d",&a);
new_node->data.age=a;
do{
printf("请输入用户性别:(1.male,2.female)");
scanf("%d",&a);
new_node->data.sex=a;
if(new_node->data.sex!=1&&new_node->data.sex!=2)
printf("输入格式错误,请重新输入!\n");
}while(new_node->data.sex!=1&&new_node->data.sex!=2);
printf("请输入用户地址:");
scanf("%s",new_addr);
strcpy(new_node->data.addr,new_addr);
printf("请输入用户电话:");
scanf("%s",new_tele);
strcpy(new_node->data.tele,new_tele);
new_node->next=head->next;
head->next=new_node;
printf("存入成功!!!\n");
}
int create_node(LNode ** new_node)
{
(*new_node)=(LNode *)malloc(sizeof(LNode));
if(!(*new_node))
return MALLOC_NO;
return MALLOC_OK;
}