单向循环链表 通讯录

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

#define T 1
#define F -1

typedef int Boolean;
typedef char Elementname;
typedef char Elementadd;

struct Node
{
    Elementname name[20];
    char number[20];
    Elementadd address[20];
    struct Node* next;
};
int quit = 1;
typedef struct Node* node;
node list = NULL; 

Boolean insert_tail(node list);
Boolean delete_index(node list, int index);
Boolean delete_name(node list, Elementname* name);
Boolean delete_number(node list, Elementname* number);
Boolean update_index(node list, int index, Elementname *name, char *number, Elementadd *address);
void update_name(node list, Elementname *old_name, Elementname *new_name);
void update_number(node list, char *old_number, char *new_number);
Boolean query_index(node list, int index);
void query_name(node list, Elementname* name);
void query_number(node list, char* number);
int input_user(Elementname* name, char* number, Elementadd* address);
void rank_name(node list);
void rank_number(node list);
int init(node* list);
int length(node list);
void print(node list);
void show_function();
int Meau();

int main()
{  
   show_function();
   while(quit)
   {
       Meau();
   }
    return 0;
}

void show_function()
{
printf ("\n\n\n\n\n\n\n");
 55     printf ("\t\t\t     【通讯录】\n");
 56     printf ("================================================================================\n");
 57     printf ("\t\t\t\t**************\n");
 58     printf ("\t\t\t\t*0.初始化用户*\n");
 59     printf ("\t\t\t\t*1.添加用户*\n");
 60     printf ("\t\t\t\t*2.显示用户*\n");
 61     printf ("\t\t\t\t*3.按通讯录序号删除 *\n");
 62     printf ("\t\t\t\t*4.按通讯录姓名删除*\n");
 63     printf ("\t\t\t\t*5.按通讯录号码删除*\n");
 64     printf ("\t\t\t\t*6.按通讯录序号查询*\n");
 65     printf ("\t\t\t\t*7.按通讯录姓名查询*\n");
 66     printf ("\t\t\t\t*8.按通讯录号码查询*\n");
 67     printf ("\t\t\t\t*9.按通讯录序号修改*\n");
 68     printf ("\t\t\t\t*A.修改姓名*\n");
 69     printf ("\t\t\t\t*B.修改号码*\n");
 70     printf ("\t\t\t\t*C.按姓名-由小到大排序*\n");
 71     printf ("\t\t\t\t*D.按号码-由大到小排序*\n");
 72     printf ("\t\t\t\t*Q. quit*\n");
 73     printf ("\t\t\t\t**************\n");
 74     printf ("================================================================================\n");
 75 
 76 }
 77 
int Meau()
{
    char name[20], number[20], address[20], old_name[20], new_name[20], old_number[20], new_number[20];
    int index, i, L;
    char a;
    printf("function :");
    scanf ("%s", &a);
    switch (a)
    {	
        case '0':
        {
            init(&list);
            break;
        }
        case '1':	
	{ 
            printf("Please input, how many people you want save :");
            scanf("%d", &L);
            for (i = 0; i < L; i++)
                {
                    insert_tail(list);
                }
            break;
        }
        case '2':	
        { 
            print(list);
            break;
        }
        case '3':
        {
            printf("Please input index you want to delete :");
            scanf("%d", &index);
            delete_index(list, index);
            break;
        }
        case '4':
        {
            printf("Please input name you want to delete :");
            scanf("%s", name);
            delete_name(list, name);
            break;	
        }
        case '5':
        {
            printf("Please input number you want to delete :");
            scanf("%s", number);
            delete_number(list, number);
            break;	
        }
        case '6':
        {
            printf("Please input index you want to query :");
            scanf("%d", &index);
            query_index(list, index);
            break;	
        }
        case '7':
        {
            printf("Please input name you want to query :");
            scanf("%s", name);
            query_name(list, name);
            break;	
        }
        case '8':
        {
            printf("Please input number you want to query :");
            scanf("%s", number);
            query_number(list, number);
            break;	
        }
        case '9':
        {
            printf("Please input index, name, number and addess you want to update :");
            scanf("%d%s%s%s", &index, name, number, address);
            update_index(list, index, name, number, address);
            break;	
        }
        case 'A':
        {
            printf("Please input old_name you want to update new_name :");
            scanf("%s%s", old_name, new_name);
            update_name(list, old_name, new_name);
            break;	
        }
        case 'B':
        {
            printf("Please input old_number you want to update new_number :");
            scanf("%s%s", old_number, new_number);
            update_number(list, old_number, new_number);
            break;	
        }
        case 'C':
        {
            rank_name(list);
            break;	
        }
        case 'D':
        {
            rank_number(list);
            break;	
        }
        case 'Q':
        {
            quit = 0;
            return quit;
        }	
        default:
        {
            printf("Please input again\n");
        }
    }

}

