标题:初学不懂,请问这样子算是使用了链表吗
只看楼主
和3417922
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2022-7-15
结帖率:0
已结贴  问题点数:20 回复次数:1 
初学不懂,请问这样子算是使用了链表吗
程序代码:
/*
以本班同学的具体数据为背景,设计一个本班同学通讯录
实现以下功能:
1) 通讯录编辑(添加、删除);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。
*/

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

#define NAME_LEN 40
#define ADDRESS_LEN 60
#define TEL_LEN 12
#define E_LEN 30
#define MAX 1000

//*****************函数声明*******************//
void menu();
void InitContact(struct Contact* ps);
void Add(struct Contact* p);
void Del(struct Contact* p);
void Moidfy(struct Contact* p);
void Search(struct Contact* p);
void Sort(struct Contact* p);
void Sort_by_name(struct Contact* p);
void Sort_by_tele(struct Contact* p);
int FindValue_1(struct Contact* p, char* name);
int FindValue_2(struct Contact* p, char* name);
void Show(struct Contact* p);
void LoadContact(Contact* p);
int SaveFILE(struct Contact* p);

//*****************联系人信息*****************//
struct people
{
    char name[NAME_LEN];            //姓名
    char address[ADDRESS_LEN];        //地址
    char telephone_num[TEL_LEN];    //电话
    int Postal;                        //邮编
    char E_mail[E_LEN];                //E-mail
};

//***************通讯录类型*****************//
struct Contact
{
    struct people data[MAX];    //存放1000个信息
    int size;                    //记录当前结构体内已经有的元素个数
};

void menu()
{
    printf("\n");
    printf("---------------------------------\n");
    printf("**      1. 添加联系人          **\n");
    printf("**      2. 删除联系人          **\n");
    printf("**      3. 查找联系人          **\n");
    printf("**      4. 修改联系人          **\n");
    printf("**      5. 显示所有联系人      **\n");
    printf("**      6. 排序联系人          **\n");
    printf("**      0. exit                **\n");
    printf("---------------------------------\n");
}

//***************初始化通讯录***************//
void InitContact(struct Contact* ps)
{
    memset(ps->data, 0, sizeof(ps->data));
    ps->size = 0;//通讯录最初只有0个元素
}

//**************添加联系人信息**************//
void Add(struct Contact *p)
{
    if (p->size >= MAX)
        printf("通讯录已满,无法增加\n");
    else
    {
        printf("请输入姓名:>");
        scanf("%s", p->data[p->size].name);
        printf("请输入住址:>");
        scanf("%s", p->data[p->size].address);
        printf("请输入电话:>");
        scanf_s("%s", p->data[p->size].telephone_num,12);
        printf("请输入邮编:>");
        scanf("%d", &p->data[p->size].Postal);
        printf("请输入E-mail:>");
        scanf("%s", p->data[p->size].E_mail);

        p->size++;
        printf("添加成功\n");
    }
}

//**************删除联系人信息**************//
void Del(struct Contact* p)
{
    char name[NAME_LEN];
    int temp = 0;//用来确认是否删除
    int flag = 0;

    if (p->size <= 0) {
        printf("通讯录中没有联系人,请添加!\n");
    }
    else
    {
        printf("查找姓名:");
        scanf("%s", name);
        flag = FindValue_1(p, name);
        if (flag == -1)
        {
            printf("联系人不存在!\n");
        }
        else
        {
                int i = 0;
                for ( i = flag; i < p->size - 1; i++)
                {
                    p->data[i] = p->data[i + 1];
                }
                p->size--;
                printf("删除成功!\n");
            
        }
    }
}

//**************修改联系人信息**************//
void Moidfy(struct Contact* p)
{
    float get = 0;
    char name[NAME_LEN];

    if (p->size <= 0) {
        printf("通讯录中没有联系人,请添加!\n");
    }
    else
    {
        printf("查找姓名:");
        scanf("%s", name);
        int flag = FindValue_1(p, name);
        if (flag == -1)
            printf("联系人不存在!\n");
        else
            printf("输入0退出修改,否则继续:>");
        scanf("%f", &get);
        if (get != 0)
        {
            printf("请输入姓名:>");
            scanf("%s", p->data[flag].name);
            printf("请输入住址:>");
            scanf("%s", p->data[flag].address);
            printf("请输入电话:>");
            scanf_s("%s", p->data[flag].telephone_num,12);
            printf("请输入邮编:>");
            scanf("%d", &p->data[flag].Postal);
            printf("请输入E-mail:>");
            scanf("%s", p->data[flag].E_mail);

            printf("修改成功!");
        }
    }
}

//**************查找联系人信息**************//
void Search(struct Contact* p)
{
    char name[NAME_LEN];
    char telephone_num[TEL_LEN];
    int select = 0;
    int flag = 0;

    printf("查找:\n\t 1.按姓名    2.按电话号码\n|>");
    scanf("%d", &select);
    if (select == 1)
    {
        scanf("%s", name);
        flag = FindValue_1(p, name);
    }
    else if(select == 2)
    {
        scanf("%s", telephone_num);
        flag = FindValue_2(p, telephone_num);
    }
    else
    {
        printf("输入错误\n");
        flag = -1;
    }
    if (flag == -1)
    {
        printf("联系人不存在!\n");
    }
    else
    {
        printf("\t姓名:>");
        printf("%s\n", p->data[flag].name);
        printf("\t住址:>");
        printf("%s\n", p->data[flag].address);
        printf("\t电话:>");
        printf("%s\n", p->data[flag].telephone_num);
        printf("\t邮编:>");
        printf("%d\n", p->data[flag].Postal);
        printf("\tE-mail:>");
        printf("%s\n", p->data[flag].E_mail);
    }
    
}

