最终版address_book.c-1.0,接下来只要封装到makefile里就ok了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


typedef struct user
{
int id;
int sex;
char name[20];
char tel[12];
char address[80];
struct user * prev;
struct user * next;
}User;




typedef struct user * Link;


void malloc_ok(Link *new_node);
void create_link(Link *head);
void create_newnode(Link head,Link *new_node);
void insert(Link head,Link newnode);
void menu();
void menu_search();
void menu_return();
void menu_revise();
void add(Link *head);
void list(Link *head); 
void search(Link *head);
void search_id(Link *head);
void search_name(Link *head);
void search_sex(Link *head);
void search_tel(Link *head);
void search_address(Link *head); 
void delete(Link *head);
void revise(Link *head);
void revise_id(Link *head);
void revise_sex(Link *head);
void revise_name(Link *head);
void revise_tel(Link *head);
void revise_address(Link *head);
int match(char a[],char b[]);
int is_empty(Link *head);




int main()
{
int menu_i;

Link head = NULL;
create_link(&head);

while(1)
{
menu();
scanf("%d",&menu_i);
switch(menu_i)
{
case 1: add(&head);
//system("cls");
break;

case 2: search(&head);
//system("cls");
break;

case 3: delete(&head);
//system("cls");
break;

case 4: revise(&head);
//system("cls");
break;

case 5: list(&head);
getchar();
getchar();
//system("cls");
break;

case 0: printf("\n\t\t\t谢谢使用,欢迎再次使用!"); 
exit(0);
break;

default :printf("\t\t输入有误!请输入正确的编号:");
scanf("%d",&menu_i);
        continue;
}
}

return 0;
}


void malloc_ok(Link *new_node)
{
(*new_node) = (Link)malloc(sizeof(User));
if(*new_node == NULL)
{
printf("creat error!\n");
exit(-1);
}
}


void create_link(Link *head)
{
malloc_ok(head);
(*head)->prev = *head;
(*head)->next = *head;
}


void menu()
{
printf("\t\t\t**************************************************\n\n");
printf("\t\t\t************欢迎使用冰羽通讯录系统****************\n\n");
printf("\t\t\t  1、添加联系人              2、查找联系人\n\n");
printf("\t\t\t  3、删除联系人              4、修改联系人\n\n");
printf("\t\t\t  5、联系人列表              0、退出\n\n");
printf("\t\t\t**************************************************\n\n");
printf("\t\t\t\t请输入您选择的编号:");
}


void create_newnode(Link head,Link *new_node)
{
malloc_ok(new_node);
}


void add(Link *head)
{
int i,add_i;
Link new_node;
printf("请输入要输入的联系人个数:");
scanf("%d",&add_i);
for(i = 0;i < add_i;i++)
{
create_newnode(*head,&new_node);
printf("\t请输入第%d位联系人信息:\n",i+1);

printf("\t\t该联系人性别为(1-m/0-w):");
scanf("%d",&new_node->sex);
if(new_node->sex < 0)
{
new_node->sex *= -1;
}
new_node->sex %= 2;

printf("\t\t该联系人编号为:");
scanf("%d",&new_node->id);
printf("\t\t该联系人姓名为:");
scanf("%s",new_node->name);
printf("\t\t该联系人电话号码为:");
scanf("%s",new_node->tel);
printf("\t\t该联系人住址为:");
scanf("%s",new_node->address);
insert(*head,new_node);
}
printf("\t\t添加成功!");
getchar();
getchar();
}


void insert(Link head,Link newnode)
{
Link p;
p = (head)->next;


while(p->next != head && p->id < (newnode)->id)
{
p = p->next;
}

if(p->id < newnode->id)
{
newnode->next = head;
newnode->prev = head->prev;
head->prev->next = newnode;
head->prev = newnode;
return;
}
else
{
newnode->next = p;
newnode->prev = p->prev;
p->prev->next = newnode;
p->prev = newnode;
return;
}
}


