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> #include<cstdio> using namespace std; const int N=1010; struct arc{ int e; arc* next; int w; }; struct { int n,m; char vers[N]; arc arcs[N]; }gra; int find(char c){ for(int i=0;i<gra.n;i++){ if(gra.vers[i]==c){ return i; } } return -1; } void add(int u,int v,int w){ arc* p=new arc(); p->e=v; p->next=gra.arcs[u].next; p->w=w; gra.arcs[u].next=p; } void add(char x,char y,int w){ int u=find(x),v=find(y); if(~u&&~v){ add(u,v,w); } else{ cout<<"error"; exit(0); } } int main(){ cin>>gra.n>>gra.m; if(gra.n==0||gra.n==1&&gra.m>1){ cout<<"error"; return 0; } for(int i=0;i<gra.n;i++){ cin>>gra.vers[i]; } for(int i=0;i<gra.m;i++){ char u,v; int w; cin>>u>>v>>w; add(u,v,w); } for(int i=0;i<gra.n;i++){ cout<<gra.vers[i]; arc* p=gra.arcs[i].next; while(p!=NULL){ cout<<"->"<<p->e<<' '<<p->w; p=p->next; } if(i!=gra.n-1) cout<<endl; } return 0; }