c语言实现拓扑排序(《数据结构》算法7.12)
2016-03-05 14:06
429 查看
邻接表+拓扑排序,输出的是无向图的拓扑有序序列。
代码如下:#include<stdio.h>
#include<stdlib.h>
#include<stack>
#define MAX_VERTEX_NUM 100
using namespace std;
int indegree[MAX_VERTEX_NUM];
stack<int>s;
typedef struct ArcNode{
int adjvex;//该边的另一个顶点的位置
struct ArcNode *nextarc; //指向下一条边
}ArcNode;
typedef struct VNode{
int data;//顶点的值
ArcNode *firstarc;//指向第一条依附该顶点的边的指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;//顶点数组
int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,int v){//定位函数
for(int i=0;i<G.vexnum;i++){
if(v==G.vertices[i].data)return i;
}
}
void CreateDG(ALGraph &G){
ArcNode *p;
int i,j,k,v1,v2;
printf("分别输入顶点个数和边的数目:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("分别输入各个顶点值:\n");
for(i=0;i<G.vexnum;i++){
scanf("%d",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;//初始化
}
printf("分别输入各条弧的弧尾和弧头:\n");
for(k=0;k<G.arcnum;k++){
scanf("%d%d",&v1,&v2);
i=LocateVex(G,v1);j=LocateVex(G,v2);//定位
p=(ArcNode*)malloc(sizeof(ArcNode));//申请一个结点
p->adjvex=j;p->nextarc=NULL;//赋值
p->nextarc=G.vertices[i].firstarc;//连接结点
G.vertices[i].firstarc=p;//连接结点
}
}
void FindInDegree(ALGraph G){
for(int i=0;i<G.vexnum;i++){
ArcNode *p=G.vertices[i].firstarc;
while(p){
indegree[p->adjvex]++;
p=p->nextarc;
}
}
}
void TopologicalSort(ALGraph G){//对邻接表储存方式下的无向图求拓扑有序序列
int i,k;
ArcNode *p;
FindInDegree(G);//找到每个点的入度
for(i=0;i<G.vexnum;i++)
if(!indegree[i])s.push(i);//将入度为0的点加入栈
while(!s.empty()){
i=s.top();s.pop();//栈顶元素出栈
printf("%d ",i);//输出一个点(这里用该点在邻接表中的位置代替点)
for(p=G.vertices[i].firstarc;p;p=p->nextarc){
k=p->adjvex;
if(!(--indegree[k]))s.push(k);//对i号顶点指向的其余邻接点入度减一
}
}
}
int main(){
ALGraph G;
CreateDG(G);
TopologicalSort(G);
return 0;
}
代码如下:#include<stdio.h>
#include<stdlib.h>
#include<stack>
#define MAX_VERTEX_NUM 100
using namespace std;
int indegree[MAX_VERTEX_NUM];
stack<int>s;
typedef struct ArcNode{
int adjvex;//该边的另一个顶点的位置
struct ArcNode *nextarc; //指向下一条边
}ArcNode;
typedef struct VNode{
int data;//顶点的值
ArcNode *firstarc;//指向第一条依附该顶点的边的指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;//顶点数组
int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,int v){//定位函数
for(int i=0;i<G.vexnum;i++){
if(v==G.vertices[i].data)return i;
}
}
void CreateDG(ALGraph &G){
ArcNode *p;
int i,j,k,v1,v2;
printf("分别输入顶点个数和边的数目:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("分别输入各个顶点值:\n");
for(i=0;i<G.vexnum;i++){
scanf("%d",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;//初始化
}
printf("分别输入各条弧的弧尾和弧头:\n");
for(k=0;k<G.arcnum;k++){
scanf("%d%d",&v1,&v2);
i=LocateVex(G,v1);j=LocateVex(G,v2);//定位
p=(ArcNode*)malloc(sizeof(ArcNode));//申请一个结点
p->adjvex=j;p->nextarc=NULL;//赋值
p->nextarc=G.vertices[i].firstarc;//连接结点
G.vertices[i].firstarc=p;//连接结点
}
}
void FindInDegree(ALGraph G){
for(int i=0;i<G.vexnum;i++){
ArcNode *p=G.vertices[i].firstarc;
while(p){
indegree[p->adjvex]++;
p=p->nextarc;
}
}
}
void TopologicalSort(ALGraph G){//对邻接表储存方式下的无向图求拓扑有序序列
int i,k;
ArcNode *p;
FindInDegree(G);//找到每个点的入度
for(i=0;i<G.vexnum;i++)
if(!indegree[i])s.push(i);//将入度为0的点加入栈
while(!s.empty()){
i=s.top();s.pop();//栈顶元素出栈
printf("%d ",i);//输出一个点(这里用该点在邻接表中的位置代替点)
for(p=G.vertices[i].firstarc;p;p=p->nextarc){
k=p->adjvex;
if(!(--indegree[k]))s.push(k);//对i号顶点指向的其余邻接点入度减一
}
}
}
int main(){
ALGraph G;
CreateDG(G);
TopologicalSort(G);
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)