int is_empty(Link *head)
{
if((*head)->next == *head)
{
printf("\t联系人列表为空,请先添加新联系人!\n");
getchar();
getchar();
return 1;
}
return 0;
}
void list(Link *head)
{
Link tmp;

if(is_empty(head) == 1)
{
return;
}

tmp = (*head)->next;
printf("\t现有联系人列表为:\n\n");
printf("\t\t\t编号\t姓名\t\t性别\t号码\t\t\t住址\n\n");
while(tmp->next != (*head))
{
printf("\t\t\t%d\t%s\t\t%d\t%s\t\t%s\n\n",tmp->id,tmp->name,tmp->sex,tmp->tel,tmp->address);
tmp = tmp->next;
}
printf("\t\t\t%d\t%s\t\t%d\t%s\t\t%s\n\n",tmp->id,tmp->name,tmp->sex,tmp->tel,tmp->address);
}


void menu_search()
{
printf("\t\t**************************************************\n\n");
printf("\t\t**************查    找    菜    单****************\n\n");
printf("\t\t      1、按id查找              2、按姓名查找\n\n");
printf("\t\t      3、按号码查找            4、按住址查找\n\n");
printf("\t\t      5、按性别查找            0、返回上一页\n\n"); 
printf("\t\t**************************************************\n\n");
printf("\t\t\t请选择查找类型:");
}


void menu_return()
{
printf("\t\t**************************************************\n\n");
printf("\t\t**************返    回    菜    单****************\n\n");
printf("\t\t      1、返回上一页              0、退出\n\n");
printf("\t\t**************************************************\n\n");
printf("\t\t\t请选择:") ;
}
void search(Link *head)
{
Link tmp;
int loop = 1;
int search_i;

if(is_empty(head) == 1)
{
return;
}

while(loop)
{
//system("cls"); 
menu_search();
scanf("%d",&search_i);
switch(search_i)
{
case 1: search_id(head);
break;

case 2: search_name(head); 
break;

case 3: search_tel(head);
break;

case 4: search_address(head);
break;
case 5: search_sex(head);
break;
 
case 0: loop = 0;
//system("cls");
break;

default:printf("\t\t输入有误!请输入正确的编号:");
getchar();
getchar();
//system("cls");
       continue;
}
}

}


void  search_id(Link *head)
{
Link tmp = (*head)->next;
int choice;
int n;

printf("\t\t请输入要查找的id:");
scanf("%d",&n);

while(tmp->next != *head && tmp->id != n)
{
tmp = tmp->next; 
}
if(tmp->id != n)
{
printf("\n\t\t现有通讯录里没有该id,是否返回?\n\n");

}
else
{
printf("\n\t\t\t编号\t姓名\t\t性别\t号码\t\t\t住址\n");
printf("\t\t\t%d\t%s\t\t%d\t%s\t\t%s\n\n",tmp->id,tmp->name,tmp->sex,tmp->tel,tmp->address);
}
getchar();
menu_return();
scanf("%d",&choice); 
if(choice == 0)
{
printf("\n\t\t\t谢谢使用,欢迎再次使用!"); 
exit(0);
}
}


void  search_sex(Link *head)
{
Link tmp = (*head)->next;
int choice;
int flag = 0;
int sex_tmp;

printf("\t\t请输入要查找的性别(1-m/0-w):");
scanf("%d",&sex_tmp);

while(tmp != *head)
{
if(tmp->sex == sex_tmp)
{
if(flag == 0)
{
printf("\n\t\t\t编号\t姓名\t\t性别\t号码\t\t\t住址\n");
}
printf("\t\t\t%d\t%s\t\t%d\t%s\t\t%s\n\n",tmp->id,tmp->name,tmp->sex,tmp->tel,tmp->address);
flag = 1;
}
tmp = tmp->next; 
}
if(flag == 0)
{
printf("\n\t\t现有通讯录里没有该性别,是否返回?");
}
printf("\n\n");
getchar();
menu_return();
scanf("%d",&choice); 
if(choice == 0)
{
printf("\n\t\t\t谢谢使用,欢迎再次使用!"); 
exit(0);
}
}


