# 图的基本操作

170人阅读 评论(0)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>
#include<queue>

using namespace std;

#define Max 20

int visited[Max]={0};
int indegree[Max]={0};
typedef struct ArcNode
{
struct ArcNode *nextarc;
}ArcNode;

typedef struct
{
char date;
ArcNode *firstarc;

typedef struct
{
int vexnum,arcnum;
}AlGraph;

int Located(AlGraph &G,char v)
{
int i,k=-1;
for(i=0;i<G.vexnum;i++)
if(v==G.vertices[i].date)
{
k=i;
break;
}
return k;
}

void Creat_Graph(AlGraph &G)
{
int i,j,k;
int la,lb;
char V1,V2;
ArcNode *p,*s;
printf("输入图的顶点以及边的个数\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入图的顶点信息\n");
for(i=0;i<G.vexnum;i++)
{
getchar();
scanf("%c",&G.vertices[i].date);
G.vertices[i].firstarc=NULL;
}
printf("输入图每条边所依附的顶点\n");
for(k=0;k<G.arcnum;k++)
{
getchar();
scanf("%c %c",&V1,&V2);
la=Located(G,V1);
lb=Located(G,V2);
s=(ArcNode*)malloc(sizeof(ArcNode));
s->nextarc=NULL;
p=G.vertices[la].firstarc;
if(!p)
G.vertices[la].firstarc=s;
else
{
while(p->nextarc)
p=p->nextarc;
p->nextarc=s;
}
}

}

void DFS(AlGraph G,char ch)
{
int v,w;
ArcNode *p;
v=Located(G,ch);
visited[v]=1;
printf("%c  ",G.vertices[v].date);
p=G.vertices[v].firstarc;
while(p)
{
if(visited[w]==0)
DFS(G,G.vertices[w].date);
p=p->nextarc;
}
}
void DFSTravel(AlGraph G)
{
int v;
for(v=0;v<G.vexnum;v++)
visited[v]=0;
for(v=0;v<G.vexnum;v++)
{
if(visited[v]==0)
DFS(G,G.vertices[v].date);
}
}

void Un_DFSTravel(AlGraph G)
{
stack<int>S;
ArcNode *p;
int i;
for(i=0;i<G.vexnum;i++)
visited[i]=0;
for(i=0;i<G.vexnum;i++)
{
if(visited[i]==0)
{
visited[i]=1;
printf("%c ",G.vertices[i].date);
S.push(i);
while(!S.empty())
{
p=G.vertices[S.top()].firstarc;
while(p)
{
{
p=G.vertices[S.top()].firstarc;
}
else
p=p->nextarc;
}
S.pop();
}
}
}
}

void BFSTravel(AlGraph G)
{
queue<int>Q;
int i,v;
ArcNode *p;
int s;
for(i=0;i<G.vexnum;i++)
visited[i]=0;
for(v=0;v<G.vexnum;v++)
{
if(!visited[v])
{
visited[v]=1;
printf("%c ",G.vertices[v].date);
Q.push(v);
while(!Q.empty())
{
s=Q.front();
p=G.vertices[s].firstarc;
while(p)
{
{
}
else
p=p->nextarc;
}
Q.pop();
}
}
}
}

void Finddgree(AlGraph G,int indegree[])
{
int i;
ArcNode *p;
for(i=0;i<G.vexnum;i++)
indegree[i]=0;
for(i=0;i<G.vexnum;i++)
{
p=G.vertices[i].firstarc;
while(p)
{
p=p->nextarc;
}
}

}

void TopologicalSort(AlGraph G)
{
stack<int>S;
int num;
int k,i;
ArcNode *p;
Finddgree(G,indegree);
for(i=0;i<G.vexnum;i++)
if(!indegree[i])
S.push(i);
num=0;
while(!S.empty())
{
i=S.top();
S.pop();
printf("%c  ",G.vertices[i].date);
num++;
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
{
if(!(--indegree[k]))
S.push(k);

}
}
if(num<G.vexnum)
printf("这是一个有环图\n");
else
printf("这是一个无环图\n");

}

int main()
{
AlGraph G;

Creat_Graph(G);
printf("深度搜索递归序列\n");
DFSTravel(G);
putchar('\n');
printf("深度搜索非递归序列\n");
Un_DFSTravel(G);
putchar('\n');
printf("广度搜索递归序列\n");
BFSTravel(G);
putchar('\n');
printf("拓扑序列\n");
TopologicalSort(G);
putchar('\n');
return 0;
}



0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：32849次
• 积分：1827
• 等级：
• 排名：千里之外
• 原创：155篇
• 转载：6篇
• 译文：0篇
• 评论：1条