顺序表结构实现简单通讯录(有增删改查和将数据写入txt文档中的功能)C语言

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

#define maxlen 100
typedef struct
{
    char number[20];
    char name[20];
    char sex[3];
    char phone[15];
    char addr[30];
} linkman;
typedef struct
{
    linkman *elem;
    int length;
} SeqList;
SeqList *L;
void SeqList_Save_2_Txt(SeqList *L)
{
    FILE *f1;
    if ((f1 = fopen("Linkman.txt", "a+")) == NULL) // a+是向文件中追加内容的操作
    {
        printf("文件打开失败");
    }
    for (int j = 0; j < L->length; j++)
    {
        fprintf(f1, "%s %s %s %s %s\n", L->elem[j].number, L->elem[j].name, L->elem[j].sex, L->elem[j].phone,
                L->elem[j].addr);
        if (fclose(f1))
            printf("文件关闭失败");
    }
}
void display_Node(SeqList L, int i, int k)
{
    printf("搜索结果查询到第%d个联系人信息为:\n", k);
    printf("编号:%s 姓名: %s 性别:%s 电话:%s 地址:%s \n", L.elem[i].number, L.elem[i].name, L.elem[i].sex,
           L.elem[i].phone, L.elem[i].addr);
}
void alter(SeqList *L, char num[])
{
    int i;
    for (i = 0; i < L->length; i++)
    {
        if (strcmp(L->elem[i].number, num) == 0)
            break;
    }
    if (i == L->length)
        printf("输入序号错误,请重新输入");
    printf("请输入修改后的联系人的信息。\n");
    printf("编号:\n");
    scanf("%s", &L->elem[i].number);
    printf("姓名:\n");
    scanf("%s", &L->elem[i].name);
    printf("性别:\n");
    scanf("%s", &L->elem[i].sex);
    printf("电话:\n");
    scanf("%s", &L->elem[i].phone);
    printf("地址:\n");
    scanf("%s", &L->elem[i].addr);
}
SeqList *createSeqList()
{
    int i, n;
    L = (SeqList *)malloc(maxlen * (sizeof(L)));
    if (!L->length)
        exit(0);
    L->length = 0;
    printf("请输入人数:\n");
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        printf("请输入第%d号联系人的信息。\n", i + 1);
        printf("编号:\n");
        scanf("%s", &L->elem[L->length].number);
        printf("姓名:\n");
        scanf("%s", &L->elem[L->length].name);
        printf("性别:\n");
        scanf("%s", &L->elem[L->length].sex);
        printf("电话:\n");
        scanf("%s", &L->elem[L->length].phone);
        printf("地址:\n");
        scanf("%s", &L->elem[L->length].addr);
        L->length++;
    }
    printf("初始化成功!\n");
    return L;
}
linkman seqListGet(SeqList L, int index) //调出结构体中的一个数据单元
{
    linkman res;
    if (index <= L.length && index >= 0)
        res = L.elem[index];
    return res;
}
void displayList(SeqList L)
{
    int i;
    for (i = 0; i < L.length; i++) //利用seqListGet()函数将所有通讯录人员的信息调出
    {
        linkman res = seqListGet(L, i);
        printf("编号:%s 姓名: %s 性别:%s 电话:%s 地址:%s \n", res.number, res.name, res.sex, res.phone, res.addr);
    }
    return;
}
//各种不同查找方式都采用字符串比对的方式如果完全相同就是查找成功
void name_search(SeqList L)
{
    char temp_name[maxlen];
    int i, k = 0;
    printf("请输入姓名:\n");
    scanf("%s", &temp_name);
    for (i = 0; i < L.length; i++)
    {
        if (strcmp(L.elem[i].name, temp_name) == 0)
        {
            k++; //如果查不到那么就不会运行此代码,k的结果自然就是0
            display_Node(L, i, k);
        }
    }
    if (k == 0)
    {
        printf("查找失败,表中无此项数据。\n");
    }
    return;
}
void phone_search(SeqList L)
{
    char temp_name[maxlen];
    int i, k = 0;
    printf("请输入电话号码:\n");
    scanf("%s", &temp_name);
    for (i = 0; i < L.length; i++)
    {
        if (strcmp(L.elem[i].phone, temp_name) == 0)
        {
            k++;
            display_Node(L, i, k);
        }
    }
    if (k == 0)
    {
        printf("查找失败,表中无此项数据。\n");
    }
    return;
}
void addr_search(SeqList L)
{
    char temp_name[maxlen];
    int i, k = 0;
    printf("请输入地址:\n");
    scanf("%s", &temp_name);
    for (i = 0; i < L.length; i++)
    {
        if (strcmp(L.elem[i].addr, temp_name) == 0)
        {
            k++;
            display_Node(L, i, k);
        }
    }
    if (k == 0)
    {
        printf("查找失败,表中无此项数据。\n");
    }
    return;
}
void number_search(SeqList L)
{
    char temp_name[maxlen];
    int i, k = 0;
    printf("请输入编号:\n");
    scanf("%s", &temp_name);
    for (i = 0; i < L.length; i++)
    {
        if (strcmp(L.elem[i].number, temp_name) == 0)
        {
            k++;
            display_Node(L, i, k);
        }
    }
    if (k == 0)
    {
        printf("查找失败,表中无此项数据。\n");
    }
    return;
}

