链表实现功能强大的通讯录

/*****************************************************
copyright (C), Nanjing University of ZiJin
File name:txl.c
Author: CaoMengDe  Version:0.1    Date: 2016-12-13 17:29
Description:
Funcion List: 
*****************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0


typedef int ElementType;
typedef int Status;


typedef struct node
{
    char name[20];
    ElementType age;
    char sex[10];
    char phonenumber[20];
    struct node *next;


}Node;


Status Menu(Node* head);
Status Menuupdate(Node* head);
Status Menudelete(Node* head);
Status Menuquery(Node* head);
int Length(Node* head);
Status init(Node** head);
Status inserttail(Node* head);
Status deleteindex(Node* head);
Status deletename(Node* head);
Status deletephonenumber(Node* head);
Status updateindex(Node* head);
Status updatename(Node* head);
Status updatephone(Node* head);
void queryindex(Node* head);
void queryname(Node* head);
void queryphonenumber(Node* head);
void print(Node* head);
void sort(Node* head);


int main(int argc, char **argv)
{
    int ret;
char flag;
    Node* head;
    ret = init(&head);
    if(ERROR == ret)
    {
        return -1;
    }

Menu(head);
    sort(head);
    print(head);


    return 0;
}




//主菜单


Status Menu(Node* head)
{
int number;
printf("欢迎来到Coder通讯录!\n");
printf("\n");
printf("1:新增联系人\n");
printf("\n");
printf("2:删除联系人\n");
printf("\n");
printf("3:修改联系人信息\n");
printf("\n");
printf("4:查找通讯录信息\n");
printf("\n");
printf("5:弹出操作提示\n");
printf("\n");
    printf("q:退出菜单\n");
printf("\n");
printf("请输入指令\n");

while(scanf("%d", &number) == 1)
    {
   
   switch(number)
   {
   case 1:
   {
       inserttail(head);
       break;
   }
   case 2:
   {
   Menudelete(head);
   break;
   }
   case 3:
   {
   Menuupdate(head);
   break;
   }
   case 4:
   {
   Menuquery(head);
   break;
   }
case 5:
{
printf("1:新增联系人\n");
           printf("\n");
           printf("2:删除联系人\n");
           printf("\n");
           printf("3:修改联系人信息\n");
           printf("\n");
           printf("4:查找通讯录信息\n");
           printf("\n");
                printf("q:退出菜单\n");
           printf("\n");
           printf("请输入数字\n");
break;
}
default: printf("请重新输入正确的操作指令\n");
   }

   
    }
    return OK;
}
 


 //修改方式菜单
 
Status Menuupdate(Node* head)
{
int ret;
int number;
printf("1.根据编号进行修改\n");
printf("\n");
    printf("2.根据姓名进行修改\n");
printf("\n");
    printf("3.根据手机号码进行修改\n");
printf("\n");
printf("请输入你想选择的功能号码\n");
scanf("%d", &number);
switch(number)
{
case 1:
{
updateindex(head);
break;
}

case 2:
{
updatename(head);
break;
}

case 3:
{
updatephone(head);
break;
}
}
return OK;


}
 
 
 //删除子菜单
 
 Status Menudelete(Node* head)
 {
int ret;
int number;
printf("1.根据编号进行删除\n");
printf("\n");
    printf("2.根据姓名进行删除\n");
printf("\n");
    printf("3.根据手机号码进行删除\n");
printf("\n");
printf("请输入你想选择的功能号码\n");
scanf("%d", &number);
switch(number)
{
case 1:
{
deleteindex(head);
break;
}

case 2:
{
deletename(head);
break;
}

case 3:
{
deletephonenumber(head);
break;
}
}
return OK;


 }
 
 
 //查询子菜单
 
 Status Menuquery(Node* head)
 {
int number;
printf("1.根据编号进行查找\n");
printf("\n");
    printf("2.根据姓名进行查找\n");
printf("\n");
    printf("3.根据手机号码进行查找\n");
printf("\n");
printf("请输入你想选择的功能号码\n");
scanf("%d", &number);
switch(number)
{
case 1:
{
queryindex(head);
break;
}

case 2:
{
queryname(head);
break;
}

case 3:
{
queryphonenumber(head);
break;
}
}
return OK;


 }
 
 
 //初始化
 
Status init(Node** head)
{
     Node* new = (Node*)malloc(sizeof(Node));
     if(NULL == new)
     {
         return ERROR;
     }
     *head = new;
     (*head)->next = NULL;
     return OK;
}




//尾插法


Status inserttail(Node* head)
{

while(head->next != NULL)
    {
        head = head->next;
    }
Node* new = (Node*)malloc(sizeof(Node));
if(NULL == new)
{
return ERROR;
}
head->next = new;
new->next = NULL;

printf("请输入添加成员姓名:\n");
scanf("%s", new->name);
printf("请输入成员性别:\n");
scanf("%s", new->sex);
printf("请输入成员年龄:\n");
scanf("%d", &new->age);
printf("请输入成员手机号码:\n");
scanf("%s", new->phonenumber);
printf("添加成功!\n");
return OK;


}




//按照编号删除


Status deleteindex(Node* head)
{
int i, index;
printf("请输入删除第几个\n");
scanf("%d", &index);
if(index < 1||index > Length(head))
{
printf("选择范围错误,重新输入\n");
return ERROR;
}


    for(i = 0; i < index - 1; i++)
    {
        head = head->next;
    }
    Node* temp = head->next;
    head->next = head->next->next;
    free(temp);
    temp = NULL;
printf("删除成功!\n");
    return OK;
}




//按照姓名删除


Status deletename(Node* head)
{
char temp[20];
int count = 0;
printf("请输入想删除的姓名\n");
scanf("%s", &temp);
while(head->next != NULL)
{
if(strcmp(head->next->name, temp) == 0)
{
Node* temp = head->next;
head->next = head->next->next;
free(temp);
temp = NULL;
count++;
}
head = head->next;
}
if(count == 0)
{
printf("没有该成员信息\n");
return ERROR;
}
memset(temp, 0, 20);
printf("删除成功!\n");
return OK;
}




//按照手机号码删除


Status deletephonenumber(Node* head)
{
char temp[20];
int count = 0;
printf("请输入想删除的电话号码\n");
scanf("%s", &temp);
while(head->next != NULL)
{
if(strcmp(head->next->phonenumber, temp) == 0)
{
Node* temp = head->next;
head->next = head->next->next;
free(temp);
temp = NULL;
count++;
}
head = head->next;
}
if(count == 0)
{
printf("没有该成员信息\n");
return ERROR;
}
memset(temp, 0, 20);
printf("删除成功!\n");
return OK;
}


//根据编号修改对应信息


Status updateindex(Node* head)
{
int i, index, shuzi;
printf("请输入想修改信息的编号\n");
scanf("%d", &index);
if(index < 1||index > Length(head))
{
printf("选择范围错误,重新输入\n");
return ERROR;
}
for(i = 0; i < index; i++)
{
head = head->next;
}
printf("\n");
printf("1.只修改姓名\n");
printf("\n");
printf("2.只修改性别\n");
printf("\n");
printf("3.只修改年龄\n");
printf("\n");
    printf("4.只修改手机号码\n");
    printf("\n");
printf("5.修改全部信息\n");
printf("\n");
printf("请输入数字\n");
scanf("%d\n", &shuzi);
switch(shuzi)
{
case 1:
{
   scanf("%s", head->name);
printf("修改成功!\n");
break;
}
case 2:
{
   scanf("%s", head->sex);
printf("修改成功!\n");
break;
}
case 3:
{
   scanf("%d", &head->age);
printf("修改成功!\n");
break;
}
case 4:
{
   scanf("%s", head->phonenumber);
        printf("修改成功!\n");
break;
}
case 5:
{
        getchar();
printf("请输入新成员姓名:\n");
   scanf("%s", head->name);
   printf("请输入新成员性别:\n");
   scanf("%s", head->sex);
   printf("请输入新成员年龄:\n");
   scanf("%d", &head->age);
   printf("请输入新成员手机号码:\n");
   scanf("%s", head->phonenumber); 
   printf("修改成功!\n");
break;
}
default :printf("请重新输入\n");
}

    return OK;

}






//根据姓名修改对应信息


Status updatename(Node* head)
{
char temp[20];
int shuzi, count = 0;
printf("请输入想修改信息的姓名\n");
scanf("%s", &temp);
while(head->next != NULL)
{
head = head->next;
if(strcmp(head->name, temp) == 0)
{
            printf("\n");
       printf("1.只修改姓名\n");
       printf("\n");
printf("2.只修改性别\n");
printf("\n");
printf("3.只修改年龄\n");
printf("\n");
printf("4.只修改手机号码\n");
printf("\n");
printf("5.修改全部信息\n");
printf("\n");
printf("请输入数字\n");
scanf("%d\n", &shuzi);
switch(shuzi)
{
case 1:
{
scanf("%s", head->name);
printf("修改成功!\n");
break;
}
case 2:
{
scanf("%s", head->sex);
printf("修改成功!\n");
break;
}
case 3:
{
scanf("%d", &head->age);
printf("修改成功!\n");
break;
}
case 4:
{
scanf("%s", head->phonenumber);
printf("修改成功!\n");
break;
}
case 5:
{
getchar();
printf("请输入新成员姓名:\n");
scanf("%s", head->name);
printf("请输入新成员性别:\n");
scanf("%s", head->sex);
printf("请输入新成员年龄:\n");
scanf("%d", &head->age);
printf("请输入新成员手机号码:\n");
scanf("%s", head->phonenumber); 
printf("修改成功!\n");
break;
}
default :printf("请重新输入\n");
}
count++;
}
}
if(count == 0)
{
printf("没有该成员信息\n");
return ERROR;
}
memset(temp, 0, 20);
return OK;
}






//根据手机号码修改对应信息


Status updatephone(Node* head)
{
char number[20];
int shuzi, count = 0;
printf("请输入想修改信息的手机号码\n");
scanf("%s", &number);
while(head->next != NULL)
{
head = head->next;
if(strcmp(head->phonenumber, number) == 0)
{
printf("\n");
printf("1.只修改姓名\n");
printf("\n");
printf("2.只修改性别\n");
printf("\n");
printf("3.只修改年龄\n");
printf("\n");
printf("4.只修改手机号码\n");
printf("\n");
printf("5.修改全部信息\n");
printf("\n");
printf("请输入数字\n");
scanf("%d\n", &shuzi);
switch(shuzi)
{
case 1:
{
scanf("%s", head->name);
printf("修改成功!\n");
break;
}
case 2:
{
scanf("%s", head->sex);
printf("修改成功!\n");
break;
}
case 3:
{
scanf("%d", &head->age);
printf("修改成功!\n");
break;
}
case 4:
{
scanf("%s", head->phonenumber);
printf("修改成功!\n");
break;
}
case 5:
{
getchar();
printf("请输入新成员姓名:\n");
scanf("%s", head->name);
printf("请输入新成员性别:\n");
scanf("%s", head->sex);
printf("请输入新成员年龄:\n");
scanf("%d", &head->age);
printf("请输入新成员手机号码:\n");
scanf("%s", head->phonenumber); 
printf("修改成功!\n");
}
default :printf("请重新输入\n");

count++;
}
}

if(count == 0)
{
printf("没有该成员信息\n");
return ERROR;
}
memset(number, 0, 20);
return OK;


}






//按编号查询


void queryindex(Node* head)
{
int i, index;
printf("请输入想查找信息的编号:\n");
scanf("%d", &index);
if(index < 1||index > Length(head))
{
printf("选择范围错误,重新输入\n");
}
for(i = 0; i < index - 1; i++)
{
head = head->next;
}
printf("查询信息:\n");
printf("姓名:%s\t", head->next->name);
printf("性别:%s\t", head->next->sex);
printf("年龄:%d\t", head->next->age);
printf("手机号码:%s\n", head->next->phonenumber);
printf("--------------------------------------");


}




//按姓名查询


void queryname(Node* head)
{
char temp[20];
int count = 0;
printf("请输入想查找信息的姓名\n");
scanf("%s", &temp);
while(head->next != NULL)
{
if(strcmp(head->next->name, temp) == 0)
{
printf("查询信息:\n");
       printf("姓名:%s\t", head->next->name);
       printf("性别:%s\t", head->next->sex);
       printf("年龄:%d\t", head->next->age);
       printf("手机号码:%s\n", head->next->phonenumber);
       printf("--------------------------------------\n");
count++;
}

head = head->next;
}
if(count == 0)
{
printf("没有该成员信息\n");

}
memset(temp, 0, 20);

}




//按照手机号码查询


void queryphonenumber(Node* head)
{
char temp[20];
int count = 0;
printf("请输入想查找信息的手机号码\n");
scanf("%s", &temp);
while(head->next != NULL)
{
if(strcmp(head->next->phonenumber, temp) == 0)
{
printf("查询信息:\n");
       printf("姓名:%s\t", head->next->name);
       printf("性别:%s\t", head->next->sex);
       printf("年龄:%d\t", head->next->age);
       printf("手机号码:%s\n", head->next->phonenumber);
       printf("--------------------------------------\n");
count++;
}

head = head->next;
}
if(count == 0)
{
printf("没有该成员信息\n");

}
memset(temp, 0, 20);

}




//根据姓名排序
void sort(Node* head)
{
    int i,j;
char n[20];
char t[20];
char s[10];
    for( i = 0; i < Length(head) - 1; i++)
    {
        Node* temp = head;
        for(j = 0; j < Length(head) - 1 - i;j++)
        {
            if(strcmp(temp->next->name , temp->next->next->name) > 0 )
            {    
       strcpy(n, temp->next->name);
strcpy(temp->next->name, temp->next->next->name);
strcpy(temp->next->next->name, n);

strcpy(t, temp->next->phonenumber);
strcpy(temp->next->phonenumber, temp->next->next->phonenumber);
strcpy(temp->next->next->phonenumber, t);

strcpy(s, temp->next->sex);
strcpy(temp->next->sex, temp->next->next->sex);
strcpy(temp->next->next->sex, s);

                int t = temp->next->age;
                temp->next->age = temp->next->next->age;
                temp->next->next->age = t;

            }
             temp = temp->next;
        }
            
       
    }
}


void print(Node* head)
{
while(head->next != NULL)
{
printf("姓名:%s\t", head->next->name);
printf("性别:%s\t", head->next->sex);
printf("年龄:%d\t", head->next->age);
printf("手机号码:%s\n", head->next->phonenumber);
head = head->next;
}
}




int Length(Node* head)
{
int count = 0;
while(head->next != NULL)
{
count++;
head = head->next;
}
return count;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值