m0_69917930 2022-12-11 08:23 采纳率: 100%
浏览 263
已结题

数据结构题,比较急迫,c语言编写

设计一个好友通信模拟软件,提供用户管理、好友管理、消息发送、运动健康等功能,具体需求如下:
选择合适的数据结构(逻辑结构和物理结构)维护用户基本信息列表(即UsrInfo,包括学号id、姓名name、性别gender、年龄age、行走步数step)。(10分)
选择合适的数据结构(逻辑结构和物理结构)维护用户间的好友关系以及熟悉程度(即Relation)。(10分)
选择合适的数据结构(逻辑结构和物理结构)维护每个用户的接收信息缓冲区(即Buffer)。(10分)
实现int addUsr(UsrInfo* lst, int id, char* name, char* gender, int age, int step)函数,向lst中新增用户并初始化基本信息,返回是否新增成功。(12分=算法设计与分析3分+算法实现9分)
实现int addFriend(Relation* rel, int id1, int id2, int familiar)函数,向rel中新增id1和id2两个用户之间的好友关系;familiar为两用户间的熟悉程度(值越小表示熟悉程度越高),返回是否构建成功。(12分=算法设计与分析3分+算法实现9分)
实现void printSteps(UsrInfo* lst)函数,从高到低打印用户行走步数的排行榜,包括姓名和步数。(12分=算法设计与分析3分+算法实现9分)
实现void sendMsg(UsrInfo* lst, Relation* rel, Buffer* buf, int id1, int id2, char* msg)函数,如果id1和id2两个用户是好友,则把msg送入id2的接收信息缓冲区;如果id1和id2两个用户不是好友,则丢弃信息;若该缓冲区中积累的信息长度超过THRESHOLD=32个字符,则按接收先后顺序打印缓冲区中的信息,然后清空缓冲区。(16分=算法设计与分析4分+算法实现12分)
实现int main()函数,通过调用addUsr、addFriend函数构建如图1所示的用户基本信息和好友关系;通过调用printSteps函数打印行走步数排行榜;通过调用sendMsg函数模拟信息发送过程。(8分)
根据构建完成的好友关系,手动计算各用户间的最短距离和最短路径。(10分)

img

  • 写回答

