C————静态通讯录、动态通讯录(小顺序表)

通讯录(静态);

一个能够实现增加、查找、修改、删除、按姓名排序、
打印所有联系人 清空所有联系人这些功能的通讯录

联系人:

姓名、年龄、性别、地址、电话

1.头文件:

#pragma once
#include<string.h>
#include<stdlib.h>
#define MAX_CONACT 1000
#define MAX_NAME 20
#define MAX_SEX  5
#define MAX_PHONE 12
#define MAX_ADDR 50
typedef struct person
{
    char name[MAX_NAME];
    char sex[MAX_SEX];
    int age;
    char phone[MAX_PHONE];
    char addr[MAX_ADDR];
}person;
typedef struct Contact
{
    person data[MAX_CONACT];
    int sz;
}Conact,*pConact;

void init_conact(pConact pc);
void add(pConact pc);
void display(pConact pc);
int search(pConact pc);
void change(pConact pc);
void sort(pConact pc);
void del(pConact pc);
int find(pConact pc);
void clear(pConact pc);

2.测试部分:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include"conact.h"
void menu()
{
    printf("***********************************\n");
    printf("*******1.添加******2.删除**********\n");
    printf("*******3.查找******4.修改**********\n");
    printf("*******5.显示所有**6.清除所有******\n");
    printf("*******7.排序******0.退出**********\n");
    printf("***********************************\n");

}

enum option
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    CHANGE,
    DISPLAY,
    CLEAR,
    SORT
};

int main()
{   
    int input = 0;
    Conact my_cont;
    init_conact(&my_cont);
    do
    {
        menu();
        printf("请选择:>\n");
        scanf("%d",&input);
        switch(input)
        {
            case EXIT:
                printf("退出程序!");
                exit(0);
            case DEL:
                del(&my_cont);
                break;
            case DISPLAY:
                display(&my_cont);
                break;
            case SEARCH:
                search(&my_cont);
                break;
            case CHANGE:
                change(&my_cont);
                break;
            case SORT:
                sort(&my_cont);
                break;
            case ADD:
                add(&my_cont);
                break;
            case CLEAR:
                clear(&my_cont);
                break;
            default:
                printf("输入错误!\n");
                break;
        }
    }while(input);
    return 0;
}

3.通讯录实现部分:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"conact.h"
int find(pConact pc,char name[])
{
    int i = 0;
    for(i=0;i<pc->sz;i++)
    {
        if(strcmp(name,pc->data[i].name)==0)
        {
            printf("%2s%10s%5d%12s%20s\n",
            pc->data[i].name,
            pc->data[i].sex,
            pc->data[i].age,
            pc->data[i].phone,
            pc->data[i].addr);
            return i;
        }
    }
    return -1;
}
void init_conact(pConact pc)
{
    memset(pc->data,0,sizeof(pc->data));
    pc->sz=0;
}
void add(pConact pc)
{
    if((pc->sz)>MAX_CONACT)
    {
        printf("这个电话博已经满了!\n");
        /*return;*/
    }

        printf("请输入你要添加联系人的姓名:>\n");
        scanf("%s",pc->data[pc->sz].name);
        printf("性别:>\n");
        scanf("%s",pc->data[pc->sz].sex);
        printf("年龄:>\n");
        scanf("%d",&pc->data[pc->sz].age);
        printf("电话:>\n");
        scanf("%s",pc->data[pc->sz].phone);
        printf("地址:>\n");
        scanf("%s",pc->data[pc->sz].addr);
        pc->sz++;
        printf("添加成功!\n");

}

