新人求教,关于建立图的临接表算法?该如何处理
新人求教,关于建立图的临接表算法??
#include"stdio.h"
#include"stdlib.h"
#define MAX_vertex_num 100
int visited[MAX_vertex_num];
typedef struct arcnode{
int adjvex;
arcnode * nextarc;
}arcnode,*arcc;
typedef struct vexnode{
char data;
arcnode *firstarc;
}vexnode;
typedef vexnode Adjlist[MAX_vertex_num];
typedef struct graph{
int vexnum;
int arcnum;
Adjlist adjlist;
}graph,*graphh;
int creategraph(graph *g){
printf("建立无向图:\n");
printf("输入顶点数和边数:\n");
scanf("%d%d",&g->vexnum,&g->arcnum);
printf("建立节点表:\n");
for(int k=0;k<g->vexnum;k++){
g->adjlist[k].data=getchar();//为什么这里循环的次数和g->vexnum的次数不同,我输入的节点
是6个,但是执行了3次就跳除了循环???
g->adjlist[k].firstarc=0;
}
printf("建立边表:\n");
int m,n;
arcnode *s;
for(int q=0;q<g->arcnum;q++){
printf("输入有序对:\n");
scanf("%d",&n);
scanf("%d",&m);
s=(arcnode *)malloc(sizeof(arcnode));
s->adjvex=n;
s->nextarc=g->adjlist[m].firstarc;
g->adjlist[m].firstarc=s;
s->adjvex=m;
s->nextarc=g->adjlist[n].firstarc;
g->adjlist[n].firstarc=s;
}
return 0;
}
void DFS(graph *g,int i){
visited[i]=1;
printf(" %c ",g->adjlist[i].data);
arcc s;
for(s=g->adjlist[i].firstarc;s!=0;s=s->nextarc){
if(visited[s->adjvex]!=1)DFS(g,s->adjvex);
}
}
int main(){
graph *g;
g=(graph *)malloc(sizeof(graph));
creategraph(g);
for(int i=0;i<g->vexnum;i++)visited[i]=0;
for( i=0;i<g->vexnum;i++){
if(visited[i]!=1)DFS(g,i);
}
return 0;
}
------解决方案--------------------
也可以直接输入例如abcdef
creategraph(graphh &g)是C++中里面的应用 不要搞混 你拿VC++编辑器写C程序 却和C++混了
数组不要,指针没有指向的时候需要
#include"stdio.h"
#include"stdlib.h"
#define MAX_vertex_num 100
int visited[MAX_vertex_num];
typedef struct arcnode{
int adjvex;
arcnode * nextarc;
}arcnode,*arcc;
typedef struct vexnode{
char data;
arcnode *firstarc;
}vexnode;
typedef vexnode Adjlist[MAX_vertex_num];
typedef struct graph{
int vexnum;
int arcnum;
Adjlist adjlist;
}graph,*graphh;
int creategraph(graph *g){
printf("建立无向图:\n");
printf("输入顶点数和边数:\n");
scanf("%d%d",&g->vexnum,&g->arcnum);
printf("建立节点表:\n");
for(int k=0;k<g->vexnum;k++){
g->adjlist[k].data=getchar();//为什么这里循环的次数和g->vexnum的次数不同,我输入的节点
是6个,但是执行了3次就跳除了循环???
g->adjlist[k].firstarc=0;
}
printf("建立边表:\n");
int m,n;
arcnode *s;
for(int q=0;q<g->arcnum;q++){
printf("输入有序对:\n");
scanf("%d",&n);
scanf("%d",&m);
s=(arcnode *)malloc(sizeof(arcnode));
s->adjvex=n;
s->nextarc=g->adjlist[m].firstarc;
g->adjlist[m].firstarc=s;
s->adjvex=m;
s->nextarc=g->adjlist[n].firstarc;
g->adjlist[n].firstarc=s;
}
return 0;
}
void DFS(graph *g,int i){
visited[i]=1;
printf(" %c ",g->adjlist[i].data);
arcc s;
for(s=g->adjlist[i].firstarc;s!=0;s=s->nextarc){
if(visited[s->adjvex]!=1)DFS(g,s->adjvex);
}
}
int main(){
graph *g;
g=(graph *)malloc(sizeof(graph));
creategraph(g);
for(int i=0;i<g->vexnum;i++)visited[i]=0;
for( i=0;i<g->vexnum;i++){
if(visited[i]!=1)DFS(g,i);
}
return 0;
}
------解决方案--------------------
也可以直接输入例如abcdef
creategraph(graphh &g)是C++中里面的应用 不要搞混 你拿VC++编辑器写C程序 却和C++混了
数组不要,指针没有指向的时候需要