解题思路:

注意事项:

参考代码:

#include <stdio.h>

#include <stdlib.h>


#define MAX_N 10000


// 邻接表节点结构体

typedef struct Node {

    int val;

    struct Node *next;

} Node;


// 邻接表头结构体

typedef struct AdjList {

    Node *head;

} AdjList;


// 图结构体,这里用它来表示树结构

typedef struct Graph {

    AdjList *array;

} Graph;


// 创建邻接表节点

Node *createNode(int v) {

    Node *newNode = (Node *)malloc(sizeof(Node));

    newNode->val = v;

    newNode->next = NULL;

    return newNode;

}


// 创建图(树)

Graph *createGraph(int n) {

    Graph *graph = (Graph *)malloc(sizeof(Graph));

    graph->array = (AdjList *)malloc((n + 1) * sizeof(AdjList));

    for (int i = 1; i <= n; i++) {

        graph->array[i].head = NULL;

    }

    return graph;

}


// 添加边,构建树的结构,这里是有向边(从u指向v)

void addEdge(Graph *graph, int u, int v) {

    Node *newNode = createNode(v);

    newNode->next = graph->array[u].head;

    graph->array[u].head = newNode;

}


// 释放邻接表节点内存

void freeList(Node *node) {

    Node *next;

    while (node!= NULL) {

        next = node->next;

        free(node);

        node = next;

    }

}


// 释放整个图(树)的邻接表内存

void freeGraph(Graph *graph, int n) {

    for (int i = 1; i <= n; i++) {

        freeList(graph->array[i].head);

    }

    free(graph->array);

    free(graph);

}


int main() {

    int n;

    scanf("%d", &n);

    Graph *graph = createGraph(n);

    // 构建树结构,这里简单按照输入边的方式,假设输入n-1条边

    for (int i = 0; i < n - 1; i++) {

        int u, v;

        scanf("%d %d", &u, &v);

        addEdge(graph, u, v);

    }


    // 按照要求输出每个节点的相关信息

    for (int i = 1; i <= n; i++) {

        Node *temp = graph->array[i].head;

        int son_count = 0;

        while (temp!= NULL) {

            son_count++;

            temp = temp->next;

        }

        printf("%d %d", i, son_count);

        temp = graph->array[i].head;

        while (temp!= NULL) {

            printf(" %d", temp->val);

            temp = temp->next;

        }

        printf("\n");

    }


    freeGraph(graph, n);

    return 0;

}


点赞(1)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论