数据结构题 用C语言编写 有没有看得到呀

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

img

从题意上来讲,你这个工程量有点大,等同于一个项目,建议你分模块去重新提交题目。单纯一个人去完成,不一定有人会接受这个任务。当然这只是个人建议。

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

#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;
//用户信息节点(如果改成这种结构可能更好一些,同一用户的信息全部在一个结构体,统一一个链表管理)
/pedef 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->namename);
            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+1name[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;
} 

你这是个小型qq啊

题主是要做社交软件吗

类似的,可以看看
如有帮助,望采纳

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

typedef struct{
 char num[5];
 char name[9];
 char sex[9];
 char phone[13];
 char addr[31];
}DataType;
typedef struct node{
 DataType data;
 struct node*next;
} ListNode, *LinkList;

LinkList head;
ListNode *p;

int menu_select();
LinkList CreateList(void);
void InsertNode(LinkList head,ListNode *p);
ListNode *ListFind(LinkList head);
void DelNode(LinkList head);
void printList(LinkList head);
void ChangeNode(LinkList head);

int main(void){
 for(; ;){
  switch(menu_select()){
   case 1:
    printf("**********************\n");
    printf("* 通 讯 录 链 表 建 立 *\n");
    printf("***********************\n");
    head=CreateList();
    break;
   case 2:
    printf("*********************\n");
    printf("通 讯 录 信 息 的 插 入 *\n");
    printf("*********************\n");
    printf("请输入编号,姓名,性别,电话和地址 \n");
    printf("**********************************\n");
    p=(ListNode*)malloc(sizeof(ListNode));
    scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
    InsertNode(head,p);
    break;
   case 3:
    printf("***********************\n");
    printf("通 讯 录 的 查 询 *\n");
    p=ListFind(head);
    if(p!=NULL){
     printf("编号 姓名 性别 电话 地址 \n");
     printf("-------------------------- \n");
     printf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
}    else
     printf("没查到要查询的通讯者!\n");
     break;
   case 4:
    printf("***********************\n");
    printf("* 通 讯 者 信 息 的 修 改 *\n");
    printf("**********************\n");
    ChangeNode(head);
    break;
   case 5:
    printf("************************\n");
    printf("通 讯 录 的 信 息 删 除 *\n");
    printf("*************************\n");
    DelNode(head);
    break;
   case 6:
    printf("************************\n");
    printf("通 讯 录 链 表 的 输 出 *\n");
    printf("*************************\n");
    printList(head);
    break;
   case 0:
    printf("\t 再 见!\n");
    return 0;
 }
 }

}
int menu_select(){
 int sn;
 printf(" 通讯录管理系统\n");
 printf("========================\n");
 printf(" 1. 通讯录链表的建立\n");
 printf(" 2. 通讯录信息的插入\n");
 printf(" 3. 通讯录信息的查询\n");
 printf(" 4. 通讯录信息的修改\n");
 printf(" 5. 通讯录信息的删除\n");
 printf(" 6. 通讯录信息的输出\n");
 printf(" 0. 退出管理系统\n");
 printf(" 请 选 择 0—6:");
 for(; ;){
  scanf("%d",&sn);
  if(sn<0 || sn>6)
   printf("\n\t输入错误,重选0-6:");
  else
   break;
}
 return sn;


}
LinkList CreateList(void){
 LinkList head=(ListNode *)malloc(sizeof(ListNode));
 ListNode *p,*rear;
 char flag='y';
 rear=head;
 while(flag=='y'){
  p=(ListNode *)malloc(sizeof(ListNode));
  printf("请顺序输入编号,姓名,性别,电话和地址\n");
  printf("--------------------------------------\n");
  scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
  rear->next=p;
  rear=p;
  printf("继续输入吗? (y/n):");
  getchar();
  scanf("%c",&flag);
}

 rear->next=NULL;
 return head;

} 
void InsertNode(LinkList head,ListNode *p){
 ListNode *p1,*p2;
 p1=head;
 p2=p1->next;
 while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0)
 {
  p1=p2;
  p2=p2->next;

 }

 p1->next=p;
 p->next=p2;

} 
ListNode *ListFind(LinkList head){
 ListNode *p; 
 char num[5];
 char name[9]; 
 int xz=0;
 printf("===========\n");
 printf("1. 按编号查询 \n");
 printf("2. 按姓名查询 \n");
 printf("===========\n");
 printf(" 请选择:");
 p=head->next;
 scanf("%d",&xz);
 if(xz==1){
  printf("请输入要查询者的编号:");
  scanf("%s",num);
  while(p && strcmp(p->data.num,num)<0)
   p=p->next;
  if(p==NULL||strcmp(p->data.num,num)>0)
   p=NULL;

}
 else
  if(xz==2) {
   printf("请输入要查询者的姓名:");
   scanf("%s",name);
   while(p && strcmp(p->data.name,name)!=0)
    p=p->next;    
 }

 return p;
}
void DelNode(LinkList head){
 char jx;
 ListNode *p,*q;
 p=ListFind(head);
 if(p==NULL){
  printf("没有查到要删除的通讯者!\n");
  return;

 }
 printf("真的要删除该节点吗?(y/n):");
 getchar();
 scanf("%c",&jx);
 if(jx=='y'||jx=='Y'){
  q=head;
  while(q!=NULL && q->next!=p)
   q=q->next;
  q->next=p->next;
  free(p);
  printf("通讯录已经删除!\n");
 }
}
void printList(LinkList head){
 ListNode *p;
 p=head->next;
 printf("编号 姓名 性别 电话 地址\n");
 printf("--------------------------------------\n");
 while(p!=NULL)
 {
  printf("%s%s%s%s%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
  printf("--------------------------------\n");
  p=p->next;
 }
} 
void ChangeNode(LinkList head){
 ListNode *p;
 p=ListFind(head);
 if(p!=NULL){
  printf("编号 姓名 性别 电话 地址\n");
  printf("--------------------------------------\n");
  scanf("%s%s%s%s%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
  printf("--------------------------------------\n");
  printf("输入该通讯录者正确的联系电话 通讯地址:\n中间用空格号分隔\n");
  scanf("%s%s",p->data.phone,p->data.addr);

}
 else
  printf("没查到要查询的通讯录者!\n");
}

OK