用单链实现通讯录

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

#define T 1;
#define F -1;

struct address
{
    int id;
    char name[20];
    char number[20];
    char address[20];
    struct address* next;
};
typedef struct address* node;

int init(node* head);           //头节点
int insert(node head, int i);   //添加用户
void delete_id(node head);      //按id删除
void delete_name(node head);    // 按名删除
void delete_number(node head);  //按号码删除
void update_id(node head);      //按id修改
void update_name(node head);    //按名修改
void update_number(node head);  //按号码修改
void query_id(node head);       //按id查找
void query_name(node head);     //按名查找
void query_number(node head);   //按号码查找
void print_name(node head);     //显示所有用户(按名)(冒泡排序(交换节点))
void print_number(node head);   //显示所有用户(按号码)(插入排序)
void interface();

int main()
{
    int n, i = 1, back = 1;
    int nd, idd;
    char named[20], numberd[20]; 

    node head = NULL;
    init(&head);

    while (back)
    {   
        interface();
        scanf("%d", &n);
        printf("\n");
        switch (n)
        {
            case 1: insert(head, i++);break;
            case 2: printf("\n\t\t\tdelete according to?\n\t\t\t1.id 2.name 3.number  :");
                    int de;
                    scanf("%d", &de);
                    switch (de)
                    {
                        case 1: delete_id(head);break;
                        case 2: delete_name(head);break;
                        case 3: delete_number(head);break;
                        default: printf("\t\t\twrong number\n");break;
                    }
                    break;
            case 3: printf("\n\t\t\tupdate according to?\n\t\t\t1.id 2.name 3.number  :");
                    int up;
                    scanf("%d", &up);
                    switch (up)
                    {
                        case 1: update_id(head);break;
                        case 2: update_name(head);break;
                        case 3: update_number(head);break;
                        default: printf("\t\t\twrong number\n");break;
                    }
                    break;
            case 4: printf("\n\t\t\tquery according to?\n\t\t\t1.id 2.name 3.number  :");
                    int qu;
                    scanf("%d", &qu);
                    switch (qu)
                    {
                        case 1: query_id(head);break;
                        case 2: query_name(head);break;
                        case 3: query_number(head);break;
                        default: printf("\t\t\twrong number\n");break;
                    }
                    break;
            case 5: printf("\n\t\t\tprintf according to?\n\t\t\t1.name 2.number  :");
                    int pr;
                    scanf("%d", &pr);
                    switch (pr)
                    {
                        case 1: print_name(head);break;
                        case 2: print_number(head);break;
                        default: printf("\t\t\twrong number\n");break;
                    }
                    break;
            case 6: back = 0;break;
            default: printf("\t\t\twrong number\n");break;
        }
    }

    return 0;
}

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

int insert(node head, int i)
{
    node newnode = (node)malloc(sizeof(struct address));
    if (NULL == newnode)
    {
        return F;
    }

    newnode->id = i;
    printf("\t\t\tPlesae input name: ");
    scanf("%s", newnode->name);
    printf("\t\t\tPlesae input number: ");
    scanf("%s", newnode->number);
    printf("\t\t\tPlesae input address: ");
    scanf("%s", newnode->address);

    newnode->next = head->next;
    head->next = newnode;
}

void delete_id(node head)
{
    int i;
    printf("\t\t\tWho do you want to deleta?\n\t\t\tid:");
    scanf("%d", &i);
    while (head->next->id != i)
    {
        head = head->next;
    }
    node temp = head->next->next;
    free(head->next);
    head->next = temp;
}

void delete_name(node head)
{
    char name1[20];
    printf("\t\t\tWho do you want to deleta?\n\t\t\tname:");
    scanf("%s", name1);
    while (strcmp(head->next->name,name1) != 0)
    {
        head = head->next;
    }
    node temp = head->next->next;
    free(head->next);
    head->next = temp;    
}

void delete_number(node head)
{
    char number1[20];
    printf("\t\t\tWho do you want to deleta?\n\t\t\tnumber:");
    scanf("%s", number1);
    while (strcmp(head->next->number,number1) != 0)
    {
        head = head->next;
    }
    node temp = head->next->next;
    free(head->next);
    head->next = temp;    
}

void update_id(node head)
{
    int i;
    printf("\t\t\tWho do you want to update?\n\t\t\tid:");
    scanf("%d", &i);
    while (head->next->id != i)
    {
        head = head->next;
    }
    printf("\t\t\tPlease input new name:");
    scanf("%s", head->next->name);
    printf("\t\t\tPlease input new number:");
    scanf("%s", head->next->number);
    printf("\t\t\tPlease input new address:");
    scanf("%s", head->next->address);
}

