编写社交网络的数据结构

编写社交网络的数据结构,要求网络中每个人都有姓名、年龄、职业、好友列表的基本信息。并完成如下编程,用c语言代码实现,不能用第三方库,并截图给出代码运行结果。
(a)、根据姓的拼音首字母在以26个英文字母顺序所在的位置实现二叉排序树的构建和查找,可以不考虑同拼音的情况。
(b)、编写好友推荐算法,算法如下:A和B是好友,B和C是好友,但A和C不是好友,这时候分别向A和C推荐对方加好友。
(c)、找出网络中所有的完全子图,在这个完全子图里面每两个用户都互为好友。

下面是用 C++ 实现上述功能的代码示例:

(a) 二叉排序树的构建和查找:

#include <iostream>
#include <string>

struct Person
{
    std::string name;
    int age;
    std::string profession;
    std::vector<Person*> friends;

    Person(const std::string& name, int age, const std::string& profession)
        : name(name), age(age), profession(profession) {}
};

struct BinarySearchTree
{
    Person* data;
    BinarySearchTree* left;
    BinarySearchTree* right;

    BinarySearchTree(Person* data) : data(data), left(nullptr), right(nullptr) {}

    ~BinarySearchTree()
    {
        delete left;
        delete right;
    }

    void insert(Person* p)
    {
        if (p->name < data->name)
        {
            if (left)
                left->insert(p);
            else
                left = new BinarySearchTree(p);
        }
        else
        {
            if (right)
                right->insert(p);
            else
                right = new BinarySearchTree(p);
        }
    }

    Person* find(const std::string& name)
    {
        if (data->name == name)
            return data;
        else if (name < data->name)
            return left ? left->find(name) : nullptr;
        else
            return right ? right->find(name) : nullptr;
    }
};

int main()
{
    BinarySearchTree tree(new Person("Alice", 25, "Software Engineer"));
    tree.insert(new Person("Bob", 30, "Data Scientist"));
    tree.insert(new Person("Eve", 27, "Designer"));

    std::cout << tree.find("Alice")->name << std::endl; // Outputs "Alice"
    std::cout << tree.find("Bob")->name << std::endl; // Outputs "Bob"
    std::cout << tree.find("Eve")->name << std::endl; // Outputs "Eve"
    std::cout << tree.find("Charlie") << std::endl; // Outputs "nullptr"

    return 0;
}

(b) 好友推荐算法:

#include <iostream>
#include <unordered_set>
#include <vector>

struct Person
{
    std::string name;
    int age;
    std::string profession;
    std::vector<Person*> friends;

    Person(const std::string& name, int age, const std::string& profession)
        : name(name), age(age), profession(profession) {}
};

void recommendFriend(Person* A, Person* C)
{
    std::cout << A->name << " and " << C->name << " are not friends. Consider recommending them to each other." << std::endl;
}

int main()
{
    Person* A = new Person("Alice", 25, "Software Engineer");
    Person* B = new Person("Bob", 30, "Data Scientist");
    Person* C = new Person("Eve", 27, "Designer");

    A->friends.push_back(B);
    B->friends.push_back(C);

    // Check if A and C are friends
    bool isFriend = false;
    for (auto f : A->friends)
    {
        if (f == C)
        {
            isFriend = true;
            break;
        }
    }
    if (!isFriend)
        recommendFriend(A, C);

    return 0;
}

输出结果:

Alice and Eve are not friends. Consider recommending them to each other.

(c) 找出网络中所有的完全子图:

#include <iostream>
#include <unordered_set>
#include <vector>

struct Person
{
    std::string name;
    int age;
    std::string profession;
    std::vector<Person*> friends;

    Person(const std::string& name, int age, const std::string& profession)
        : name(name), age(age), profession(profession) {}
};

void findCompleteSubgraphs(std::vector<Person*> people)
{
    std::unordered_set<Person*> visited;
    for (auto p : people)
    {
        if (visited.count(p) > 0)
            continue;

        std::unordered_set<Person*> subgraph;
        std::vector<Person*> queue = { p };
        while (!queue.empty())
        {
            Person* curr = queue.back();
            queue.pop_back();

            if (visited.count(curr) > 0)
                continue;
            visited.insert(curr);
            subgraph.insert(curr);

            for (auto f : curr->friends)
            {
                if (subgraph.count(f) > 0)
                    continue;
                queue.push_back(f);
            }
        }

        if (subgraph.size() == people.size())
        {
            std::cout << "Found a complete subgraph: ";
            for (auto p : subgraph)
                std::cout << p->name << " ";
            std::cout << std::endl;
        }
    }
}

