题目描述
已知一有向图,构建该图对应的邻接表。
邻接表包含数组和单链表两种数据结构,其中每个数组元素也是单链表的头结点,数组元素包含两个属性,属性一是顶点编号info,属性二是指针域next指向与它相连的顶点信息。
单链表的每个结点也包含两个属性,属性一是顶点在数组的位置下标,属性二是指针域next指向下一个结点。
输入
第1行输入整数t,表示有t个图
第2行输入n和k,表示该图有n个顶点和k条弧。
第3行输入n个顶点。
第4行起输入k条弧的起点和终点,连续输入k行
以此类推输入下一个图
输出
输出每个图的邻接表,每行输出格式:数组下标 顶点编号-连接顶点下标-......-^,数组下标从0开始。
具体格式请参考样例数据,每行最后加入“^”表示NULL。
输入输出样例
输入样例1 <-复制
1
5 7
A B C D E
A B
A D
A E
B D
C B
C E
E D
输出样例1
0 A-1-3-4-^
1 B-3-^
2 C-1-4-^
3 D-^
4 E-3-^
AC代码
#include<iostream>
using namespace std;
struct wei
{
char data;
wei* nextwei=NULL;
};
struct shou
{
char data;
shou* nextshou=NULL;
wei* nextwei=NULL;
};
shou* head = new shou;
void createshou(int n)
{
shou *p = head;
while (n--)
{
shou* s = new shou;
cin >> s->data;
p->nextshou = s;
p = s;
}
}
char biao(int b)
{
shou *p = head->nextshou;
int shu = 0;
while (p)
{
if (p->data == b)
return shu+'0';
shu++;
p = p->nextshou;
}
}
void createwei(int k)
{
shou *p = head->nextshou;
wei *w = p->nextwei;
char a, b;
while (k--)
{
cin >> a >> b;
while (a != p->data)
{
p = p->nextshou;
w = p->nextwei;
}
if (p->nextwei == NULL)
{
w = new wei;
w->data = biao(b);
p->nextwei = w;
}
else
{
wei *s = new wei;
s->data = biao(b);
w->nextwei = s;
w = s;
}
}
}
void show()
{
int hao = 0;
shou *p = head->nextshou;
while (p)
{
cout << hao << " "<<p->data<<"-";
hao++;
wei *w = p->nextwei;
while (w)
{
cout << w->data << "-";
w = w->nextwei;
}
cout << "^" << endl;
p = p->nextshou;
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
int i;
createshou(n);
createwei(k);
show();
}
}
(by 归忆)