图综合练习--构建邻接表
程序员文章站
2022-05-21 16:14:43
...
图综合练习–构建邻接表
题目描述
已知一有向图,构建该图对应的邻接表。
邻接表包含数组和单链表两种数据结构,其中每个数组元素也是单链表的头结点,数组元素包含两个属性,属性一是顶点编号info,属性二是指针域next指向与它相连的顶点信息。
单链表的每个结点也包含两个属性,属性一是顶点在数组的位置下标,属性二是指针域next指向下一个结点。
输入
第1行输入整数t,表示有t个图
第2行输入n和k,表示该图有n个顶点和k条弧。
第3行输入n个顶点。
第4行起输入k条弧的起点和终点,连续输入k行
以此类推输入下一个图
输出
输出每个图的邻接表,每行输出格式:数组下标 顶点编号-连接顶点下标-…-^,数组下标从0开始。
具体格式请参考样例数据,每行最后加入“^”表示NULL。
样例输入
1
5 7
A B C D E
A B
A D
A E
B D
C B
C E
E D
样例输出
0 A-1-3-4-^
1 B-3-^
2 C-1-4-^
3 D-^
4 E-3-^
#include <iostream>
using namespace std;
class Node{
int pos;
Node *next;
public:
Node():next(NULL){}
Node(int position):pos(position),next(NULL){}
friend class AdjList;
};
class AdjList{
int vexNum;
int arcNum;
char *vex;
Node *heads;
int Index(char c);
public:
AdjList();
~AdjList();
void outPut();
};
AdjList::AdjList() {
cin>>vexNum>>arcNum;
vex = new char[vexNum];
for(int i=0;i<vexNum;i++)
cin>>vex[i];
heads = new Node[vexNum];
for(int i=0;i<arcNum;i++)
{
char c1,c2;
cin>>c1>>c2;
int num1=Index(c1),num2=Index(c2);
Node *p = &heads[num1];
while (p->next)
p=p->next;
Node *s = new Node;
s->pos=num2;
p->next = s;
}
}
AdjList::~AdjList() {
delete []vex;
for(int i=0;i<vexNum;i++) {
Node *p = heads[i].next;
while (p)
{
Node *q = p;
p = p->next;
delete q;
}
}
delete []heads;
}
int AdjList::Index(char c) {
for(int i=0;i<vexNum;i++)
if(c==vex[i])
return i;
return -1;
}
void AdjList::outPut() {
for(int i=0;i<vexNum;i++)
{
cout<<i<<' '<<vex[i];
Node *p = heads[i].next;
while (p)
{
cout<<'-'<<p->pos;
p=p->next;
}
cout<<"-^"<<endl;
}
}
int main()
{
int t;
cin>>t;
while (t--)
{
AdjList myAdjList;
myAdjList.outPut();
}
return 0;
}
上一篇: 利用Github自建的个人博客空间
下一篇: 算法题:搜索二维矩阵 II