




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/****图的存储结构定义及实现*************/
#defineMaxVerNum30/*最大顶点个数*/
#defineVextypechar
#defineInfoTypeint
#defineEdgetypeint
#defineINFINITE999
#defineMAXSIZE100
typedefstruct
(
Vextypevexs[MaxVerNum];/*顶点表7
Edgetypeedges[MaxVerNum][MaxVerNum];/*邻接矩阵,即边表*/
intn,e;/*顶点数和边数*/
JMGragh;/*MGragh是以邻接矩阵存储的图类型*/
typedefstructnode
{/*表结点*/
intadjvex;/*邻接点域,普通是放顶点对应的序号或者在表头向量中的
标*/下
InfoTypeInfo;/*与边(或者弧)相关的信息*/
structnode*next;/*指向下一个邻接点的指针域*/
JEdgeNode;
typedefstructvnode
(/*顶点结点*/
Vextypevertex;r顶点域*/
EdgeNode*firstedge;/*边表头指针*/
JVertexNode;
typedefstruct
(
VertexNodeadjlist[MaxVerNum];/*邻接表*/
intn,e;/*顶点数和边数*/
}ALGraph;/*ALGraph是以邻接表方式存储的图类型7
voidCreatGraph(MGragh*G)/*建立图G的邻接矩阵7
inti,j,k,w;
charch;
输入图的顶点数和边数,如
输入顶点数和边数*/
请逐个输入图的顶点:
for(i=0;i<G->n;i++)
(
while(ch=='')〃处理读取回车符的异常情况
G->vexs[i]=ch;
//输入顶点信息,建立顶点表7
}
for(i=0;i<G->n;i++)
(
for(j=0;jvG->n;j++)
(
if(i==j)
G->edges[i]0]=O;〃对角线元素为0
else
G->edges[i][j]=INFINITE;〃其它元素元素为无穷大
//G->edges[i][j]=O;/*初始化邻接矩阵7
)
)
请逐个输入图的边:如i,j:w...(索引下标从0开始
for(k=0;k<G->e;k++)
(
/*输入e条边,建立邻接矩阵*/
G->edges[i][j]=w;
///*输入e条边,建立邻接矩阵*/
//G->edges[i]0]=1;/*若加入G->edges[j][i]=1,则为无向图的邻接矩阵*/
)
〃打印图
voidprintGragp(MGragh*G)
顶点如下:
for(inti=0;i<G->n;i++)
)
邻接矩阵如下:
for(inti=O;i<G->n;i++)
(
for(intj=O;j<G->n;j++)
)
)
/*根据图的邻接矩阵存储建立图的邻接表存储*/
voidCreateALGraph(MGragh*G,ALGraph*alG)
(
alG->n=G->n;
alG->e=G->e;
for(inti=0;i<alG->n;i++)
(
alG->adjlist[i].vertex=G->vexs[i];
alG->adjlist[i].firstedge=NULL;
EdgeNode*p;
for(intj=O;j<G->n;j++)
(
if(G->edges[i][j]!=O&&G->edges[i][j]!=INFINITE)
(
p=(EdgeNode*)malloc(sizeof(EdgeNode));
p->adjvex=j;
p->lnfo=G->edges[i][j];
p->next=alG->adjlist[i].firstedge;
alG->adjlist[i].firstedge=p;
)
)
)
)
voidprintALGragp(ALGraph*alG)
(
邻接表如下
for(inti=0;i<alG->n;i++)
EdgeNode*edge=alG->adjlist[i].firstedge;
while(edge)
edge=edge->next;
)
)
)
/★★★★★★★★★★★★★★★★★★★★★★★it木戈Ij,彳[****************
typedefstruct
(
intdata[MAXSIZE];
inttop;
JSeqStack,*PSeqStack;
PSeqStacklnit_SeqStack(void)
{〃创建一顺序栈,入口参数无,返回一个指向顺
序栈的指针,为零表示分配空间失败*/
PSeqStackS;
S=(PSeqStack)malloc(sizeof(SeqStack));
if(S)
S->top=-1;
returnS;
)
voidDestroy_SeqStack(PSeqStack*SeqStackPoint)
{/*销毁顺序底,入口参数:为要销毁的顺序栈指针地址*/
if(*SeqStackPoint)
free(*SeqStackPoint);
*SeqStackPoint=NULL;
return;
}
intEmpty_SeqStack(PSeqStackS)
{/*判断栈是否为空,入口参数:顺序栈,返回值:1表示为空,0表示非空*/
if(S->top==-1)
return1;
else
return0;
intPush_SeqStack(PSeqStackS,intx)
{/*入口参数:顺序栈,返回值:1表示入栈成功,0表示失败。*/
if(S->top==MAXSIZE-1)
return0;/*栈满不能入栈*/
else
(
S->top++;
S->data[S->top]=x;
return1;
)
)
intOut_SeqStack(PSeqStackS,int*x)
{/*取出栈顶元素,入口参数:顺序栈,被取出的元素指针,这里用
指针带出栈顶值返回值:1表示成功,0表示失败。7
if(Empty_SeqStack(S))
return0;/*栈空*/
else
(
*x=S->data[S->top-];/*栈顶元素存入*x中7
return(1);
}
)
intGetStackTop(PSeqStackstack)
(
returnstack->top;
)
/************************队列的定义与算法********************
typedefstruct
(
intdat矶MAXSIZE];/*队列的存储空间*/
intfront,rear;/*队头队尾指针*/
}SeqQueue,*PSeqQueue;
PSeqQueuelnit_SeqQueue()
{/*返回值:新顺序队列指针,null表示失败*/
PSeqQueueQ;
Q=(PSeqQueue)malloc(sizeof(SeqQueue));
if(Q){
Q->front=0;
Q->rear=O;
)
returnQ;
)
voidDestroy_SeqQueue(PSeqQueue*Q)
(
if(*Q)
free(*Q);
*Q=NULL;
intEmpty_SeqQueue(PSeqQueueQ)
/•返回值:1表示为空,0表示非空*/
{if(Q&&Q->front==Q->rear)
return(1);
else
return(0);
)
intln_SeqQueue(PSeqQueueQ,intx)
{/*返回值:1表示成功,一1表示队满溢出*/
if((Q->rear+1)%MAXSIZE==Q->front)
(
队满
return-1;/*队满不能入队*/
)
else
{Q->rear=(Q->rear+1)%MAXSIZE;
Q->data[Q->rear]=x;
return1;/*入队完成*/
)
)
intOut_SeqQueue(PSeqQueueQ,int*x)
{/*返回值:1表示成功,一1表示队空,出队的元素保存到*x7
if(Empty_SeqQueue(Q))
队空
return-1;/*队空不能出队7
)
else
(
Q->front=(Q->front+1)%MAXSIZE;
*x=Q->data[Q->front];
return1;/*出队完成*/
)
)
intFront_SeqQueue(PSeqQueueQ,int*x)
{/*返回值:1表示成功,一1表示队空*/
if(Q->front==Q->rear)
(
队空
return-1;/*队空不能得到队头元素7
)
else
(
*x=Q->data[(Q->front+1)%MAXSIZE];
return1;/*取队头元素操作完成*/
}
)
/****图的遍历*************/
intvisited[MaxVerNum];
〃深度邻接矩阵
voidDFS(MGraghg,intv)
visited[v]=1;
for(inti=0;i<g.n;i++)
(
if(g.edges[v][i]!=O&&g.edges[v][i]!=INFINITE)
(
if(!visited[i])
DFS(g,i);
)
)
)
voidDFSTranverseForMG(MGraghg)
邻接矩阵的深度遍历结果:
for(inti=O;i<g.n;i++)
visited[i]=O;
for(intj=O;j<g.n;j++)
(
if(!visited[j])
DFS(g,j);
)
)
〃广度邻接矩阵
voidBFS(MGraghg,intv)
(
PSeqQueueQ;
Q=lnit_SeqQueue();
visited[v]=1;
ln_SeqQueue(Q,v);
inti;
while(!Empty_SeqQueue(Q))
(
Out_SeqQueue(Q,&i);
for(intj=O;j<g.n;j++)
(
if(g.edges[i][j]!=O&&g.edges[i][j]!=INFINITE)
(
if(!visited[j])
(
visited[j]=1;
ln_SeqQueue(Q,j);
)
)
)
)
)
voidBFSTranverseForMG(MGraghg)
邻接矩阵的广度遍历结果:
for(inti=O;i<g.n;i++)
visited[i]=O;
for(intj=O;j<g.n;j++)
(
if(!visited[j])
BFS(g,j);
)
)
〃深度邻接表
voidDFS2(ALGraphg,intv)
(
EdgeNode*P;
intw;
visited[v]=1;
for(p=g.adjlist[v].firstedge;p;p=p->next)
(
w=p->adjvex;
if(!visited[w])
DFS2(g,w);
)
)
voidDFSTranverseForALG(ALGraphg)
(
邻接表的深度遍历结果:
for(inti=0;i<g.n;i++)
visited[i]=O;
for(intj=O;j<g,n;j++)
(
if(!visited[j])
DFS2(g,j);
)
)
〃广度邻接表
voidBFS2(ALGraphg,intv)
EdgeNode*p;
PSeqQueueQ;
Q=lnit_SeqQueue();
visited[v]=1;
ln_SeqQueue(Q,v);
inti,w;
while(!Empty_SeqQueue(Q))
(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村人才引进与培养合作框架协议
- 高中物理实验技能强化课
- 合作开发技术合同协议书要求
- 农村用地规划利用与管理协议
- 法律职业资格考试大纲卷样题集
- 银行历史考试试题及答案
- 仪器qc考试试题及答案
- 六一儿童公开课活动方案
- 六一公司食堂活动方案
- 六一化妆宣传活动方案
- 探索地方高校服务区域经济社会发展路径
- 2023年小学一年级语文、数学下册无纸笔化检测题(各一套)
- 马清河灌区灌溉系统规划设计
- 四川省南充市2023-2024学年高二下学期期末考试语文试题(解析版)
- 汽机设备隐患排查治理手册
- 艺术鉴赏智慧树知到答案2024年陕西财经职业技术学院
- 肿瘤科护理疑难病例讨论
- D750FMPRC-DL(Sc)06-尼康相机说明书
- 人音版音乐二年级下册第4课聆听《吉祥三宝》教学设计
- DL∕T 1739-2017 静力水准装置
- 2023七年级数学下册 第四章 三角形3 探索三角形全等的条件第1课时 利用边边边判定三角形全等教案 (新版)北师大版
评论
0/150
提交评论