void Sort(struct Contact* p)
{
    int select = 0;
    printf("\t0.退出    1.按姓名    2.按电话号码\n|>");
    do
    {
        scanf("%d", &select);
        switch (select)
        {
        case 0: break;
        case 1:
            Sort_by_name(p);
            break;
        case 2:
            Sort_by_tele(p);
            break;
        default:
            printf("选择错误,请重新选择 ! \n");
            break;
        }
    } while (select != 0);
}

//****************姓名排序并显示****************//
void Sort_by_name(struct Contact *p)
{

    if (p->size <= 0) {
        printf("通讯录中没有联系人,请添加!\n");
    }
    else
    {
        int  i, j;

        for (i = 0; i < p->size - 1; i++)
        {
            for (j = 0; j < p->size - i - 1; j++)
            {
                if (strcmp(p->data[j].name, (p->data[j + 1]).name) > 0)
                {
                    struct people temp;
                    temp = p->data[j];
                    p->data[j] = p->data[j + 1];
                    p->data[j + 1] = temp;
                }
            }
        }
        printf("排序成功!\n");
    
    }
}

//****************电话排序并显示****************//
void Sort_by_tele(struct Contact* p)
{

    if (p->size <= 0) {
        printf("通讯录中没有联系人,请添加!\n");
    }
    else
    {
        int  i, j;

        for (i = 0; i < p->size - 1; i++)
        {
            for (j = 0; j < p->size - i - 1; j++)
            {
                if (strcmp(p->data[j].telephone_num, (p->data[j + 1]).telephone_num) > 0)
                {
                    struct people temp;
                    temp = p->data[j];
                    p->data[j] = p->data[j + 1];
                    p->data[j + 1] = temp;
                }
            }
        }
        printf("排序成功!\n");
        
    }
}

//*****************按姓名查找****************//
int FindValue_1(struct Contact* p, char* name)
{

    int i = 0;
    for (i = 0; i < p->size; i++)
    {
        if (strcmp(p->data[i].name, name) == 0)
            return i;
    }
    return -1;
}

//*****************按电话号码查找****************//
int FindValue_2(struct Contact* p, char* telephone_num)
{

    int i = 0;
    for (i = 0; i < p->size; i++)
    {
        if (strcmp(p->data[i].telephone_num, telephone_num) == 0)
            return i;
    }
    return -1;
}

//***************显示通讯录*****************//
void Show(struct Contact* p)
{
    if (p->size <= 0) {
        printf("通讯录中没有联系人,请添加!\n");
    }
    else
    {
        for (int i = 0; i < p->size; i++)
        {
            printf("%-10s%-10s%-10s%-10d%-10s\n ",
                p->data[i].name,
                p->data[i].address,
                p->data[i].telephone_num,
                p->data[i].Postal,
                p->data[i].E_mail);
        }
    }
}

//***************读取通讯录*****************//
void LoadContact( struct Contact* p)
{
    people tmp = { 0 };//临时变量tmp
    FILE* FR = fopen("contact.txt", "rb");
    if (FR == NULL)
    {
        printf("LoadContact::%s\n", strerror(errno));
        return;
    }

    //读取文件,存放到通讯录中
    while (fread(&tmp, sizeof(people), 1, FR))
    {
        p->data[p->size] = tmp;

        p->size++;
    }
    fclose(FR);
    FR = NULL;
}

//****************保存通讯录*****************//
int SaveFILE(struct Contact *p)
{
    FILE* fp = fopen("contact.txt", "w");
    if (fp == NULL)
    {
        printf("SaveContact::%s\n", strerror(errno));
        return -1;
    }
    //写通讯录中数据到为文件中
    int i = 0;
    for (i = 0; i < p->size; i++)
    {
        fwrite(&(p->data[i]), sizeof(people), 1, fp);
    }
    printf("已保存联系人!\n");
    fclose(fp);
    fp = NULL;
    return 0;
}

//***************主函数*****************//
int main()
{
    int input = 0;

    struct Contact con;            //创建通讯录,里面包含1000个元素的数和size

    InitContact(&con);            //初始化通讯录
    LoadContact(&con);
    do
    {

        menu();
        printf("请选择:>\n别输入字母哟!");
        scanf("%d", &input);
        switch (input)
        {
        case 1: Add(&con);

            break;
        case 2: Del(&con);

            break;
        case 3: Search(&con);

            break;
        case 4: Moidfy(&con);

            break;
        case 5: Show(&con);

            break;
        case 6: Sort(&con);

            break;
        case 0: printf("退出通讯录\n");
            break;
        default:    printf("选择错误\n");
            break;
        }
    } while (input);
    SaveFILE(&con);
    return 0;
}
搜索更多相关主题的帖子: int size data printf struct 
2022-07-15 18:55
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:20 
回复 楼主 和3417922
这是结构体数组
链表是单独有一个指针能把所有数据串起来,形成一个链

DO IT YOURSELF !
2022-07-16 07:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509572-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024019 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved