#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 80
typedef struct arcnode{
int adjvex;
int weight;
struct arcnode *next;
}arcnode;
typedef struct vertexnode{
char s[max];
arcnode *firstedge;
}vertexnode;
typedef struct algraph{
vertexnode adjlist[max];
int vertexnum,arcnum;
}algraph;
void crt(algraph *G){
scanf("%d %d",&G->vertexnum,&G->arcnum);
getchar();
int i=0,weight;
char s1[max],s2[max];
for(i=0;i<G->vertexnum;i++){
scanf("%s",G->adjlist[i].s);
G->adjlist[i].firstedge=NULL;
}
int j=0,m=0,n=0;
arcnode *p=NULL;
for(i=0;i<G->arcnum;i++){
scanf("%s %s %d",s1,s2,&weight);
for(j=0;j<G->vertexnum;j++){
if(strcmp(G->adjlist[j].s,s1)==0)m=j;
if(strcmp(G->adjlist[j].s,s2)==0)n=j;
}
p=G->adjlist[m].firstedge;
if(p==NULL){
G->adjlist[m].firstedge=(arcnode*)malloc(sizeof(arcnode));
G->adjlist[m].firstedge->adjvex=n;
G->adjlist[m].firstedge->weight=weight;
G->adjlist[m].firstedge->next=NULL;
continue;
}
while(p->next)p=p->next;
p->next=(arcnode*)malloc(sizeof(arcnode));
p->next->adjvex=n;
p->next->weight=weight;
p->next->next=NULL;
}
}
void output(algraph *G){
int i=0;
arcnode *p=NULL;
for(i=0;i<G->vertexnum;i++){
p=G->adjlist[i].firstedge;
printf("%s->",G->adjlist[i].s);
while(p){
printf("%s ",G->adjlist[p->adjvex].s);
p=p->next;
}
putchar('\n');
}
}
void DFS(algraph G,char str[],int visited[]){
int i=0,v = 0;
for(i=0;i<G.vertexnum;i++){
if(strcmp(G.adjlist[i].s,str)==0){
v=i;
break;
}
}
printf("%s ",G.adjlist[v].s);
visited[v]=1;
arcnode *p=G.adjlist[v].firstedge;
while(p){
int j=p->adjvex;
if(visited[j]==0)DFS(G,G.adjlist[j].s,visited);
p=p->next;
}
}
void BFS(algraph G,char str[],int visited[]){
int i=0,v;
for(i=0;;i++){
if(strcmp(G.adjlist[i].s,str)==0){
v=i;
break;
}
}
if(visited[v]==0){
printf("%s ",G.adjlist[v].s);
visited[v]=1;
}
arcnode *p=G.adjlist[v].firstedge;
while(p){
int j=p->adjvex;
if(visited[j]==0){
printf("%s ",G.adjlist[j].s);
visited[j]=1;
}
p=p->next;
}
p=G.adjlist[v].firstedge;
while(p){
BFS(G,G.adjlist[p->adjvex].s,visited);
p=p->next;
}
}
int convert(algraph G,char str[][max]){
arcnode *p=NULL;
int i=0;
for(i=0;i<G.vertexnum;i++){
p=G.adjlist[i].firstedge;
while(p){
str[i][p->adjvex]=p->weight;
p=p->next;
}
}
return G.vertexnum;
}
int main(){
char ch,str[max],str1[max][max];
int visited[max];
algraph G;
while(1){
ch=getchar();
switch(ch){
case 'c':
crt(&G);
break;
case 'o':
output(&G);
break;
case 'd':
getchar();
for(int i=0;i<max;i++){
visited[i]=0;
}
scanf("%s",str);
DFS(G,str,visited);
putchar('\n');
break;
case 'b':
getchar();
for(int i=0;i<max;i++){
visited[i]=0;
}
scanf("%s",str);
BFS(G,str,visited);
putchar('\n');
break;
case 'p':
getchar();
int n=convert(G,str1);
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
str1[j][k]=0;
convert(G,str1);
for(int j=0;j<n;j++){
for(int k=0;k<n;k++)printf("%5d",str1[j][k]);
putchar('\n');
}
break;
case 'q':
printf("程序退出\n");
exit(0);
}
}
return 0;
}
【问题描述】
带权有向图(连通或不连通都要支持)采用邻接表进行存储,图中顶点的类型为字符串,完成以下操作:
1.创建图的邻接表
2.输出图的邻接表
3.从指定的源点出发进行深度优先遍历
4.从指定的源点出发进行广度优先遍历
5.将邻接标转换为邻接矩阵,并输出