6条回答 默认 最新

  • 叶落花枯 2022-12-11 13:03
    关注

    根据要求,大体的功能已实现,代码如下。
    如有帮助,望采纳!

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define THRESHOLD   32
    
    //用户基本信息
    typedef struct _userInfo {
        int id;         //学号
        char name[20];  //姓名
        char gender[4]; //性别
        int age;        //年龄
        int step;       //行走步数
        struct _userInfo *next;
    } UsrInfo;
    //好友关系以及熟悉程度
    typedef struct _relation {
        int id1;        //用户1学号
        int id2;        //用户2学号
        int familiar;   //好友熟悉程度
        struct _relation *next;
    } Relation;
    //接收信息缓冲区
    typedef struct _buffer {
        int id;                 //用户学号
        char msg[THRESHOLD];    //接收信息缓冲区
        int len;                //累积的信息长度
        struct _buffer *next;
    } Buffer;
    //用户信息节点(如果改成这种结构可能更好一些,同一用户的信息全部在一个结构体,统一一个链表管理)
    //typedef struct _node {
    //    UsrInfo usrInfo;    //用户基本信息
    //    Relation relation;  //好友关系以及熟悉程度
    //    Buffer buffer;      //接收信息缓冲区
    //    struct _node *next;
    //} UsrNode;
    //UsrNode *head = NULL;   //用户信息链表头节点
    UsrInfo *lst = NULL; //用户基本信息链表头节点
    Relation *rel = NULL; //用户好友关系以及熟悉程度信息链表头节点
    Buffer *buf = NULL; //用户接收信息缓冲区链表头节点
    
    //添加用户
    int addUsr(UsrInfo *lst, int id, char *name, char *gender, int age, int step)
    {
        if(lst == NULL) {
            return -1;
        }
        UsrInfo *p = lst;
        while(p) {
            if(p->id == id) { //查找到有这个id的用户
                printf("添加用户失败,id=%d的用户已存在!", id);
                return -2;
            }
            if(p->next == NULL) {
                UsrInfo *node = (UsrInfo *)malloc(sizeof(UsrInfo));
                node->id = id;
                strcpy(node->name, name);
                strcpy(node->gender, gender);
                node->age = age;
                node->step = step;
                node->next = NULL;
                p->next = node;
                break;
            }
            p = p->next;
        }
        //同步生成接收信息缓冲区节点
        Buffer *p2 = buf;
        while(p2) {
            if(p2->id == id) { //查找到有这个id的用户
                p2->len = 0; //直接清空就可以
                break;
            }
            if(p2->next == NULL) {
                Buffer *node = (Buffer *)malloc(sizeof(Buffer));
                node->id = id;
                node->len = 0;
                node->next = NULL;
                p2->next = node;
                break;
            }
            p2 = p2->next;
        }
        return 0;
    }
    
    //添加好友
    int addFriend(Relation *rel, int id1, int id2, int familiar)
    {
        if(rel == NULL) {
            return -1;
        }
        int flag1 = 0, flag2 = 0;
        UsrInfo *p = lst;
        while(p) { //查找用户是否存在
            if(p->id == id1) {
                flag1 = 1;
            }
            if(p->id == id2) {
                flag2 = 1;
            }
            p = p->next;
        }
        if(flag1 == 0) {
            return -2; //id1用户不存在
        }
        if(flag2 == 0) {
            return -3; //id2用户不存在
        }
        Relation *q = rel;
        while(q) { //查找好友关系是否存在
            if((q->id1 == id1 && q->id2 == id2) || (q->id1 == id2 || q->id2 == id1)) {
                return -4;
            }
            if(q->next == NULL) {
                Relation *node = (Relation *)malloc(sizeof(Relation));
                node->id1 = id1;
                node->id2 = id2;
                node->familiar = familiar;
                node->next = NULL;
                q->next = node;
                break;
            }
            q = q->next;
        }
        return 0;
    }
    
    //从高到低打印用户行走步数的排行榜
    void printSteps(UsrInfo *lst)
    {
        if(lst == NULL) {
            return;
        }
        int n = 0;
        printf("********************************\n\n");
        UsrInfo *p = lst->next;
        while(p) { //遍历链表,统计用户个数
            n++;
            p = p->next;
        }
        if(n == 0) {
            printf("行走步数排行榜为空,当前没有用户!\n");
            printf("\n");
        }
        else {
            char name[n][20], s[20];
            int step[n];
            int m = 0, t;
            p = lst->next;
            while(p) { //遍历链表,取出用户姓名和行走步数
                strcpy(name[m], p->name);
                step[m] = p->step;
                m++;
                p = p->next;
            }
            for(int i=0; i<n-1; i++) { //冒泡排序
                for(int j=0; j<n-1-i; j++) {
                    if(step[j] < step[j+1]) {
                        t = step[j];
                        step[j] = step[j+1];
                        step[j+1] = t;
                        strcpy(s, name[j]);
                        strcpy(name[j], name[j+1]);
                        strcpy(name[j+1], s);
                    }
                }
            }
            printf("行走步数排行榜\n\n");
            printf("排名\t姓名\t行走步数\n");
            for(int i=0; i<n; i++) {
                printf("%d\t%s\t%d\n", i+1, name[i], step[i]);
            }
            printf("\n");
        }
        printf("********************************\n");
    }
    
    //发送消息
    void sendMsg(UsrInfo *lst, Relation *rel, Buffer *buf, int id1, int id2, char *msg)
    {
        if(lst == NULL || rel == NULL || buf == NULL) {
            return;
        }
        int flag1 = 0, flag2 = 0;
        UsrInfo *p = lst;
        while(p) { //查找用户是否存在
            if(p->id == id1) {
                flag1 = 1;
            }
            if(p->id == id2) {
                flag2 = 1;
            }
            p = p->next;
        }
        if(flag1 == 0) {
            printf("发送消息失败,id1=%d的用户不存在!\n", id1);
            return;
        }
        if(flag2 == 0) {
            printf("发送消息失败,id2=%d的用户不存在!\n", id2);
            return;
        }
        Relation *q = rel;
        while(q) { //查找好友关系是否存在
            if((q->id1 == id1 && q->id2 == id2) || (q->id1 == id2 || q->id2 == id1)) {
                break;
            }
            q = q->next;
        }
        if(q == NULL) {
            printf("发送消息失败,id1=%d和id2=%d不是好友关系!\n", id1, id2);
        }
        else {
            Buffer *p2 = buf;
            while(p2) { //查找用户是否存在
                if(p2->id == id2) {
                    int msgLen = strlen(msg); //信息长度
                    if(p2->len + msgLen > THRESHOLD) { //缓冲区中积累的信息长度超过THRESHOLD=32个字符
                        printf("接收信息缓冲区的内容: ");
                        for(int i=0; i<p2->len; i++) {
                            printf("%c", p2->msg[i]);
                        }
                        printf("%s\n", msg);
                        p2->len = 0;
                    }
                    else {
                        strcpy(p2->msg + p2->len, msg);
                        p2->len += msgLen;
                    }
                    printf("id1=%d向id2=%d发送信息成功,id2=%d用户接收信息缓冲区的信息长度为%d\n", id1, id2, id2, p2->len);
                    break;
                }
                p2 = p2->next;
            }
        }
    }
    
    //打印当前所有用户基本信息
    void printAllUsrInfo(UsrInfo *lst)
    {
        if(lst == NULL) {
            return;
        }
        printf("********************************\n\n");
        UsrInfo *p = lst->next;
        while(p) {
            printf("id:     %d\n", p->id);
            printf("name:   %s\n", p->name);
            printf("gender: %s\n", p->gender);
            printf("age:    %d\n", p->age);
            printf("step:   %d\n", p->step);
            printf("\n");
            p = p->next;
        }
        printf("********************************\n");
    }
    
    //计算各用户间的最短距离和最短路径(这个不好写)
    
    int main()
    {
        int ret, select, running = 1;
        lst = (UsrInfo *)malloc(sizeof(UsrInfo)); //用户基本信息链表头节点
        rel = (Relation *)malloc(sizeof(Relation)); //用户好友关系以及熟悉程度信息链表头节点
        buf = (Buffer *)malloc(sizeof(Buffer)); //用户接收信息缓冲区链表头节点
        while(running == 1) {
            printf("1 添加用户\n");
            printf("2 添加好友\n");
            printf("3 发送消息\n");
            printf("4 打印行走步数的排行榜\n");
            printf("5 打印当前所有用户基本信息\n");
            printf("0 退出\n");
            printf("Select > ");
            scanf("%d", &select);
            printf("\n");
            switch (select) {
            case 1:
            {
                UsrInfo usrInfo;
                printf("学号: ");
                scanf("%d", &usrInfo.id);
                printf("姓名: ");
                scanf("%s", usrInfo.name);
                printf("性别: ");
                scanf("%s", usrInfo.gender);
                printf("年龄: ");
                scanf("%d", &usrInfo.age);
                printf("行走步数: ");
                scanf("%d", &usrInfo.step);
                ret = addUsr(lst, usrInfo.id, usrInfo.name, usrInfo.gender, usrInfo.age, usrInfo.step);
                if(ret == 0) {
                    printf("添加id=%d的用户成功!\n", usrInfo.id);
                }
                else if(ret == -2) {
                    printf("添加用户失败,id=%d的用户已存在!\n", usrInfo.id);
                }
                break;
            }
            case 2:
            {
                int id1, id2, familiar;
                printf("用户1学号: ");
                scanf("%d", &id1);
                printf("用户2学号: ");
                scanf("%d", &id2);
                printf("熟悉程度: ");
                scanf("%d", &familiar);
                ret = addFriend(rel, id1, id2, familiar);
                if(ret == 0) {
                    printf("添加好友成功!\n");
                }
                else if(ret == -2) {
                    printf("添加好友失败,id1=%d的用户不存在!\n", id1);
                }
                else if(ret == -3) {
                    printf("添加好友失败,id2=%d的用户不存在!\n", id2);
                }
                else if(ret == -4) {
                    printf("添加好友失败,id1=%d和id2=%d已经是好友关系!\n", id1, id2);
                }
                break;
            }
            case 3:
            {
                int id1, id2;
                char msg[1000] = {0};
                printf("发送方用户学号: ");
                scanf("%d", &id1);
                printf("接收方用户学号: ");
                scanf("%d", &id2);
                getchar();
                printf("发送的信息: ");
                gets(msg);
                sendMsg(lst, rel, buf, id1, id2, msg);
                break;
            }
            case 4:
                printSteps(lst);
                break;
            case 5:
                printAllUsrInfo(lst);
                break;
            case 0:
                running = 0;
                break;
            default:
                break;
            }
            if(running == 1) {
                printf("\n");
                system("pause");
                system("cls");
            }
        }
        //释放链表内存空间
        if(lst) {
            UsrInfo *p = lst;
            UsrInfo *q = p;
            while(p) {
                q = p->next;
                free(p);
                p = q;
            }
            lst = NULL;
        }
        if(rel) {
            Relation *p = rel;
            Relation *q = p;
            while(p) {
                q = p->next;
                free(p);
                p = q;
            }
            rel = NULL;
        }
        if(buf) {
            Buffer *p = buf;
            Buffer *q = p;
            while(p) {
                q = p->next;
                free(p);
                p = q;
            }
            buf = NULL;
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 12月19日
  • 已采纳回答 12月11日
  • 创建了问题 12月11日

悬赏问题

  • ¥15 双向孟德尔随机化反向是为什么显示参数长度为零
  • ¥15 用C语言完成一个复杂的游戏
  • ¥15 如何批量更改很多个文件夹里的文件名中包含文件夹名?
  • ¥50 MTK手机模拟HID鼠标出现卡顿
  • ¥20 求下下面这个数据结构代码
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来
  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice