c++实现图的基本操作的建立及输出
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
百度首页 | 百度知道 | 登录 淘金行动,宝箱开启!
淘金行动火热升级,第二波奖品等你来拿!更有财富值及精美徽章等着你哦~勇往直前,意想不到的惊喜等着你!
查看
新闻网页贴吧知道MP3图片视频百科文库 帮助 | 设置
百度知道 > 电脑/网络 > 程序设计 > C/C++
图的建立及输出
悬赏分:0 | 解决时间:2008-6-24 23:42 | 提问者:power871012 任务:建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。求c程序
最佳答案 两个版本.第一个是我自己做的,带深度遍历 第二个是同学的,比较全.
时间太久了..自己都看不明白了
您自己研究吧
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX_VERTEX_NUM 20
#define INFINITY 2000000000
typedef char InfoType;
typedef char VertexType;
int visited[20];
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc;
// 指向下一条弧的指针
InfoType *info; // 该弧相关信息的指针
} ArcNode;
typedef struct VNode {
VertexType data; // 顶点信息
ArcNode *firstarc;
// 指向第一条依附该顶点的弧
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; //结构体数组
int vexnum, arcnum; //顶点数、弧数
} ALGraph;
void CreateALGraph(ALGraph &G){
int i,j; ArcNode *p;
printf("请输入顶点个数和弧数:\n");
scanf("%d%d",&G.vexnum, &G.arcnum);//顶点个数和弧数
getchar();
printf("读顶点的值:\n");
for(int i=0;i
G.vertices[i].firstarc= NULL;
}
printf("读入每对顶点序号:\n");
for(int k=0;k< G.arcnum ;k++) {
scanf("%d%d",&i,&j); // 读入一对顶点序号
p=new ArcNode; // 生成结点,用头插法插入
p->adjvex =j;
p->nextarc= G.vertices[i].firstarc;
G.vertices[i].firstarc = p; }
} // build_adjlist
int FirstAdjVex(ALGraph G,int v){
ArcNode *TNode=G.vertices[v].firstarc;
if(TNode!=NULL) return TNode->adjvex;
else return -1;
}
int NextAdjVex(ALGraph G,int v,int w){
ArcNode *TNode=G.vertices[v].firstarc;
while(TNode->adjvex!=w) {
TNode=TNode->nextarc;
if(!TNode){printf("w不存在.");exit(1);}
}
TNode=TNode->nextarc;
if(TNode!=NULL) return TNode->adjvex;
else return -1;
}
void DisplayALGraph(ALGraph G){
for(int i=0;i
ArcNode *TNode=G.vertices[i].firstarc;
if(FirstAdjVex(G,i)!
=-1){
printf("->%d",FirstAdjVex(G,i));
while(TNode->nextarc!=NULL){
printf("->%d",TNode->nextarc->adjvex);
TNode=TNode->nextarc;
}
}
printf("\n");
}
}
void DFS(ALGraph G,int v){
int w;
visited[v]=1; printf("%d%c->",v,G.vertices[v].data);
for(w=FirstAdjVex(G,v);w!=-1;w=NextAdjVex(G,v,w))
if(visited[w]==0) DFS(G,w);
}
void DFSTraverse(ALGraph G){
for(int i=0;i
DFS(G,i);
}
void main(){
printf("EE!\n");
ALGraph G;
CreateALGraph(G);
printf("邻接表为:\n");
DisplayALGraph(G);
printf("深度遍历:\n");
DFSTraverse(G);
}#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX_VERTEX_NUM 20
#define INFINITY 2000000000
typedef char InfoType;
typedef char VertexType;
int visited[20];
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc;
// 指向下一条弧的指针
InfoType *info; // 该弧相关信息的指针
} ArcNode;
typedef struct VNode {
VertexType data; // 顶点信息
ArcNode *firstarc;
// 指向第一条依附该顶点的弧
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; //结构体数组
int vexnum, arcnum; //顶点数、弧数
} ALGraph;
void CreateALGraph(ALGraph &G){
int i,j; ArcNode *p;
printf("请输入顶点个数和弧数:\n");
scanf("%d%d",&G.vexnum, &G.arcnum);//顶点个数和弧数
getchar();
printf("读顶点的值:\n");
for(int i=0;i
G.vertices[i].firstarc= NULL;
}
printf("读入每对顶点序号:\n");
for(int k=0;k< G.arcnum ;k++) {
scanf("%d%d",&i,&j); // 读入一对顶点序号
p=new ArcNode; // 生成结点,用头插法插入
p->adjvex =j;
p->nextarc= G.vertices[i].firstarc;
G.vertices[i].firstarc = p; }
} // build_adjlist
int FirstAdjVex(ALGraph G,int v){
ArcNode *TNode=G.vertices[v].firstarc;
if(TNode!=NULL) return TNode->adjvex;
else return -1;
}
int NextAdjVex(ALGraph G,int v,int w){
ArcNode *TNode=G.vertices[v].firstarc;
while(TNode->adjvex!=w) {
TNode=TNode->nextarc;
if(!TNode){printf("w不存在.");exit(1);}
}
TNode=TNode->nextarc;
if(TNode!=NULL) return TNode->adjvex;
else return -1;
}
void DisplayALGraph(ALGraph G){
for(int i=0;i
ArcNode *TNode=G.vertices[i].firstarc;
if(FirstAdjVex(G,i)!=-1){
printf("->%d",FirstAdjVex(G,i));
while(TNode->nextarc!=NULL){
printf("->%d",TNode->nextarc->adjvex);
TNode=TNode->nextarc;
}
}
printf("\n");
}
}
void DFS(ALGraph G,int v){
int w;
visited[v]=1; pr
intf("%d%c->",v,G.vertices[v].data);
for(w=FirstAdjVex(G,v);w!=-1;w=NextAdjVex(G,v,w))
if(visited[w]==0) DFS(G,w);
}
void DFSTraverse(ALGraph G){
for(int i=0;i
DFS(G,i);
}
void main(){
printf("EE!\n");
ALGraph G;
CreateALGraph(G);
printf("邻接表为:\n");
DisplayALGraph(G);
printf("深度遍历:\n");
DFSTraverse(G);
}
下面是第2个
图的操作(最终版).cpp
#include"stdio.h"
int aa,visited[20]; //全局变量
typedef struct {
char vexs[20];
int arc[20][20];
int vexnum,arcnum;
}MGraph;
typedef struct Node{
int nextnode;
int w;
struct Node *next;
}Node,*LinkNode;
typedef struct VNode{
char data;
int in;
LinkNode first;
}VNode;
typedef struct {
VNode vexs[20];
int vexnum,arcnum;
}ALGraph;
typedef struct QNode{
int vex;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct Queue{
QueuePtr front;
QueuePtr rear;
}Queue;
typedef struct {
int adjvex;
int lowcost;
}closedge;
typedef struct {
int *top,*base;
}Stack;
void createUDN(MGraph &G); //函数声明
void createDN(MGraph &G);
void createUDG(MGraph &G);
void createDG(MGraph &G);
void createUDN1(ALGraph &G1);
void createDN1(ALGraph &G1);
void createUDG1(ALGraph &G1);
void createDG1(ALGraph &G1);
void show1(MGraph G);
void show2(ALGraph G1);
void createQueue(Queue &Q){
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
}//createQueue
void EnQueue(Queue &Q,int e){
QueuePtr p;
p=new QNode;
p->vex=e; p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}//EnQueue
void DeQueue(Queue &Q,int &e){
QueuePtr p;
if(Q.front==Q.rear)printf("the Queue is empty!\n");
p=Q.front->next;
e=p->vex;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
delete p;
}//DeQueue
void createStack(Stack &S){
S.base=new int[20];
S.top=S.base;
}//createStack
void push(Stack &S, int e){
*S.top=e;
S.top++;
}
void pop(Stack &S,int &e){
S.top--;
e=*S.top;
}
void createGraph(MGraph &G,ALGraph &G1,int &aa,int &bb){
int a,b;
printf("请选择创建图的方式\n(邻接矩阵的无向图可求最小生成树;邻接表的有向图可求拓扑排序)\n");
printf("1:邻接矩阵 2:邻接表\n");
scanf("%d",&a); aa=a;
printf("请选择图的类型\n");
printf("1:有向图 2:有向网 3:无向图 4:无向网\n");
scanf("%d",&b); if(a==1&&b==4)bb=1; if(a==2&&b==1)bb=2;
if(a==1&&b==1) createDG(G);
if(a==1&&b==2) createDN(G);
if(a==1&&b==3) createUDG(G);
if(a==1&&b==4) createUDN(G);
if(a==2&&b==1) createDG1(G1);
if(a==2&&b==2) createDN1(G1);
if(a==2&&b==3) createUDG1(G1);
if(a==2&&b==4) createUDN1(G1);
}//createGraph
void createUDN(MGraph &G){
int a,v1,v2,w;
printf("创建无向网:\n");
printf("请输入顶点数目\n");
scanf("%d",&G.vexnum);
printf("请输入边数目\n");
scanf("%d",&G.arcnum);
a=G.arcnum; getchar();
printf("请输入顶点信息\n");
for(int i=0;i
printf("第%d个顶点: ",i);
printf("\n");
scanf("%c",&G.vexs[i]);
getchar(); //吃回车
}
for(i=0;i
printf("请输入边的信息及其权值(中间以空格分隔)\n");
for(i=0;i
scanf("%d %d %d",&v1,&v2,&w);
G.arc[v1][v2]=w;
G.arc[v2][v1]=w;
}
}//createUDN
void createUDG(MGraph &G){
int a,v1,v2,i,j;
printf("创建无向图:\n");
printf("请输入顶点数目\n");
scanf("%d",&G.vexnum);
printf("请输入边数目\n");
scanf("%d",&G.arcnum);
a=G.arcnum; getchar();
printf("请输入顶点信息\n");
for( i=0;i
printf("第%d个顶点: ",i);
printf("\n");
scanf("%c",&G.vexs[i]);
getchar(); //吃回车
}
for(i=0;i
printf("请输入边的信息(中间以空格分隔)\n");
for(i=0;i
scanf("%d %d",&v1,&v2);
G.arc[v1][v2]=1;
G.arc[v2][v1]=1;
}
}//createUDN
void createDN(MGraph &G){
int a,v1,v2,w;
printf("创建有向网:\n");
printf("请输入顶点数目\n");
scanf("%d",&G.vexnum);
printf("请输入边数目\n");
scanf("%d",&G.arcnum);
a=G.arcnum; getchar();
printf("请输入顶点信息\n");
for(int i=0;i
printf("第%d个顶点: ",i);
printf("\n");
scanf("%c",&G.vexs[i]);
getchar(); //吃回车
}
for(i=0;i
printf("请输入边的信息及其权值(中间以空格分隔)\n");
for(i=0;i
scanf("%d %d %d",&v1,&v2,&w);
G.arc[v1][v2]=w;
}
}//createDN
void createDG(MGraph &G){
int a,v1,v2,i,j;
printf("创建有向图:\n");
printf("请输入顶点数目\n");
scanf("%d",&G.vexnum);
printf("请输入边数目\n");
scanf("%d",&G.arcnum);
a=G.arcnum; getchar();
printf("请输入顶点信息\n");
for(i=0;i
printf("第%d个顶点: ",i);
printf("\n");
scanf("%c",&G.vexs[i]);
getchar(); //吃回车
}
for(i=0;i
printf("请输入边的信息(中间以空格分隔)\n");
for(i=0;i
scanf("%d %d",&v1,&v2);
G.arc[v1][v2]=1;
}
}//createDN
int first(MGraph G,int v){
int i;
for(i=0;i
return i;
return -1;
}//first
int next(MGraph G,int v,int w){
int i;
for(i=w+1;i
return i;
return -1;
}//next
void DFS(MGraph G,int v){
int w;
visited[v]=1; printf("%c ",G.vexs[v]);
for(w=first(G,v);w>0;w=next(G,v,w))
if(visited[w]==0) DFS(G,w);
}//DFS
void BFS(MGraph G){
Queue Q;
int w,u,v,i,j;
for(i=0;i
for(v=0;v
visited[v]=1;printf("%c ",G.vexs[v]);
EnQueue(Q,v);
while(Q.front!=Q.rear){
DeQueue(Q,u);
for(w=first(G,u);w>=0;w=next(G,u,w))
if(visited[w]==0) {
visited[w]=1; printf("%c ",G.vexs[w]);
EnQueue(Q,w);
}
}
}
}//BFS
int first1(ALGraph G1,int v){
LinkNode p;
p=G1.vexs[v].first;
if(p) return p->nextnode;
else return -1;
}
int next1(ALGraph G1,int v,int w){
LinkNode p;
p=G1.vexs[v].first;
while(p->nextnode!=w)
p=p->next;
p=p->next;
if(p) return p->nextnode;
else return -1;
}
void createDN1(ALGraph &G1){
LinkNode p,q;
int a,v1,v2,w;
printf("创建有向网:\n");
printf("请输入顶点数目\n");
scanf("%d",&G1.vexnum);
printf("请输入边数目\n");
scanf("%d",&G1.arcnum);
a=G1.arcnum; getchar();
printf("请输入顶点信息\n");
for(int i=0;i
printf("第%d个顶点: ",i);
printf("\n");
scanf("%c",&(G1.vexs[i].data));
getchar(); //吃回车
G1.vexs[i].first=NULL;
}
printf("请输入边的信息及其权值(中间以空格分隔)\n");
for(i=0;i
scanf("%d %d %d",&v1,&v2,&w);
p=new Node;
p->nextnode=v2;
p->w=w;
p->next=G1.vexs[v1].first;
G1.vexs[v1].first=p;
}
}//createDN1
void createUDG1(ALGraph &G1){
LinkNode p,q;
int a,v1,v2,w;
printf("创建无向图:\n");
printf("请输入顶点数目\n");
scanf("%d",&G1.vexnum);
printf("请输入边数目\n");
scanf("%d",&G1.arcnum);
a=G1.arcnum; getchar();
printf("请输入顶点信息\n");
for(int i=0;i
printf("第%d个顶点: ",i);
printf("\n");
scanf("%c",&(G1.vexs[i].data));
getchar(); //吃回车
G1.vexs[i].first=NULL;
}
printf("请输入边的信息(中间以空格分隔)\n");
for(i=0;i
scanf("%d %d",&v1,&v2);
p=new Node;
p->nextnode=v2;
p->w=0;
p->next=G1.vexs[v1].first;
G1.vexs[v1].first=p;
q=new Node;
q->nextnode=v1;
q->w=w;
q->next=G1.vexs[v2].first;
G1.vexs[v2].first=q;
}
}//createUDN1
void createDG1(
ALGraph &G1){
LinkNode p,q;
int a,v1,v2,w;
printf("创建有向图:\n");
printf("请输入顶点数目\n");
scanf("%d",&G1.vexnum);
printf("请输入边数目\n");
scanf("%d",&G1.arcnum);
a=G1.arcnum; getchar();
printf("请输入顶点信息\n");
for(int i=0;i
printf("第%d个顶点: ",i);
printf("\n");
scanf("%c",&(G1.vexs[i].data));
getchar(); //吃回车
G1.vexs[i].first=NULL;
G1.vexs[i].in=0;
}
printf("请输入边的信息(中间以空格分隔)\n");
for(i=0;i
scanf("%d %d",&v1,&v2);
p=new Node;
p->nextnode=v2;
p->w=-1;
p->next=G1.vexs[v1].first;
G1.vexs[v1].first=p;
G1.vexs[v2].in++;
}
}//createDG1
void createUDN1(ALGraph &G1){
LinkNode p,q;
int a,v1,v2,w;
printf("创建无向网:\n");
printf("请输入顶点数目\n");
scanf("%d",&G1.vexnum);
printf("请输入边数目\n");
scanf("%d",&G1.arcnum);
a=G1.arcnum; getchar();
printf("请输入顶点信息\n");
for(int i=0;i
printf("第%d个顶点: ",i);
printf("\n");
scanf("%c",&(G1.vexs[i].data));
getchar(); //吃回车
G1.vexs[i].first=NULL;
}
printf("请输入边的信息及其权值(中间以空格分隔)\n");
for(i=0;i
scanf("%d %d %d",&v1,&v2,&w);
p=new Node;
p->nextnode=v2;
p->w=w;
p->next=G1.vexs[v1].first;
G1.vexs[v1].first=p;
q=new Node;
q->nextnode=v1;
q->w=w;
q->next=G1.vexs[v2].first;
G1.vexs[v2].first=q;
}
}//createUDN1
void DFS1(ALGraph G1,int v){
int w;
visited[v]=1; printf("%c ",G1.vexs[v]);
for(w=first1(G1,v);w>=0;w=next1(G1,v,w))
if(visited[w]==0) DFS1(G1,w);
}//DFS
void DFStraverse1(ALGraph G1){
for(int i=0;i
DFS1(G1,i);
}//DFStraverse
void BFS1(ALGraph G1){
Queue Q;
int w,u,v,i,j;
for(i=0;i
for(v=0;v
visited[v]=1;printf("%c ",G1.vexs[v].data);
EnQueue(Q,v);
while(Q.front!=Q.rear){
DeQueue(Q,u);
for(w=first1(G1,u);w>=0;w=next1(G1,u,w))
if(visited[w]==0) {
visited[w]=1; printf("%c ",G1.vexs[w].data);
EnQueue(Q,w);
}
}
}
}//BFS1
int mini(closedge dge[],int u){
int i,min;
min=100;
for(i=0;iif(dge[i].lowcost!=0)
if(dge[i].lowcost
for(i=0;iif(dge[i].lowcost==min)break;
return i;
}
void MiniSpanTree(MGraph G,int v){
closedge dge[20];
int i,j,k;
k=v;
for(j=0;j
djvex=k; dge[j].lowcost=G.arc[k][j]; }
dge[k].lowcost=0;
for(i=1;i
printf("%c--%c ",G.vexs[dge[k].adjvex],G.vexs[k]);
dge[k].lowcost=0;
for(j=0;j
}
}//MiniSpanTree
void Topo(ALGraph G1){
int i,j,k,count;
LinkNode p;
Stack S;
createStack(S);
for(i=0;i
count=0;
while(S.top!=S.base){
pop(S,i);
printf("%c->",G1.vexs[i].data);
count++;
for(p=G1.vexs[i].first;p;p=p->next){
k=p->nextnode;
G1.vexs[k].in--;
if(G1.vexs[k].in==0)push(S,k);
}
}
if(count
void main(){
int aa,a,bb=0;
ALGraph G1;
MGraph G;
createGraph(G,G1,aa,bb);
printf("深度遍历的结果是:\n");
if(aa==1){
printf("深度遍历的结果是:\n");
for(int i=0;i
DFS(G,i);
printf("\n广度遍历的结果是:\n");
BFS(G);
if(bb==1){
printf("求最小生成树,请输入起始顶点的序号:\n");
scanf("%d",&a);
MiniSpanTree(G,a);
}
printf("\n");
}
if(aa==2){
printf("深度遍历的结果是:\n");
DFStraverse1(G1);
printf("\n广度遍历的结果是:\n");
BFS1(G1);
if(bb==2){
printf("拓扑排序的结果是:\n");
Topo(G1);
printf("\n");
}
}
}对我有帮助
2回答时间:2008-6-24 23:30 | 我来评论
向TA求助 回答者: hyper29 | 二级
擅长领域: VC++
参加的活动: 暂时没有参加的活动
提问者对于答案的评价:
thank you !
相关内容
2008-6-27 图的建立及输出 4
2009-9-21 图的建立及遍历输出 3
2009-9-20 课程设计的问题:图的建立和邻接矩阵及遍历输出的问题 3
2009-2-7 图的建立和输出 6
2009-3-8 邯郸有没有专业设计效果图及输出的地方吗?
更多关于图的建立的问题>>
查看同主题问题: 建立 输出
等待您来回答0回答有什么电影是在乌兰浩特市拍摄的吗.0回答农民频道12月5日,露天电影院播放的什么电影.2回答能不能把豆粕苍穹发给我啊 谢谢 我的邮箱号wshenzhouxing@ 谢谢.0回答580年代看的老电影,讲一个山上有个很大的石猿,把血涂在它眼睛上就活了,....0回答安徽电视台影视频道10年12月5日午夜影院放的什么电影?.0回答50求一个斗破苍穹游戏激活码。。谢谢各位。。617772063@ . 谢谢。。.0回答10求 几个 有腋毛女的老电影.1回答汽车3D动画电影 前面车迷频道有介绍.更多等待您来回答的问题>>转发到: 用户名:
密码
码:
记住我的登录状态
登 录 忘记密码
注册百度账号,遨游知识海洋
分类合作品牌 世界不够给力,需要你来出力!马上提交未来创想,或解答创想,就有机会改变世界,赢取笔记本电脑等给力大奖。/geili/
有想法?提交创想赢大奖
够专业?分享解答赢大奖
给力视频:IT如何让未来更给力?
至强学院:智能技术如何改变行业
来百度推广C/C++
?2010 Baidu 使用百度前必读 知道协议 百度知道是全球最大的问答型知识分享平台
提问题,排疑解惑
答疑难,助人为乐
搜知识,学习提高
加团队,共同进步
我们真诚欢迎您加入,分享属于您的精彩~!