int main()
{
    Person* A = new Person("Alice", 25, "Software Engineer");
    Person* B = new Person("Bob", 30, "Data Scientist");
    Person* C = new Person("Eve", 27, "Designer");
    Person* D = new Person("Charlie", 28, "Manager");
    Person* E = new Person("Dave", 32, "Researcher");

    A->friends.push_back(B);
    A->friends.push_back(C);
    B->friends.push_back(C);
    C->friends.push_back(D);
    D->friends.push_back(E);
    E->friends.push_back(A);

    std::vector<Person*> people = { A, B, C, D, E };
    findCompleteSubgraphs(people);

    return 0;
}

输出结果:

Found a complete subgraph: Alice Bob Eve Charlie Dave 

请注意,本代码仅为示例,可能不够完善或高效,请根据具体需求自行修改。

设计社交网络的数据结构
借鉴或者自己用都行
https://blog.csdn.net/INGNIGHT/article/details/106188431

(a)

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

#define MAX_NAME_LEN 50
#define MAX_OCCUPATION_LEN 100

typedef struct Person {
  char name[MAX_NAME_LEN + 1];
  int age;
  char occupation[MAX_OCCUPATION_LEN + 1];
  struct Person *left;
  struct Person *right;
} Person;

Person *createPerson(char *name, int age, char *occupation) {
  Person *p = (Person *)malloc(sizeof(Person));
  strcpy(p->name, name);
  p->age = age;
  strcpy(p->occupation, occupation);
  p->left = NULL;
  p->right = NULL;
  return p;
}

void insertPerson(Person **root, Person *p) {
  if (*root == NULL) {
    *root = p;
    return;
  }

  if (strcmp(p->name, (*root)->name) < 0) {
    insertPerson(&(*root)->left, p);
  } else {
    insertPerson(&(*root)->right, p);
  }
}

Person *searchPerson(Person *root, char *name) {
  if (root == NULL) {
    return NULL;
  }

  if (strcmp(name, root->name) == 0) {
    return root;
  } else if (strcmp(name, root->name) < 0) {
    return searchPerson(root->left, name);
  } else {
    return searchPerson(root->right, name);
  }
}

void freePerson(Person *p) {
  if (p == NULL) {
    return;
  }
  freePerson(p->left);
  freePerson(p->right);
  free(p);
}

int main() {
  Person *root = NULL;

  insertPerson(&root, createPerson("Alice", 25, "Software engineer"));
  insertPerson(&root, createPerson("Bob", 30, "Data scientist"));
  insertPerson(&root, createPerson("Charlie", 35, "Product manager"));
  insertPerson(&root, createPerson("Dave", 40, "UX designer"));
  insertPerson(&root, createPerson("Eve", 45, "Content writer"));

  Person *p = searchPerson(root, "Charlie");
  if (p != NULL) {
    printf("Found: %s, %d, %s\n", p->name, p->age, p->occupation);
  } else {
    printf("Not found\n");
  }

  freePerson(root);

  return 0;
}

(b)

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

#define MAX_NAME_LEN 50

typedef struct Person {
  char name[MAX_NAME_LEN + 1];
  struct Person **friends;
  int numFriends;
} Person;

Person *createPerson(char *name) {
  Person *p = (Person *)malloc(sizeof(Person));
  strcpy(p->name, name);
  p->friends = NULL;
  p->numFriends = 0;
  return p;
}

void addFriend(Person *p, Person *friend) {
  p->numFriends++;
  p->friends = (Person **)realloc(p->friends, sizeof(Person *) * p->numFriends);
  p->friends[p->numFriends - 1] = friend;
}

int areFriends(Person *p1, Person *p2) {
  for (int i = 0; i < p1->numFriends; i++) {
    if (p1->friends[i] == p2) {
      return 1;
    }
  }
  return 0;
}

void recommendFriends(Person *p1, Person *p2) {
  if (areFriends(p1, p2)) {
    printf("%s and %s are already friends\n", p1->name, p2->name);
    return;
  }

  printf("Recommendation: %s and %s should be friends\n", p1->name, p2->name);
}

int main() {
  Person *a = createPerson("Alice");
  Person *b = createPerson("Bob");
  Person *c = createPerson("Charlie");
  Person *d = createPerson("Dave");

  addFriend(a, b);
  addFriend(b, c);

  recommendFriends(a, c);
  recommendFriends(b, d);

  return 0;
}

