用链表实现通讯录

 头文件

#ifndef _ADDRESS_H
#define _ADDRESS_H
#define FAILURE 10000
#define SUCCESS 10001
#define TRUE    10002
#define FALSE   10003
#define SIZE 2

struct data
{
    char name[20];
    char sex[20];
    char age[20];
    char ID[20];
};
typedef struct data DATA;

struct node
{
    DATA first;
    struct node *next;
};

typedef struct node NODE;
void menu();
int addressInsert(NODE *l, int p);
int addressTraverse(NODE *l, void (*p)(char *));
int addressLocate(NODE *l, char *str, int (*p)(char *, char *), void (*k)(char *));
int addressLength(NODE *l, char *str, int (*q)(char *, char *));
int addressDelete(NODE *l, char *str, int (*q)(char *, char *));
int addressSort(NODE *l, void (*f)(DATA *, DATA *));
int addressCorrect(NODE *l, char *str, int (*q)(char *, char *));


#endif

主函数 

 

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

void print(char *s)
{
    printf("%s ", s);
}

int Equal(char *str, char *ptr)
{
    return (strcmp(str, ptr) == 0) ? TRUE : FALSE;
}

void mystrcpy(DATA *e1, DATA *e2 )
{
    DATA e3;
    e3 = *e2;
    *e2 = *e1;
   *e1 = e3;
}
int main()
{
    int ret, a, i;
    char *str = (char *)malloc(sizeof(char)); 
    NODE *N;
    N = (NODE *)malloc(sizeof(NODE));
    N->next = NULL;

    while(1)
    {
        menu();
        scanf("%d", &a);

        switch(a)
        {
            case 1:
                for(i = 0; i < SIZE; i++)
                {
                    ret = addressInsert(N, i + 1);
                    if(ret == FAILURE)
                    {
                        printf("Insert failure!\n");
                    }
                    else
                    {
                        printf("Insert success!\n");
                    }
                    sleep(2);
                }
                break;
           case 2:
                ret = addressTraverse(N, print);
                    if(ret == FAILURE)
                    {
                        printf("Traverse failure!\n");
                    }
                    else
                    {
                        printf("Traverse success!\n");
                    }
                    sleep(2);
                    break;
           case 3:
                    //printf("请输入你想查找信息的姓名:\n");
                    ret = addressLocate(N, str, Equal, print);
                    if(ret == FAILURE)
                    {
                        printf("Locate FAILURE!\n");
                    }
                    else
                    {
                        printf("%s is %dth element!\n", str, ret);
                    }
                    sleep(2);
                    break;
           case 4:
                    ret = addressDelete(N, str, Equal);
                    if(ret == FAILURE)
                    {
                        printf("Delete FAILURE!\n");
                    }
                    else
                    {
                        printf("Delete SUCCESS!\n");
                    }
                    sleep(2);
                    break;
           case 5:
                    ret = addressSort(N, mystrcpy);
                    if(ret == FAILURE)
                    {
                        printf("Sort FAILURE\n");
                    }
                    else
                    {
                        printf("Sort SUCCESS!\n");
                    }
                    sleep(2);
                    break;
           case 6:
                    ret = addressCorrect(N, str, Equal );
                    if(ret == FAILURE)
                    {
                        printf("Correct FAILURE!\n");
                    }
                    else
                    {
                        printf("Correct SUCCESS!\n");
                    }
                    sleep(2);
                    break;

           case 7:
                    ret = addressLength(N, str, Equal);
                    if(ret == FAILURE)
                    {
                        printf("Length FAILURE!\n");
                    }
                    else
                    {
                        printf("用户数为 %d !\n", ret);
                    }
                    sleep(2);
                    break;
           case 8:
                    exit(0);

        }
    }
    return 0;
}


 功能函数

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

void menu()
{
    system("clear");
    printf("***************************\n");
    printf("********1,添加信息*********\n");
    printf("********2,查看信息*********\n");
    printf("********3,查找信息*********\n");
    printf("********4,删除信息*********\n");
    printf("********5,排序    *********\n");
    printf("********6,修改信息*********\n");
    printf("********7,查看用户数******\n");
    printf("********8,退出    *********\n");
    printf("***************************\n");
    printf("*******请选择你想要的功能**\n");
}

int addressInsert(NODE *l, int p)
{
    //char str[20] = {0};
    if(NULL == l)
    {
        return FAILURE;
    }
    
    NODE *q = l;
    int len = 1;
    while(len < p)
    {
        q = q->next;
        len++;
    }
    NODE *b = (NODE *)malloc(sizeof(NODE));
    if(NULL == b)
    {
        return FAILURE;
    }
    printf("请输入姓名:\n");
    scanf("%s", b->first.name);
   // printf("%s", str);
    //strcpy(b->first.name, str);

    printf("请输入性别:\n");
    scanf("%s", b->first.sex);
    printf("请输入年龄:\n");
    scanf("%s", b->first.age);
    printf("请输入号码:\n");
    scanf("%s", b->first.ID);
    b->next = q->next;
    q->next = b;

    return SUCCESS;
}

int addressTraverse(NODE *l, void (*p)(char *))
{
    if(NULL == l)
    {
        return FAILURE;
    }

    NODE *q = l;
    while(q->next)
    {
        q = q->next;
        printf("姓名 性别 年龄 号码\n");
        p(q->first.name);
        p(q->first.sex);
        p(q->first.age);
        p(q->first.ID);
        printf("\n");
        sleep(2);
    }
    return SUCCESS;
}

int addressLocate(NODE *l, char *str, int (*q)(char *, char *), void (*k)(char *))
{
    //char *str = (char *)malloc(sizeof(char));
    printf("请输入你想查找信息的姓名:\n");
    scanf("%s", str);

    NODE *p = l;
    int len = 0;
    while(p->next != NULL)
    {
        p = p->next;
        len++;
        //printf("%d\n", len);
        if(q(p->first.name, str) == TRUE)
        {
            printf("该联系人详细信息如下:\n");
            printf("姓名  性别 年龄  号码 \n");
            k(p->first.name);
            k(p->first.sex);
            k(p->first.age);
            k(p->first.ID);
            printf("\n");
            sleep(2);
            return len;
        }
    }
    return FAILURE;
}

int addressLength(NODE *l, char *str, int (*q)(char *, char *))
{
    if(NULL == l)
    {
        return FAILURE;
    }
    NODE *p = l;
    int len = 0;
    while(p->next)
    {
        p = p->next;
        len++;
    }
    return len;
}

int addressDelete(NODE *l, char *str, int (*q)(char *, char *))
{
    printf("请输入你想删除信息的姓名:\n");
    scanf("%s", str);

    NODE *p = l;
    int len = 0;
    while(p->next)
    {
        NODE *x = p;
        p = p->next;
        if(q(p->first.name, str) == TRUE)
        {
           // NODE *t = p;
            //t->first = p->first;
            x->next = p->next;
            //x->next = t;
            free(p);
            return SUCCESS;
        }
    }
    return FAILURE;
}

int addressSort(NODE *l, void (*f)(DATA *, DATA *))
{
    int i, j;
    char *str;
    if(NULL == l)
    {
        return FAILURE;
    }

    NODE *p = l->next;
    while(p->next)
    {
    NODE *q = p;
    p = q->next;
    for(i = 0; i < SIZE - 1; i++)
    {
        for(j = 0; j < SIZE - 1 - i; j++)
        {
            if(strcmp(q->first.name, p->first.name) > 0)
            {
                f(&(q->first), &(p->first));
            }

        }
    }
    return SUCCESS;
    }
}

int addressCorrect(NODE *l, char *str, int (*q)(char *, char *))
{
    int m, h;
    if(NULL == l)
    {
        return FAILURE;
    }
    printf("请输入你想修改信息的姓名:\n");
    scanf("%s", str);
    NODE *p = l;
    while(p->next)
    {
        p = p->next;
        if(q(p->first.name, str) == TRUE)
        {
        aa: printf("请输入你想修改信息的部分,修改姓名请按1, 修改年龄请按2,修改性别情按3,修改号码请按4,退出修改请按5\n");
            scanf("%d", &m);

            switch(m)
            {
                case 1:
                bb: printf("请输入新的名字:\n");
                    scanf("%s", p->first.name);
                    printf("%s", p->first.name);
                    printf("清确认修改是否正确,正确并继续修改请按1,错误重新修改请按2,退出修改请按3!\n");
                    scanf("%d", &h);
                    if(h == 1)
                    {
                        goto aa;
                    }
                    else if(2 == h)
                    {
                        goto bb;
                    }
                    else if(3 == h)
                    {
                        return SUCCESS;
                    }
                case 2:
                cc: printf("请输入新的年龄:\n");
                    scanf("%s", p->first.age);
                    printf("%s", p->first.age);
                    printf("清确认修改是否正确,正确并继续修改请按1,错误重新修改请按2,退出修改请按3!\n");
                    scanf("%d", &h);
                    if(h == 1)
                    {
                        goto aa;
                    }
                    else if(2 == h)
                    {
                        goto cc;
                    }
                    else if(3 == h)
                    {
                        return SUCCESS;
                    }
                case 3:
                dd: printf("请输入新的性别:\n");
                    scanf("%s", p->first.sex);
                    printf("%s", p->first.sex);
                    printf("清确认修改是否正确,正确并继续修改请按1,错误重新修改请按2,退出修改请按3!\n");
                    scanf("%d", &h);
                    if(h == 1)
                    {
                        goto aa;
                    }
                    else if(2 == h)
                    {
                        goto dd;
                    }
                    else if(3 == h)
                    {
                        return SUCCESS;
                    }
                case 4:
                ee: printf("请输入新的号码:\n");
                    scanf("%s", p->first.ID);
                    printf("%s", p->first.ID);
                    printf("清确认修改是否正确,正确并继续修改请按1,错误重新修改请按2,退出修改请按3!\n");
                    scanf("%d", &h);
                    if(h == 1)
                    {
                        goto aa;
                    }
                    else if(2 == h)
                    {
                        goto ee;
                    }
                    else if(3 == h)
                    {
                        return SUCCESS;
                    }
            }
        }
    }
    return FAILURE;
}

猜你喜欢

转载自blog.csdn.net/weixin_42720316/article/details/81450851