69,382
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#define MAXNODE 10
typedef struct {
int adj;
}Arctype;//边的权值
typedef struct {
char a[MAXNODE];
Arctype b[MAXNODE][MAXNODE];
int vexnum,arcnum;
}Graphtype; //邻接矩阵
typedef struct node {
int weight;
int vex;
struct node *next;
}Arc; //邻接表的链表结点
typedef struct {
char data;
Arc *firstarc;
}VertexType; //链式顺序表的结点
typedef struct {
VertexType a[MAXNODE];
int vexnum,arcnum;
}Adjlist; //链式顺序表
int locategraph(Graphtype p,char v) //求邻接矩阵的某个字符位置
{
int i=-1,j;
for(j=0;j<p.vexnum;j++)
if(p.a[j]==v)
{
i=j;
break;
}
return i;
}
int FirstAdjvex(Graphtype *p,char v)
{
int i,j;
i=locategraph(*p,v);
for(j=0;j<p->vexnum;j++)
if(p->b[i][j].adj!=0&&p->b[i][j].adj!=INT_MAX) break;
if(j=p->vexnum)
return -1;
else return j;
}
int NextAdjvex(Graphtype *p,char v,int w)
{
int i,j;
i=locategraph(*p,v);
for(j=w;j<p->vexnum;j++)
if(p->b[i][j].adj!=0&&p->b[i][j].adj!=INT_MAX) break;
if(j=p->vexnum)
return -1;
else return j;
}
void creatDN(Graphtype * &p) //邻接矩阵的创建过程
{
int i,j,weight,k;
char v1,v2;
scanf("%d%d",&p->vexnum,&p->arcnum);
for(i=0;i<MAXNODE;i++) //图的每条边进行初始化
for(j=0;j<MAXNODE&&j!=i;j++)
p->b[i][j].adj=INT_MAX;
for(i=0;i<MAXNODE;i++)
p->b[i][i].adj=0;
for(i=0;i<p->vexnum;i++) //输入对应结点代表的字符
scanf("%c",&p->a[i]);
for(k=0;k<p->vexnum;k++) //输入权值,创建图
{
scanf("%c%c%d",&v1,&v2,&weight);
i=locategraph(*p,v1);
j=locategraph(*p,v2);
p->b[i][j].adj=weight;
}
}
void creatUDN(Adjlist *&q,Graphtype *p) //创建邻接表
{
int i,j,k;
int v1,v2;
int n,e;
Arc *x,*y;
n=p->vexnum;
e=p->arcnum;
for(k=0;k<n;k++)
{
scanf("%d",&q->a[k].data);
q->a[k].firstarc=NULL;
}
printf("请输入边:");
for(i=0;i<e;i++)
{
scanf("%d%d",&v1,&v2);
i=locategraph(*p,v1);
j=locategraph(*p,v2);
x=(Arc *)malloc(sizeof(Arc));
x->vex=i;
x->next=q->a[i].firstarc;
q->a[i].firstarc=x;
y=(Arc *)malloc(sizeof(Arc));
y->vex=i;
y->next=q->a[i].firstarc;
q->a[i].firstarc=y;
}
}
void DepthFirstSearch(Adjlist *q,Graphtype *p,int v,int visited[]) //深度遍历
{
int w;
printf("%d ",p->a[v]);
visited[v]=1;
w=FirstAdjvex(p,p->a[v]);
while(w!=-1)
{
if(!visited[w])
DepthFirstSearch(q,p,w,visited);
w=NextAdjvex(p,p->a[v],w);
}
}
int main ()
{
Graphtype *p;
Adjlist *q;
int visited[p->vexnum],v;
for(int i=0;i<p->vexnum;i++)
visited[i]=0;
creatDN(p);
creatUDN(q,p);
for(v=0;v<p->vexnum;v++)
if(!visited[v]) DepthFirstSearch(q,p,v,visited);
}