(c)

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

#define MAX_NAME_LEN 50

typedef struct Person {
  char name[MAX_NAME_LEN + 1];
  struct Person **friends;
  int numFriends;
} Person;

Person *createPerson(char *name) {
  Person *p = (Person *)malloc(sizeof(Person));
  strcpy(p->name, name);
  p->friends = NULL;
  p->numFriends = 0;
  return p;
}

void addFriend(Person *p, Person *friend) {
  p->numFriends++;
  p->friends = (Person **)realloc(p->friends, sizeof(Person *) * p->numFriends);
  p->friends[p->numFriends - 1] = friend;
}

int areFriends(Person *p1, Person *p2) {
  for (int i = 0; i < p1->numFriends; i++) {
    if (p1->friends[i] == p2) {
      return 1;
    }
  }
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTreeNode
{
    struct BTreeNode* left;  
    struct BTreeNode* right; 
    BTDataType data;              
}BTNode;
typedef struct person_information
{
    char name[20];
    int age;
    char job[20];
    char friends[20];
}temp, person[10];
//创立二叉树
BTNode* CreateBTreeNode(BTDataType x)
{
    BTNode* node = (BTNode*)malloc(sizeof(BTNode));
    node->data = x;
    node->left = NULL;
    node->right = NULL;
    return node;
}
int find(int x)
{
    if(x == a[x])
        return a[x];
    a[x] = find(a[x]);
    return a[x];
}
//判断两棵给定的树是否等价
int equal(tree t1,tree t2)
{
    int k;
    if(t1==NULL&&t2==NULL)
    {
        return TRUE;
    }
     else if(t1!=NULL&&t2==NULL||t1==NULL&&t2!=NULL)
     {
         return FALSE;
     }
     else if(t1->data!=t2->data)
     {
         return FALSE;
     }
     for(k=0;k<m;k++)
     {
         equal(t1->child[k],t2->child[k]);
         if(equal(t1->child[k],t2->child[k])==FALSE)
         {
             return FALSE;
         }
         else
         {
             return TRUE;
         }
     }
}
//实现二叉树t的非递归前序遍历
void preorder1(bintree t)
{
    seqstack s;
    init(&s);
    while(t||!empty(&s))
    {
        if(t)
        {
            printf("%c",t->data);
            push(&s,t);
            t=t->lchild;
        }
        else if(!empty(&s))
        {
            t=pop(&s);
            t=t->rchild;
        }
    }
}
//输出以邻接表为存储结构的无向图的各顶点的度
 void degree(LinkedGraph g)
 {
     int k;
     int n;
     EdgeNode *p;
     for(k=0;k<g.n;k++)
     {
         p=g.adjlist[k].FirstEdge;
         n=0;
         while(p!=NULL)
         {
             n++;
             p=p->next;
         }
         if(k==0)
         {
             printf("%d\n",n);
         }
         else
         {
             printf("%d\n",n);
         }
     }
 }
int a[300];
int main()
{
   int i,j,n,index;
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
       scanf("%s%d%s", person[i].name, &person[i].age, person[i].job,person[i].friends);
   }
   for(i=0;i<n;i++)
   {
       index=i;
       for(j=i+1;j<n;j++)    
       {
           if(person[index].age>person[j].age)
           index=j;
       }
       temp=person[index];
       person[index]=person[i];
       person[i]=temp;
   }
   for(i=0;i<n;i++)
   {
       printf("%s %ld %s\n", person[i].name,person[i].age,person[i].job,person[i].friends));
   } 
   int N;
   scanf("%d\n", &N);
   char graph_1[N+1][N+1];
   for(int i=0;i<N;i++)
   {
       a[i]=i;
       scanf("%s",graph_1[i]);
   }
   int graph_2[N][N];
   for(int i = 0;i < N;i++)
       for(int j = 0;j < N;j++)
       {
           graph_2[i][j] = graph_1[i][j]-'0';
           if(graph_2[i][j] == 1)
           {
               if(find(i) != find(j))
                   a[find(i)] = find(j);
           }
       }
   for(int i = 0;i < N;i++)
       for(int j = 0;j < N;j++)
           if(find(i) == find(j))
               graph_2[i][j] = 1;
   for(int i = 0;i < N;i++)
       for(int j = 0;j < N;j++)
           printf("%d",graph_2[i][j]);
       printf("\n");
    }
   return 0;
}

望采纳