SeqList add_linkmans(SeqList *L, int i)
{
    int j;
    if (i < 1 || i > L->length + 1)
    {
        printf("位置不存在!重新输入!\n");
        return *L;
    }
    for (j = L->length; j >= i; j--)
    { //倒序后移,以防覆盖旧值
        strcpy(L->elem[j].number, L->elem[j - 1].number);
        strcpy(L->elem[j].name, L->elem[j - 1].name);
        strcpy(L->elem[j].addr, L->elem[j - 1].addr);
        strcpy(L->elem[j].phone, L->elem[j - 1].phone);
        strcpy(L->elem[j].sex, L->elem[j - 1].sex);
    }
    printf("请输入第%d号联系人的信息。\n", i);
    printf("编号:\n");
    scanf("%s", &L->elem[i - 1].number);
    printf("姓名:\n");
    scanf("%s", &L->elem[i - 1].name);
    printf("性别:\n");
    scanf("%s", &L->elem[i - 1].sex);
    printf("电话:\n");
    scanf("%s", &L->elem[i - 1].phone);
    printf("地址:\n");
    scanf("%s", &L->elem[i - 1].addr);
    L->length++;
    printf("插入成功!\n");
    return *L;
}
SeqList del_linkman(SeqList *L, int n)
{
    int j;
    if (!L->length)
    {
        printf("表空!\n");
        return *L;
    }
    if (n < 1 || n > L->length)
        printf("位置不存在!重新输入!\n");
    for (j = n; j < L->length; j++)
    { //正序前移
        strcpy(L->elem[j - 1].name, L->elem[j].name);
        strcpy(L->elem[j - 1].number, L->elem[j].number);
        strcpy(L->elem[j - 1].addr, L->elem[j].addr);
        strcpy(L->elem[j - 1].phone, L->elem[j].phone);
        strcpy(L->elem[j - 1].sex, L->elem[j].sex);
    }
    L->length--;
    printf("删除完成!\n");
    return *L;
}
int main()
{
    char num[maxlen];
    int option, i, j, search_option;
    int end_sign = 1;
    while (end_sign) // end_sign为结束标志,如果输入退出那么置0
    {
        printf("1、添加联系人信息构建顺序表\n");
        printf("2、输出联系人信息\n");
        printf("3、指定查找方式查找联系人信息\n");
        printf("4、插入联系人信息\n");
        printf("5、删除联系人信息\n");
        printf("6、输出联系人总人数\n");
        printf("7、将所有联系人信息保存到txt文档中\n");
        printf("8、修改指定序号的数值\n");
        printf("9、退出\n");
        printf("请选择要操作的序号!\n");
        scanf("%d", &option);
        switch (option)
        {
        case 1:
            createSeqList();
            break;
        case 2:
            displayList(*L);
            break;
        case 3:
            printf("请输入查找方式!");
            printf("1 按编号查询。");
            printf("2 按姓名查询。");
            printf("3 按电话号码查询。");
            printf("4 按地址查询。\n");
            scanf("%d", &search_option);
            switch (search_option)
            {
            case 1:
                number_search(*L);
                break;
            case 2:
                name_search(*L);
                break;
            case 3:
                phone_search(*L);
                break;
            case 4:
                addr_search(*L);
                break;
            default:
                printf("输入错误!");
                break;
            }
            break;
        case 4:
            printf("请输入插入位置!\n");
            scanf("%d", &i);
            add_linkmans(L, i);
            break;
        case 5:
            printf("请输入删除位置!\n");
            scanf("%d", &j);
            del_linkman(L, j);
            break;
        case 6:
            printf("联系人总人数为%d\n", L->length);
            break;
        case 7:
            SeqList_Save_2_Txt(L);
            break;
        case 8:
            printf("请输入修改值的的序号\n");
            scanf("%s", &num);
            alter(L, num);
            break;
        case 9:
            end_sign = 0;
            break;
        default:
            break;
        }
    }
    return 0;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看清之后才看轻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值