c语言数据结构--图(社交网络)与二叉树查找问题

c语言数据结构--好友推荐算法--图(社交网络)与二叉树查找问题
已经有下列函数及代码,请帮忙完善或者修改一下,来实现以上功能。


#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;
}


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

#define MAXN 10

// 定义结构体存储个人信息
typedef struct person_information
{
    char name[20];
    int age;
    char job[20];
    char friends[20];
    char pinyin[20];
} temp, person[MAXN];

// 定义二叉树结构体
typedef struct BiTreeNode
{
    struct BiTreeNode* left;
    struct BiTreeNode* right;
    person data;
} BTNode;

// 创建一个新的二叉树结点
BTNode* CreateBTreeNode(person x)
{
    BTNode* node = (BTNode*)malloc(sizeof(BTNode));
    node->data = x;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// 将一个新的结点插入到二叉排序树中
void insertNode(BTNode** root, BTNode* newNode)
{
    // 如果二叉树为空,则直接将新结点作为根结点
    if (*root == NULL)
    {
        *root = newNode;
        return;
    }

    // 当前结点
    BTNode* curr = *root;

    // 循环找到要插入的位置
    while (1)
    {
        // 新结点的拼音首字母小于当前结点的拼音首字母,则将新结点插入到当前结点的左子树
        if (strcmp(newNode->data.pinyin, curr->data.pinyin) < 0)
        {
            // 如果当前结点的左子树为空,则将新结点插入到当前结点的左子树
            if (curr->left == NULL)
            {
                curr->left = newNode;
                break;
            }
            // 否则,继续向左遍历
            else
            {
                curr = curr->left;
            }
        }
        // 新结点的拼音首字母大于当前结点的拼音首字母,则将新结点插入到当前结点的右子树
        else
        {
        // 如果当前结点的右子树为空,则将新结点插入到当前结点的右子树
        if (curr->right == NULL)
        {
        curr->right = newNode;
        break;
        }
        // 否则,继续向右遍历
        else
        {
                curr = curr->right;
        }
        }
}
}

// 在二叉排序树中查找给定姓名的结点
BTNode* searchNode(BTNode* root, char* name)
{
// 如果二叉树为空,则返回NULL
if (root == NULL)
{
return NULL;
}
// 当前结点
BTNode* curr = root;

// 循环查找
while (1)
{
    // 如果当前结点的姓名与查找的姓名相同,则返回当前结点
    if (strcmp(curr->data.name, name) == 0)
    {
        return curr;
    }
    // 如果当前结点的姓名小于查找的姓名,则向右遍历
    else if (strcmp(curr->data.name, name) < 0)
    {
        curr = curr->right;
    }
    // 否则,向左遍历
    else
    {
        curr = curr->left;
    }

    // 如果遍历完了整棵树都没有找到,则返回NULL
    if (curr == NULL)
    {
        return NULL;
    }
}
}
// 查找某个人的所有好友,并将这些好友的信息存储在数组friends中
void findFriends(BTNode* root, char* name, temp* friends)
{
// 先查找该人的结点
BTNode* node = searchNode(root, name);
if (node == NULL)
{
printf("找不到该人!\n");
return;
}
// 将该人的好友列表以逗号分隔的形式存储在字符串数组中
char* friendList[MAXN];
int count = 0;
char* p = strtok(node->data.friends, ",");
while (p != NULL)
{
    friendList[count++] = p;
    p = strtok(NULL, ",");
}

// 遍历该人的好友列表,并在二叉树中查找好友的信息
for (int i = 0; i < count; i++)
{
    BTNode* friendNode= searchNode(root, friendList[i]);
if (friendNode == NULL)
{
printf("找不到%s这个人!\n", friendList[i]);
continue;
}
friends[i] = friendNode->data;
}
}

// 判断两个人是否互为好友
int isFriend(BTNode* root, char* name1, char* name2)
{
// 先查找两个人的结点
BTNode* node1 = searchNode(root, name1);
BTNode* node2 = searchNode(root, name2);
if (node1 == NULL || node2 == NULL)
{
printf("找不到某个人!\n");
return 0;
}
// 将两个人的好友列表以逗号分隔的形式存储在字符串数组中
char* friendList1[MAXN];
int count1 = 0;
char* p = strtok(node1->data.friends, ",");
while (p != NULL)
{
    friendList1[count1++] = p;
    p = strtok(NULL, ",");
}
char* friendList2[MAXN];
int count2 = 0;
p = strtok(node2->data.friends, ",");
while (p != NULL)
{
    friendList2[count2++] = p;
    p = strtok(NULL, ",");
}

// 遍历两个人的好友列表,判断是否有互为好友的
for (int i = 0; i < count1; i++)
{
    for (int j = 0; j < count2; j++)
    {
        if (strcmp(friendList1[i], friendList2[j]) == 0)
        {
            return 1;
        }
    }
}

// 如果两个人的好友列表中都没有对方,则两个人不是好友
return 0;
}

// 根据好友推荐算法推荐新的好友
void recommendFriend(BTNode* root, char* name)
{
// 先查找该人的结点
BTNode* node = searchNode(root, name);
if (node == NULL)
{
printf("找不到该人!\n");
return;
}
// 将该人的好友列表以逗号分隔的形式存储在字符串数组中
char* friendList[MAXN];
int count = 0;
char* p = strtok(node->data.friends, ",");
while (p != NULL)
{
    friendList[count++] = p;
    p = strtok(NULL, ",");
}

// 遍历该人的好友列表,找出和对方互为好友的人
for (int i = 0; i < count; i++)
{
    // 先查找这个好友的结点
    BTNode* friendNode = searchNode(root, friendList[i]);
    if (friendNode == NULL)
    {
        printf("找不到%s这个人!\n", friendList[i]);
        continue;
    }

    // 将这个好友的好友列表以逗号分隔的形式存储在字符串数组中
    char* friendList2[MAXN];
    int count2 = 0;
    p = strtok(friendNode->data.friends, ",");
    while (p != NULL)
    {
        friendList2[count2++] = p;
        p = strtok(NULL, ",");
    }

    // 遍历该好友的好友列表,找出和对方互为好友的人
    for (int j = 0; j < count2; j++)
    {
        if (isFriend(root, name, friendList2[j]) == 0)
        {
            printf("推荐%s加%s为好友!\n", name, friendList2[j]);
        }
    }
}
}

int main()
{
// 创建二叉排序树
BTNode* root = NULL;
insert(root, temp1);
insert(root, temp2);
insert(root, temp3);
insert(root, temp4);
insert(root, temp5);
insert(root, temp6);
insert(root, temp7);
insert(root, temp8);
insert(root, temp9);
insert(root, temp10);
// 测试查找
temp t = search(root, "李四");
printf("%s %d %s %s\n", t.name, t.age, t.job, t.friends);

// 测试推荐好友
recommendFriend(root, "张三");

return 0;
}

可以联系我

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632