思考(当然参考到大神的啦)加写(中间看了会前端放松一下),差不多一天就过去了,其中毫无bug却运行不出最终的结果,debug不好搞啊!!最后附上结果还有一张图,还有用邻接矩阵输入写的,思想是理解了 ,实现好难啊!!
#include<stdio.h>
#include<stdlib.h>
#define max 100
typedef int tex;
typedef struct ArcNODE//定义边表结点
{
int adjvex;//该狐所指的顶点的位置
int weight;//边的权重
struct ArcNODE *next;//指向下一条狐的指针
}ArcNODE;
typedef struct VNODE//定义顶点表结点
{
int date;//顶点信息
ArcNODE *first;//指向第一条依附于该顶点的狐的指针
}VNODE,Adlist[max];
typedef struct Graph //定义图
{
int vnum,arcnum;//定义顶点和狐数的个数
Adlist vertices;
}Graph;
int visited[max];
void visit(Graph G,int v);
void create(Graph *G);
void out(Graph G);
void DFS(Graph G,int v);
void DFStravel(Graph G);
int first(Graph G,int v);
int next(Graph G,int v,int w);
int main()
{
Graph G;
create(&G);
out(G);
DFStravel(G);
return 0;
}
void create(Graph *G)
{
int i,j;
ArcNODE *arcNODE=NULL;
tex oo,pp,kk;//oo代表狐的尾,pp代表头,kk代表权
printf("请输入顶点和边结点的个数:\n");
scanf("%d %d",&G->vnum,&G->arcnum);
for(i=0;i<G->vnum;i++)
{
printf("请输入第%d顶点的的值 ",i+1);
scanf("%d",&G->vertices[i].date);
G->vertices[i].first=NULL;
printf("\n");
}
printf("请依次输入狐的尾,头,权重,用逗号隔开\n");
for(j=0;j<G->arcnum;j++)
{
printf("第%d条边",j);
scanf("%d,%d,%d",&oo,&pp,&kk);
arcNODE=(ArcNODE *)malloc(sizeof(ArcNODE));
arcNODE->adjvex=pp;
arcNODE->next=G->vertices[oo].first;
arcNODE->weight=kk;
G->vertices[oo].first=arcNODE;
//因为无向图是双向的
arcNODE=(ArcNODE *)malloc(sizeof(ArcNODE));//不可省啊!!!!!!!
arcNODE->adjvex=oo;
arcNODE->next=G->vertices[pp].first;
arcNODE->weight=kk;
G->vertices[pp].first=arcNODE;
}
}
void out(Graph G)
{
int i;
for(i=0;i<G.vnum;i++)
{
ArcNODE *arcnode=G.vertices[i].first;
printf("%d \t",G.vertices[i].date);
while(arcnode)
{
printf("%d %d ",arcnode->adjvex,arcnode->weight);
arcnode=arcnode->next;
}
printf("\n");
}
}
void DFStravel(Graph G)
{
int v;
for(v=0;v<G.vnum;v++)
visited[v]=0;//标记顶点
printf("\n该图的深度优先顺序如下:\n");
for(v=0;v<G.vnum;v++)
{
if(visited[v]==0)//标记顶点 跟104行做对应
DFS(G,v);
}
}
void DFS(Graph G,int v)
{
visit(G,v);//输出遍历的顶点
visited[v]=1;//对遍历过的顶点进行赋值为1;
//进行递归
for(int w=first(G,v);w>=0;w=next(G,v,w))
{
if(!visited[w])
DFS(G,w);//用递归
}
}
void visit(Graph G,int v)
{
printf("%d ",G.vertices[v].date );
}
int first(Graph G,int v)//V第一个邻接点对应的位置序号
{
if(G.vertices[v].first==NULL)
return -1;
return G.vertices[v].first->adjvex;
}
int next(Graph G,int v,int w)// 除了V以外第一个邻接点对应的位置序号
{
ArcNODE *p=G.vertices[v].first;
while(p!=NULL&&p->adjvex!=w)
{
p=p->next;
}
if(p==NULL||p->next==NULL)
return -1;
return p->next->adjvex;
}