void query_number(node list, char* number)
{
    node temp = list;
    while (temp->next != list)
    {
        if (0 == strcmp(temp->next->number, number))
        {
            printf("find succrss!!\n");
            printf("find_name: %s find_number: %s find_address: %s \n", temp->next->name, temp->next->number, temp->next->address); 
        }
        temp = temp->next;
    }

}

void query_name(node list, Elementname* name)
{
    node temp = list;
    while (temp->next != list)
    {
        if (0 == strcmp(temp->next->name, name))
        {
            printf("find succrss!!\n");
            printf("find_name: %s find_number: %s find_address: %s \n", temp->next->name, temp->next->number, temp->next->address); 
        }
        temp = temp->next;
    }
     
}

Boolean query_index(node list, int index)
{
    if (index < 0 || index > length(list))
    {
        printf("out of range\n");
        return F;
    }
    int i;
    for (i = 0; i < index; i++)
    {
        list = list->next;
    }
    printf("find succrss!!\n");
    printf("find_name: %s find_number: %s find_address: %s \n", list->next->name, list->next->number, list->next->address); 

}

void update_number(node list, char *old_number, char *new_number)
{
    node temp = list;
    while (temp->next != list)
    {
        if (0 == strcmp(temp->next->number, old_number))
        {
            strcpy(temp->next->number, new_number);
        }
        temp = temp->next;
    }
}

void update_name(node list, Elementname *old_name, Elementname *new_name)
{
    node temp = list;
    while (temp->next != list)
    {
        if (0 == strcmp(temp->next->name, old_name))
        {
            strcpy(temp->next->name, new_name);
        }
        temp = temp->next;
    }
}

Boolean update_index(node list, int index, Elementname *name, char *number, Elementadd *address)
{
    if (index < 0 || index > length(list))
    {
        printf("out of range\n");
        return F;
    }
    int i;
    for (i = 0; i < index; i++)
    {
        list = list->next;
    }
    strcpy(list->next->name, name);
    strcpy(list->next->number, number);
    strcpy(list->next->address, address);
    return T;
}

Boolean delete_number(node list, Elementname* number)
{
    node temp = list;
    while (temp->next != list)
    {
        if (0 == strcmp(temp->next->number, number))
        {
            node temp2 = temp->next;
            temp->next = temp->next->next;
            free(temp2);
        }
        else
        {
            temp = temp->next;
        }
    }
    
}

Boolean delete_name(node list, Elementname *name)
{
    node temp = list;
    while (temp->next != list)
    {
        if (0 == strcmp(temp->next->name, name))
        {
            node temp2 = temp->next;
            temp->next = temp->next->next;
            free(temp2);
        }
        else
        {
            temp = temp->next;
        }
    }
}

Boolean delete_index(node list, int index)
{
    if (index < 0 || index > length(list))
    {
        printf("out of range\n");
        return F;
    }

    int i = 0;
    for (i = 0; i < index; i++)
    {
        list = list->next;
    }   
  
    node temp = list->next;
    list->next = list->next->next;
    free(temp);
    return T;

}

