c++实现图的基本操作的建立及输出

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;iscanf("%c",&G.vertices[i].data);//读顶点的值
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;iprintf("%d %c",i,G.vertices[i].data);
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;ifor(int i=0;iif(visited[i]==0)
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;iscanf("%c",&G.vertices[i].data);//读顶点的值
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;iprintf("%d %c",i,G.vertices[i].data);
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;ifor(int i=0;iif(visited[i]==0)
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;ifor(int j=0;jG.arc[i][j]=1000;

printf("请输入边的信息及其权值(中间以空格分隔)\n");
for(i=0;i{ printf("剩余%d条边没有输入\n",a--);
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;ifor( j=0;jG.arc[i][j]=0;

printf("请输入边的信息(中间以空格分隔)\n");
for(i=0;i{ printf("剩余%d条边没有输入\n",a--);
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;ifor(int j=0;jG.arc[i][j]=0;

printf("请输入边的信息及其权值(中间以空格分隔)\n");
for(i=0;i{ printf("剩余%d条边没有输入\n",a--);
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;ifor(j=0;jG.arc[i][j]=0;

printf("请输入边的信息(中间以空格分隔)\n");
for(i=0;i{ printf("剩余%d条边没有输入\n",a--);
scanf("%d %d",&v1,&v2);
G.arc[v1][v2]=1;

}

}//createDN

int first(MGraph G,int v){
int i;
for(i=0;iif(G.arc[v][i]>0&&G.arc[v][i]<1000)

return i;
return -1;
}//first

int next(MGraph G,int v,int w){
int i;
for(i=w+1;iif(G.arc[v][i]>0&&G.arc[v][i]<1000)
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;icreateQueue(Q);
for(v=0;vif(visited[v]==0){
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{ printf("剩余%d条边没有输入\n",a--);
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{ printf("剩余%d条边没有输入\n",a--);
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{ printf("剩余%d条边没有输入\n",a--);
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{ printf("剩余%d条边没有输入\n",a--);
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;ifor(i=0;iif(visited[i]==0)
DFS1(G1,i);
}//DFStraverse

void BFS1(ALGraph G1){
Queue Q;
int w,u,v,i,j;
for(i=0;icreateQueue(Q);
for(v=0;vif(visited[v]==0){
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].lowcostmin=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;jif(j!=k) { dge[j].a

djvex=k; dge[j].lowcost=G.arc[k][j]; }
dge[k].lowcost=0;
for(i=1;ik=mini(dge,G.vexnum);
printf("%c--%c ",G.vexs[dge[k].adjvex],G.vexs[k]);
dge[k].lowcost=0;
for(j=0;jif(G.arc[k][j]{ dge[j].adjvex=k; dge[j].lowcost=G.arc[k][j]; }
}
}//MiniSpanTree


void Topo(ALGraph G1){
int i,j,k,count;
LinkNode p;
Stack S;
createStack(S);
for(i=0;iif(G1.vexs[i].in==0)push(S,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}//topo




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;ifor(i=0;iif(visited[i]==0)
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 使用百度前必读 知道协议 百度知道是全球最大的问答型知识分享平台

提问题,排疑解惑
答疑难,助人为乐
搜知识,学习提高
加团队,共同进步
我们真诚欢迎您加入,分享属于您的精彩~!




相关文档
最新文档