void update_name(node head)
{
    char name1[20];
    printf("\t\t\tWho do you want to update?\n\t\t\tname:");
    scanf("%s", name1);
    while (strcmp(head->next->name,name1) != 0)
    {
        head = head->next;
    }
    printf("\t\t\tPlease input new name:");
    scanf("%s", head->next->name);
    printf("\t\t\tPlease input new number:");
    scanf("%s", head->next->number);
    printf("\t\t\tPlease input new address:");
    scanf("%s", head->next->address);
}

void update_number(node head)
{
    char number1[20];
    printf("\t\t\tWho do you want to update?\n\t\t\tnumber:");
    scanf("%s", number1);
    while (strcmp(head->next->number,number1) != 0)
    {
        head = head->next;
    }
    printf("\t\t\tPlease input new name:");
    scanf("%s", head->next->name);
    printf("\t\t\tPlease input new number:");
    scanf("%s", head->next->number);
    printf("\t\t\tPlease input new address:");
    scanf("%s", head->next->address);
}

void query_id(node head)
{
    int i;
    printf("\t\t\tWho do you want to query?\n\t\t\tid:");
    scanf("%d", &i);
    while (head->next->id != i)
    {
        head = head->next;
    }
    printf("\t\t\tid:%d\tname:%s\tnumber:%s\taddress:%s\n", 
            head->next->id, head->next->name, head->next->number, head->next->address);
}

void query_name(node head)
{
    char name1[20];
    printf("\t\t\tWho do you want to query?\n\t\t\tname:");
    scanf("%s", name1);
    while (strcmp(head->next->name,name1) != 0)
    {
        head = head->next;
    }
    printf("\t\t\tid:%d\tname:%s\tnumber:%s\taddress:%s\n", 
            head->next->id, head->next->name, head->next->number, head->next->address);
}

void query_number(node head)
{
    char number1[20];
    printf("\t\t\tWho do you want to query?\n\t\t\tnumber:");
    scanf("%s", number1);
    while (strcmp(head->next->number,number1) != 0)
    {
        head = head->next;
    }
    printf("\t\t\tid:%d\tname:%s\tnumber:%s\taddress:%s\n", 
            head->next->id, head->next->name, head->next->number, head->next->address);
}

void print_name(node head)
{    
    int i, j, count = 0;
    node temp = head;
    while (temp->next != NULL)
    {
        count++;
        temp = temp->next;
    }
    for (i = 0; i < count - 1; i++)
    {
        node temp0 = head->next;
        node pre = head;
        for (j = count -1; j > i; j--)
        {
            if (strcmp(temp0->name,temp0->next->name) > 0)
            {
                pre->next = temp0->next;
                temp0->next = temp0->next->next;
                pre->next->next = temp0;
                temp0 = pre->next;
            }
            temp0 = temp0->next;
            pre = pre->next;
        }
    }
    while (head->next != NULL)
    {
        printf("\t\t\tid::%d\tname:%s\tnumber:%s\taddress:%s\n", 
                head->next->id, head->next->name, head->next->number, head->next->address);
        head = head->next;
    }
}
void print_number(node head)
{
    node p1 = head->next->next, pp1 = head->next;
    while (p1 != NULL)
    {
        node temp = p1;
        node p2 = head->next;
        node pp2 = head;
        while (p2 != p1)
        {
            if(strcmp(p2->number,p1->number) > 0)
            {
                p1 = p1->next;
                pp1->next = temp->next;
                pp2->next = temp;
                temp->next = p2;
                break;
            }

            p2 = p2->next;
            pp2 = pp2->next;
        }

        p1 = p1->next;
        pp1 = pp1->next;
    }
    while (head->next != NULL)
    {
        printf("\t\t\tid::%d\tname:%s\tnumber:%s\taddress:%s\n", 
                head->next->id, head->next->name, head->next->number, head->next->address);
        head = head->next;
    }
}
void interface()
{
    printf("\n\t\t\tPlease select number:\n");
    printf("\n\t\t\t****************************\n");
    printf("\t\t\t* 1.insert        2.delete *\n");
    printf("\t\t\t* 3.update        4.query  *\n");
    printf("\t\t\t* 5.print         6.quit   *\n");
    printf("\t\t\t****************************\n\n");
    printf("\t\t\tYour choice is:");
}

1.节点的排序
2. 数组可用scanf() 录入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值