设计一个好友通信模拟软件,提供用户管理、好友管理、消息发送、运动健康等功能,具体需求如下:
选择合适的数据结构(逻辑结构和物理结构)维护用户基本信息列表(即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分)
数据结构题,比较急迫,c语言编写
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报