void display(pConact pc)
{
    int i = 0;
    printf("%2s%15s%10s%12s%10s\n","姓名","性别","年龄","电话号","地址");
    for(i=0;i<pc->sz;i++)
    {
        printf("%2s%10s%5d%12s%20s\n",pc->data[i].name,
            pc->data[i].sex,
            pc->data[i].age,
            pc->data[i].phone,
            pc->data[i].addr);
    }
}
int search(pConact pc)
{
       char name[MAX_NAME];
       int i = 0;
       printf("请输入联系人姓名:>\n");
       scanf("%s",name);
      // find(pc,name);
       i=find(pc,name);
       if(i==-1)
           printf("没有此联系人!\n");
       return i;
}
void change(pConact pc)
{
    int i =search(pc);
    if((0<=i)&&(i<(pc->sz)))
    {
        printf("请重新输入联系人的姓名:>\n");
        scanf("%s",pc->data[i].name);
        printf("性别:>\n");
        scanf("%s",pc->data[i].sex);
        printf("年龄:>\n");
        scanf("%d",&pc->data[i].age);
        printf("电话:>\n");
        scanf("%s",pc->data[i].phone);
        printf("地址:>\n");
        scanf("%s",pc->data[i].addr);
        printf("修改成功并保存!\n");
    }
    else
        printf("没有此联系人!\n");
}
void sort(pConact pc)
{
    int i = 0;
    person temp;
    for(i=0;i<pc->sz-1;i++)
    {
        if(strcmp(pc->data[i].name,pc->data[i+1].name)>0)
        {
            strcpy(temp.name,pc->data[i].name);
            strcpy(temp.sex,pc->data[i].sex);
            temp.age=pc->data[i].age;
            strcpy(temp.phone,pc->data[i].phone);
            strcpy(temp.addr,pc->data[i].addr);



            strcpy(pc->data[i].name,pc->data[i+1].name);
            strcpy(pc->data[i].sex,pc->data[i+1].sex);
            pc->data[i].age=pc->data[i+1].age;
            strcpy(pc->data[i].phone,pc->data[i+1].phone);
            strcpy(pc->data[i].addr,pc->data[i+1].addr);

            strcpy(pc->data[i+1].name,temp.name);
            strcpy(pc->data[i+1].sex,temp.sex);
            pc->data[i+1].age=temp.age;
            strcpy(pc->data[i+1].phone,temp.phone);
            strcpy(pc->data[i+1].addr,temp.addr);

        }
    }
    printf("排序成功!\n");
}
void del(pConact pc)
{
       char name[MAX_NAME];
       int i = 0;
       printf("请输入要删除的联系人:>\n");
       scanf("%s",name);
       i=find(pc,name);
        for(i;i<pc->sz-1;i++)
        {
            strcpy(pc->data[i].name,pc->data[i+1].name);
            strcpy(pc->data[i].sex,pc->data[i+1].sex);
            pc->data[i].age=pc->data[i+1].age;
            strcpy(pc->data[i].phone,pc->data[i+1].phone);
            strcpy(pc->data[i].addr,pc->data[i+1].addr);
        }
        pc->sz--;
        printf("删除成功!\n");
}
void clear(pConact pc)
{
    pc->sz=0;
}
写完这个真的不容易,写一些单个程序还将就,而写这种程序刚开始对于一个菜鸟来说是很难的,但黄天不负有心人,在这一段时间对C语言的学习之后,我终于完成了这个程序,最大收获是:

凡事贵在坚持,相信自己也能写出好的代码,只不过是时间的事而已!!!!

动态通讯录

上次写的是一个静态的,这下就可以更新了,虽然代码很拙劣,但至少有第一次独立完成,那么接下来再写这种代码就会有第二次、第三次、、,而且我想肯定会一次比一次写得好,而且越来越容易。
下面来看一下代码
1.test.c测试部分:
#include<stdio.h>
#include"conact.h"
void menu()
{
    printf("**********************************\n");
    printf("**********1.添加******2.修改******\n");
    printf("**********3.查找******4.删除******\n");
    printf("**********5.打印******6.排序******\n");
    printf("**********7.清空所有**8.退出******\n");
    printf("**********************************\n");
}
enum option//用枚举来列出菜单选项
{
    ZEO,//因为选项是1~8,没有0所以把枚举里第一个元素用非选项的"东西"占掉!!
    ADD,
    CHANGE,
    SEARCH,
    DEL,
    DISPLAY,
    SORT,
    CLEAR,
    EXIT
};

int main()
{
    int input=0;
    conact my_cont;
    init_conact(&my_cont);
    do
    {
        menu();
        printf("请选择:>\n");
        scanf("%d",&input);
        switch(input)
        {
        case ADD:
            add(&my_cont);
            break;
        case CHANGE:
            change(&my_cont);
            break;
        case DEL:
            del(&my_cont);
            break;
        case SEARCH:
            search(&my_cont);
            break;
        case SORT:
            sort(&my_cont);
            break;
        case DISPLAY:
            display(&my_cont);
            break;
        case CLEAR:
            clear(&my_cont);
            break;
        case EXIT:
            exit(1);
            break;
        default:
            printf("请重新选择:>\n");
            break;
        }

    }while(input);
    my_free(&my_cont);//在conact.c开辟的空间在程序结束的时候释放。
    return 0;
}

3.conact.h头文件:

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define NAME_MAX 10
#define SEX_MAX 4
#define PHONE_MAX 12
#define ADDR_MAX 20
#define PEOPLE_MAX 1
typedef struct people
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char phone[PHONE_MAX];
    char addr[ADDR_MAX];
}people;
typedef struct conact
{
    people *head;
    int c_number;
    int count;
}conact,*pcont;
void init_conact(pcont pc);
void my_free(pcont pc);
void add(pcont pc);
void change(pcont pc);
int search(pcont pc);
void del(pcont pc);
void display(pcont pc);
void sort(pcont pc);
void clear(pcont pc);

3.conact.c实现通讯录:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"conact.h"
int find(pcont pc,char name[])
{
    int i = 0;
    for(i=0;i<pc->count;i++)
    {
        if(strcmp(pc->head[i].name,name)==0)
            return i;
    }
    return -1;
}
void init_conact(pcont pc)
{
    people* p=NULL;
    pc->c_number=PEOPLE_MAX;
    pc->count=0;
    p=(people*)malloc((pc->c_number)*sizeof(people));//初始化先开辟c_number个people*.pleople*是个结构体指针类型。
    if(p==NULL)//p==NULL是内存开辟失败的判断条件
    {
        printf("没有内存!\n");
    }
    else//如果不满足上述条件,则说明开辟空间成功
    {
        pc->head=p;
        pc->count=0;
    }


}
void my_free(pcont pc)
{
    free(pc->head);//是放开辟的空间,并赋以空指针。
    pc->head=NULL;
}
void add(pcont pc)
{
    int i = pc->count;
    people *p=NULL;
    if(pc->count==pc->c_number)
    {
        p=(people*)realloc(pc->head,(pc->count+1)*sizeof(people));
        //pc->c_number=pc->count+1;
        if(p==NULL)
        {
            printf("没有空间了!\n");
            return;
        }
        pc->head=p;
    }
    printf("请输入姓名、性别、年龄、电话、地址:>\n");
    printf("请输入姓名:>\n");
    scanf("%s",pc->head[i].name);
    printf("性别:>\n");
    scanf("%s",pc->head[i].sex);
    printf("年龄:>\n");
    scanf("%d",&(pc->head[i].age));
    printf("电话:>\n");
    scanf("%s",pc->head[i].phone);
    printf("地址:>\n");
    scanf("%s",pc->head[i].addr);
    pc->count++;
    printf("添加成功!\n");
}
void change(pcont pc)
{   
    int i = 0;
    //search(pc);
    i=search(pc);
    if(i>=0&&i<(pc->count))
    {
        printf("请重新输入姓名:>\n");
        scanf("%s",pc->head[i].name);
        printf("性别:>\n");
        scanf("%s",pc->head[i].sex);
        printf("年龄:>\n");
        scanf("%d",&(pc->head[i].age));
        printf("电话:>\n");
        scanf("%s",pc->head[i].phone);
        printf("地址:>\n");
        scanf("%s",pc->head[i].addr);
        printf("修改成功!\n");
    }
    else
        printf("没有此联系人!\n");
}
int search(pcont pc)
{
    char name[NAME_MAX];
    int i = 0;
    printf("请输入姓名:>\n");
    scanf("%s",name);
    find(pc,name);
    i=find(pc,name);
    if(i>=0&&i<(pc->count))
    {
        printf("%5s%10s%10s%14s%20s\n","姓名","性别","年龄","电话","地址");
        printf("%10s %5s %4d %13s %30s\n",
            pc->head[i].name,
            pc->head[i].sex,
            pc->head[i].age,
            pc->head[i].phone,
            pc->head[i].addr);
        return i;
    }
    else
        return i;
}

void del(pcont pc)
{
    int i = 0;
    //search(pc);
    i=search(pc);
    if(pc->count==0)
        printf("这个电话博为空!\n");

    if(i==-1)
        printf("此联系人不存在!\n");
    else
        {
        for(i;i<pc->count-1;i++)
        {
            strcpy(pc->head[i].name,pc->head[i+1].name);
            strcpy(pc->head[i].sex,pc->head[i+1].sex);
            pc->head[i].age=pc->head[i+1].age;
            strcpy(pc->head[i].phone,pc->head[i+1].phone);
            strcpy(pc->head[i].addr,pc->head[i+1].addr);
        }
        pc->count--;
        printf("删除成功!\n");
    }


}

void display(pcont pc)
{
    int i = 0;
    printf("%5s%10s%10s%14s%20s\n","姓名","性别","年龄","电话","地址");
    for(i=0;i<pc->count;i++)
    {
        printf("%10s%5s%4d%14s%20s\n",
            pc->head[i].name,
            pc->head[i].sex,
            pc->head[i].age,
            pc->head[i].phone,
            pc->head[i].addr
            );
    }
}
void sort(pcont pc)
{
    int i = 0;
    people temp;
    for(i=0;i<pc->count-1;i++)
    {
        if(strcmp(pc->head[i].name,pc->head[i+1].name)>0)
        {
            strcpy(temp.name,pc->head[i].name);
            strcpy(temp.sex,pc->head[i].sex);
            temp.age=pc->head[i].age;
            strcpy(temp.phone,pc->head[i].phone);
            strcpy(temp.addr,pc->head[i].addr);



            strcpy(pc->head[i].name,pc->head[i+1].name);
            strcpy(pc->head[i].sex,pc->head[i+1].sex);
            pc->head[i].age=pc->head[i+1].age;
            strcpy(pc->head[i].phone,pc->head[i+1].phone);
            strcpy(pc->head[i].addr,pc->head[i+1].addr);

            strcpy(pc->head[i+1].name,temp.name);
            strcpy(pc->head[i+1].sex,temp.sex);
            pc->head[i+1].age=temp.age;
            strcpy(pc->head[i+1].phone,temp.phone);
            strcpy(pc->head[i+1].addr,temp.addr);

        }
    }
    printf("排序成功!\n");
}
void clear(pcont pc)
{
    pc->count=0;
    printf("清除成功!\n");
}

运行结果截图:

这里写图片描述
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值