Boolean insert_tail(node list)
{   
    Elementname name[20]; 
    Elementadd address[20];
    char number[20];
    input_user(name, number, address);
    
    node temp = list;
    node newnode = (node)malloc(sizeof(struct Node));
    if(NULL == newnode)
    {
        return F;
    }

    newnode->next = list; 
    strcpy(newnode->name, name);        
    strcpy(newnode->number, number);        
    strcpy(newnode->address, address);  

    while (temp->next != list)
    {
        temp = temp->next;
    }   

    temp->next =newnode;

    return T;
}

void print(node list)
{
    node temp = list;
    int count = 0;
    while (temp->next != list)
    {
        count++;
        printf("order:%d\n", count);
        printf("name: %s number: %s address: %s\n", temp->next->name, temp->next->number, temp->next->address);
        temp = temp->next;
    }
    printf("\n");
}

int input_user(Elementname* name, char* number, Elementadd* address)
{    

    printf("Input someone's name, number, address\n(if you don't know his name, number, address, Please input : XXX)\n");
    scanf("%s%s%s",name,number,address);
   
    return 0; 
}

int init(node* list)
{
    node newnode = (node)malloc(sizeof(struct Node));
    if (NULL == newnode)
    {
        return F;
    }
    
    newnode->next = newnode;
    
    *list = newnode;

    return T;
}

int length(node list)
{
    node temp = list;
    int count = 0;
    while (temp->next != list)
    {
        count++;
        temp = temp->next;
    }
    return count;
}
void rank_name(node list)
{
    int i, j;
    node temp = NULL;
    node t;

    for (i = 0; i < length(list) - 1; i++)
    {
        for (j = 0, temp = list; j < length(list) - 1 -i; j++, temp = temp->next )
        {
            if (strcmp(temp->next->name, temp->next->next->name) > 0)
            {
                t = temp->next->next;
                temp->next->next = t->next;
                t->next = temp->next;
                temp->next = t;
     
            }
        }
    }
    
}

void rank_number(node list)
{
    int i, j;
    node temp = NULL;
    node t;

    for (i = 0; i < length(list) - 1; i++)
    {
        for (j = 0, temp = list; j < length(list) - 1 -i; j++, temp = temp->next )
        {
            if (strcmp(temp->next->number, temp->next->next->number) < 0)
            {
                t = temp->next->next;
                temp->next->next = t->next;
                t->next = temp->next;
                temp->next = t;
            }
        }
    }

}

[root@localhost address_list]# ./2














                             【通讯录】
================================================================================
                                **************
                                *0.初始化用户*
                                *1.添加用户*
                                *2.显示用户*
                                *3.按通讯录序号删除 *
                                *4.按通讯录姓名删除*
                                *5.按通讯录号码删除*
                                *6.按通讯录序号查询*
                                *7.按通讯录姓名查询*
                                *8.按通讯录号码查询*
                                *9.按通讯录序号修改*
                                *A.修改姓名*
                                *B.修改号码*
                                *C.按姓名-由小到大排序*
                                *D.按号码-由大到小排序*
                                *Q. quit*
                                **************
================================================================================
Please select function :0
Please select function :1
Please input, how many people you want save :3              
Input someone's name, number, address
(if you don't know his name, number, address, Please input : XXX)
xjz 1437855676 huian
Input someone's name, number, address
(if you don't know his name, number, address, Please input : XXX)
hy 1568799876 nanjing
Input someone's name, number, address
(if you don't know his name, number, address, Please input : XXX)
lmx 154789557 beijing
Please select function :2
order:1
name: xjz number: 1437855676 address: huian
order:2
name: hy number: 1568799876 address: nanjing
order:3
name: lmx number: 154789557 address: beijing


Please select function :C
Please select function :2
order:1
name: hy number: 1568799876 address: nanjing
order:2
name: lmx number: 154789557 address: beijing
order:3
name: xjz number: 1437855676 address: huian


Please select function :A
Please input old_name you want to update new_name :xjz zz
Please select function :2
order:1
name: hy number: 1568799876 address: nanjing
order:2
name: lmx number: 154789557 address: beijing
order:3
name: zz number: 1437855676 address: huian


Please select function :3
Please input index you want to delete :0
Please select function :2
order:1
name: lmx number: 154789557 address: beijing
order:2
name: zz number: 1437855676 address: huian
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值