题目描述
已知一有向图,构建该图对应的邻接表。
邻接表包含数组和单链表两种数据结构,其中每个数组元素也是单链表的头结点,数组元素包含两个属性,属性一是顶点编号info,属性二是指针域next指向与它相连的顶点信息。
单链表的每个结点也包含两个属性,属性一是顶点在数组的位置下标,属性二是指针域next指向下一个结点。
输入
第1行输入整数t,表示有t个图
第2行输入n和k,表示该图有n个顶点和k条弧。
第3行输入n个顶点。
第4行起输入k条弧的起点和终点,连续输入k行
以此类推输入下一个图
输入样例:
1
5 7
A B C D E
A B
A D
A E
B D
C B
C E
E D
输出
输出每个图的邻接表,每行输出格式:数组下标 顶点编号-连接顶点下标-......-^,数组下标从0开始。
具体格式请参考样例数据,每行最后加入“^”表示NULL。
输出样例:
0 A-1-3-4-^
1 B-3-^
2 C-1-4-^
3 D-^
4 E-3-^
代码
#include <iostream>
using namespace std;struct Node{ //表中结点int adjvex;Node *next=NULL; //必要
};struct Header{ //表头char info;Node *next=NULL;
};class List{
public:int n,k;Header *Array;List(){cin >> n >> k;Array = new Header[n];}void create(){for(int i = 0; i < n; i++){cin >> Array[i].info;}char c1,c2;int v=0; //标记处理的顶点for(int i = 0; i < k; i++){cin >> c1 >> c2;while(Array[v].info != c1){v++;}Node *t = new Node;t->adjvex = getIndex(c2);if(Array[v].next == NULL){ //当表头next为空时Array[v].next = t;}else{ //不为空Node *s = Array[v].next;while(s->next != NULL){s = s->next;}s->next = t;}}}int getIndex(char c){ //获取c2在表中的adjvexfor(int i = 0; i < n; i++){if(Array[i].info == c){return i;}}}void toPrint(){for(int i = 0; i < n; i++){cout << i << " " << Array[i].info << "-";Node *s = Array[i].next;while(s != NULL){cout << s->adjvex << "-";s = s->next;}cout << "^" << endl;}}
};int main()
{int t;cin >> t;while(t--){List list;list.create();list.toPrint();}return 0;
}