![](https://img-blog.csdnimg.cn/img_convert/7db1be574b875176ab2fe3cbefe97295.png)
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<algorithm>
using namespace std;
//插入节点的结构体,数据是节点出度的各个节点
typedef struct node
{
int data;
struct node* next;
}NODE;
//图结构体,储存的是每个节点的first指针
typedef struct gragh
{
NODE* head[100]; //head[i]储存的是指向node类型的指针
}GRAGH;
//进行插入操作的函数
NODE* Insert(NODE* head, int y); //返回first头指针,y是下一个节点表示的序号
void Delete(NODE* head); //释放内存
int main(void)
{
GRAGH* gragh = new GRAGH;
int n, m; //n个节点,m条边
cin >> n >> m;
int begin, end; //从哪指向哪
//初始化
for (int i = 1; i <= n; i++)
gragh->head[i] = NULL;
//输入,插入数据
for (int i = 1; i <= m; i++)
{
cin >> begin >> end;
gragh->head[begin] = Insert(gragh->head[begin], end);
}
//打印
for (int i = 1; i <= n; i++)
{
if (gragh->head[i] == NULL) continue; //为空,即没有出度,就继续进行下一个节点
cout << i;//第i个节点
//p用于遍历的指针
for (const NODE* p = gragh->head[i]; p != NULL; p = p->next)
cout << "->" << p->data;
cout << endl;
}
//delete
for (int i = 1; i <= n; i++)
Delete(gragh->head[i]);
return 0;
}
NODE* Insert(NODE* head, int y)
{
NODE* node = new NODE;
node->data = y;
if (head == NULL)
{
head = node; //前一个节点 <- 新节点(head)
head->next = NULL;
return head;
}
node->next = head;
head = node;
return head;
}
void Delete(NODE* head)
{
if (head == NULL) return;
NODE* p = head;
while (p != NULL)
{
NODE* temp = p;
p = p->next;
delete temp;
}
}