void  search_name(Link *head)
{
Link tmp = (*head)->next;
int choice;
int flag = 0;
char search_string[20];

printf("\t\t请输入要查找的姓名关键字:");
scanf("%s",search_string);

while(tmp != *head)
{
if(match(tmp->name,search_string) == 1)
{
if(flag == 0)
{
printf("\n\t\t\t编号\t姓名\t\t性别\t号码\t\t\t住址\n");
}
printf("\t\t\t%d\t%s\t\t%d\t%s\t\t%s\n\n",tmp->id,tmp->name,tmp->sex,tmp->tel,tmp->address);
flag = 1;
}
tmp = tmp->next; 
}
if(match(tmp->name,search_string) != 1 && flag == 0)
{
printf("\n\t\t现有通讯录里没有该关键字的姓名,是否返回?");
}
printf("\n\n");
getchar();
menu_return();
scanf("%d",&choice); 
if(choice == 0)
{
printf("\n\t\t\t谢谢使用,欢迎再次使用!"); 
exit(0);
}
}


void  search_tel(Link *head)
{
Link tmp = (*head)->next;
int choice;
int flag = 0;
char search_string[12];

printf("\t\t请输入要查找的号码关键字:");
scanf("%s",search_string);

while(tmp != *head)
{
if(match(tmp->tel,search_string) == 1)
{
if(flag == 0)
{
printf("\n\t\t\t编号\t姓名\t\t性别\t号码\t\t\t住址\n");
}
printf("\t\t\t%d\t%s\t\t%d\t%s\t\t%s\n\n",tmp->id,tmp->name,tmp->sex,tmp->tel,tmp->address);
flag = 1;
}
tmp = tmp->next; 
}
if(match(tmp->tel,search_string) != 1 && flag == 0)
{
printf("\n\t\t现有通讯录里不存在该关键段的号码,是否返回?");
}
printf("\n\n");
getchar();
menu_return();
scanf("%d",&choice); 
if(choice == 0)
{
printf("\n\t\t\t谢谢使用,欢迎再次使用!"); 
exit(0);
}
}


void  search_address(Link *head)
{
Link tmp = (*head)->next;
int choice;
int flag = 0;
char search_string[80];

printf("\t\t请输入要查找的地址关键字:");
scanf("%s",search_string);

while(tmp != *head)
{
if(match(tmp->address,search_string) == 1)
{
if(flag == 0)
{
printf("\n\t\t\t编号\t姓名\t\t性别\t号码\t\t\t住址\n");
}
printf("\t\t\t%d\t%s\t\t%d\t%s\t\t%s\n\n",tmp->id,tmp->name,tmp->sex,tmp->tel,tmp->address);
flag = 1;
}
tmp = tmp->next; 
}
if(match(tmp->address,search_string) != 1 && flag == 0)
{
printf("\n\t\t现有通讯录里不存在该关键段的地址,是否返回?");
}
printf("\n\n");
getchar();
menu_return();
scanf("%d",&choice); 
if(choice == 0)
{
printf("\n\t\t\t谢谢使用,欢迎再次使用!"); 
exit(0);
}
}


int match(char a[],char b[])
{
char *p1=a;
    char *p2=b;
    while(*p1 != '\0')
    {
        if(*p1 == *p2)
        {
            while(*p1 == *p2 && *p2 != '\0')
            {
                p1++;
                p2++;
            }
        }
        else
            p1++;
        if(*p2 == '\0')
        {
        return 1;
}
p2 = b;
    }
    return 0;
}


void delete(Link *head)
{
Link tmp;
int n;

if(is_empty(head) == 1)
{
return;
}

list(head);
tmp = (*head)->next;

printf("\t\t请输入需要删除的编号:");
scanf("%d",&n);
while(tmp != *head && tmp->id != n)
{
tmp = tmp->next;
}
if(tmp != *head) 
{
tmp->prev->next = tmp->next;
tmp->next->prev = tmp->prev;
free(tmp);
printf("\n\t\t删除成功!\n");
}
else
{
printf("\n\t\t没有该id对应的信息,请确认!\n");
}
list(head);
getchar();
getchar();
}


