7-2 邻接表存储实现有向网构建
编程实现:以邻接表的存储方式,创建一个有向网,顶点为字符型。
输入格式:
第一行输入顶点个数和边的个数,中间用空格分开。下一行开始依次输入顶点,空格或回车分开。接着依次输入边依附的两个顶点和权值,空格分开。
输出格式:
若数据合理,则输出对应的邻接表形式,见样例,邻接点下标与权值空格分开。若顶点个数为0,则输出"error"。若顶点个数为1,边个数不合理,则输出"error"
输入样例:
在这里给出一组输入。例如:
4 4
a b c d
a b 1
a c 1
c d 1
d a 1
输出样例:
在这里给出相应的输出。例如:
a->2 1->1 1
b
c->3 1
d->0 1
#include<iostream>
using namespace std;typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode {//邻接点int AdjV;//邻接点的下标int quan;struct AdjVNode* Next;//指向下一个邻接点的指针
};typedef struct Vnode {//顶点表头结点定义struct AdjVNode* FirstEdge;char data;//值
}AdjList[50];typedef struct GNode *PtrToGNode;
struct GNode {int v;//顶点数int e;//边数AdjList G;//邻接表
};
typedef PtrToGNode LGraph;int LocateVex(LGraph &G, char v)
{for (int i = 0; i < G->v; i++){if (v == G->G[i].data) {return i;}}
}int CreateGraph(LGraph G)
{cin >> G->v >> G->e;if (G->v == 0 || G->v == 1) {cout << "error";return 0;}for (int i = 0; i < G->v; i++){cin >> G->G[i].data;G->G[i].FirstEdge= NULL;}for (int k = 0; k < G->e; k++){char v1, v2;int quan;cin >> v1 >> v2 >> quan;int i = LocateVex(G, v1);int j = LocateVex(G, v2);PtrToAdjVNode p1 = new AdjVNode;p1->AdjV = j;//p1的下标为jp1->Next = G->G[i].FirstEdge;//头插法G->G[i].FirstEdge = p1;G->G[i].FirstEdge->quan = quan;}
}void print(LGraph G)
{for (int i = 0; i < G->v; i++){cout << G->G[i].data;PtrToAdjVNode p2 = new AdjVNode;p2 = G->G[i].FirstEdge;while (p2){cout << "->" << p2->AdjV << " " << p2->quan;p2 = p2->Next;}cout << endl;}
}int main()
{LGraph G =new GNode;CreateGraph(G);print(G);return 0;
}