题目描述
已知一有向图,构建该图对应的邻接表。
邻接表包含数组和单链表两种数据结构,其中每个数组元素也是单链表的头结点,数组元素包含两个属性,属性一是顶点编号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在表中的adjvex
for(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;
}