void revise(Link *head)
{
Link tmp;
int n;
int choice;
int loop = 1;

if(is_empty(head) == 1)
{
return;
}

while(loop)
{
//system("cls");
list(head);
menu_revise();
scanf("%d",&choice);
   switch(choice)
   {
    case 1: revise_id(head);
break;

    case 2: revise_name(head);
break;

    case 3: revise_tel(head);
break;

    case 4: revise_address(head);
break;

case 5: revise_sex(head);
break;
 
    case 0: loop = 0;
    break;
   
    default:printf("\n\t\t输入有误!请输入正确的编号:");
getchar();
getchar();
        continue;
}
}
}


void menu_revise()
{
printf("\t\t***************************************************\n\n");
printf("\t\t****************修    改    菜    单***************\n\n");
printf("\t\t     1、修改某人id            2、修改某人姓名\n\n");
printf("\t\t     3、修改某人号码          4、修改某人住址\n\n");
printf("\t\t     5、修改某人性别  0、返回上一页\n\n");
printf("\t\t\t请选择:");
 } 
 
void revise_id(Link *head)
{
int change_id;
int n;
Link tmp = (*head)->next;
printf("\t\t请输入你需要修改的编号:");
scanf("%d",&n);
while(tmp != *head && tmp->id != n)
{
tmp = tmp->next;
}
if(tmp != *head)
{
printf("\n\t\t原id为%d,要修改为:",tmp->id);
scanf("%d",&change_id);
tmp->id = change_id;
}
else
{
printf("\n\t\t没有这样的id,请确认后操作!\n");
return;
}
}


void revise_sex(Link *head)
{
int change_sex;
int n;
Link tmp = (*head)->next;
printf("\t\t请输入你需要修改的编号:");
scanf("%d",&n);
while(tmp != *head && tmp->id != n)
{
tmp = tmp->next;
}
if(tmp != *head)
{
printf("\n\t\t原性别为%d,要修改为(1-m/0-w):",tmp->sex);
scanf("%d",&change_sex);
tmp->sex = change_sex;
}
else
{
printf("\n\t\t没有这样的id,请确认后操作!\n");
return;
}
}


void revise_name(Link *head)
{
char change_name[20];
int n;
Link tmp = (*head)->next;
printf("\t\t请输入你需要修改的编号:");
scanf("%d",&n);
while(tmp != *head && tmp->id != n)
{
tmp = tmp->next;
}
if(tmp != *head)
{
printf("\n\t\t原姓名为%s,要修改为:",tmp->name);
scanf("%s",change_name);
strcpy(tmp->name,change_name);
}
else
{
printf("\n\t\t没有这样的id,请确认后操作!\n");
return;
}
}


void revise_tel(Link *head)
{
char change_tel[20];
int n;
Link tmp = (*head)->next;
printf("\t\t请输入你需要修改的编号:");
scanf("%d",&n);
while(tmp != *head && tmp->id != n)
{
tmp = tmp->next;
}
if(tmp != *head)
{
printf("\n\t\t原电话号码为%s,要修改为:",tmp->tel);
scanf("%s",change_tel);
strcpy(tmp->tel,change_tel);
}
else
{
printf("\n\t\t没有这样的id,请确认后操作!\n");
return;
}
}


void revise_address(Link *head)
{
char change_address[80];
int n;
Link tmp = (*head)->next;
printf("\t\t请输入你需要修改的编号:");
scanf("%d",&n);
while(tmp != *head && tmp->id != n)
{
tmp = tmp->next;
}
if(tmp != *head)
{
printf("\n\t\t原住址为\t%s\n\t\t要修改为:",tmp->address);
scanf("%s",change_address);
strcpy(tmp->address,change_address);
}
else
{
printf("\n\t\t没有这样的id,请确认后操作!\n");
return;
}

}

明天早点交了作业出去嗨了嘿嘿嘿嘿。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值