1、 int adjvex; /该弧所指向的顶点的位置 struct ArcNode *nextarc; /指向下一条弧的指针 int weight; /与弧相关的权值,无权则为0ArcNode;typedef struct VNode /顶点结点的结构 int degree,indegree; /顶点的度,入度 VertexType data; ArcNode *firstarc;VNode,AdjListMAX_VERTEX_NUM;typedef struct AdjList vertices; int vexnum,arcnum; /顶点的实际数,边的实际数ALGraph;int Loca
2、teVex(ALGraph &G,VertexType u) int i; for(i=0;iG.vexnum;+i) if(u=G.verticesi.data) return i; return -1;void CreateDG(ALGraph &G) VertexType v1,v2; int i,j; ArcNode *p; printf(ninput the grahs vexnum and arcnum:); scanf(%d %d,&G.vexnum,&G.arcnum);ninput vertect datas:i+) scanf(%dG.verticesi.data); G.
3、verticesi.firstarc=NULL; for(int k=0;kG.arcnum;k+) printf(ninput %dth arcs firstarc nextarc:n,k+1);v1,&v2); i=LocateVex(G,v1); j=LocateVex(G,v2);/head if(i0 | jadjvex=j;nextarc=G.verticesi.firstarc; G.verticesi.firstarc=p;weight=0;,i,G.verticesi.data); p=G.verticesi.firstarc; while(p)-,p-adjvex); p=
4、p-nextarc;int GraphExit(ALGraph G,int i,int j) p=G.verticesi.firstarc; while(p & p-adjvex!=j) p=p- if(p) return 1; else return 0;void Degree(ALGraph &G,int i) int j; G.verticesi.indegree=0; G.verticesi.degree=0; for(j=0;j=S.stacksize) S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*si
5、zeof(SElemType); if(! S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; *S.top+=e; return 1;void Pop(SqStack &S,SElemType & if(S.top=S.base) e=*-S.top;int StackEmpty(SqStack & return 1; return 0;int DestroyStack(SqStack S) S.top=NULL; S.base=NULL; deleteS.base; S.stacksize=0;/*graph&stack*int T
6、opologicalSort(ALGraph G) SqStack S; int i,k,j; InitStack(S); if(G.verticesi.indegree=0) Push(S,i); int count=0; while(!StackEmpty(S) Pop(S,i);%d ,G.verticesi.data); +count; j=LocateVex(G,G.verticesi.data); for(p=G.verticesj.firstarc;p;p=p-nextarc) k=p-adjvex; G.verticesk.indegree-; if(G.verticesk.i
7、ndegree=0) Push(S,k); if(countG.vexnum)nther is a loop in this graph! return 0; else s topologicalsort showed over! return 1; DestroyStack(S);int main() ALGraph G; CreateDG(G); De_Ingree(G); TopologicalSort(G);2.无向图 (1)建立一个无向图的邻接表,并输出该邻接表。 (2)采用邻接表存储实现无向图的深度优先遍历。 (3)采用邻接表存储实现无向图的广度优先遍历。typedef int Q
8、ElemType;#define MAXSIZE 100/*队列操作*typedef struct QElemType *base; int front; int rear;SqQueue;int InitQueue(SqQueue &Q) Q.base=(QElemType*)malloc(MAXSIZE *sizeof(QElemType);Q.base)nfail to alloc storage! Q.front=Q.rear=0;int EnQueue(SqQueue &Q,QElemType e) if(Q.rear+1)%MAXSIZE=Q.front)nthe queue is
9、 full! Q.baseQ.rear=e; Q.rear=(Q.rear+1)%MAXSIZE;int DeQueue(SqQueue &Q,QElemType & if(Q.front=Q.rear)s an empty queue! e=Q.baseQ.front; Q.front=(Q.front+1)%MAXSIZE;bool QueueEmpty(SqQueue Q) if(Q.rear=Q.front)/*无向图* int i=0; while(iG.vexnum)&(G.verticesi.data!=u) i+; if(i G.verticesi.firstarc=s;adj
10、vex=i;nextarc=G.verticesj.firstarc; G.verticesj.firstarc=p;-%d/*遍历*bool visitedMAXSIZE;void DFS(ALGraph G,int v) visitedv=true; %3d,G.verticesv.data); p=G.verticesv.firstarc; while(p)visitedp-adjvex) DFS(G,p-void DFSTraverse(ALGraph G)nshow DFS traver result: for(int v=0;vint NextAdjvex(ALGraph G,VN
11、ode v,int w) p=v.firstarc; while(p!=NULL &=w) if(p-adjvex=w &nextarc! return p-nextarc=NULL)void BFSTraverse(ALGraph G) SqQueue Q;nshow BFS traver result: int i,e; visitedi=false; InitQueue(Q);visitedi) visitedi=true; EnQueue(Q,i); while(!QueueEmpty(Q) DeQueue(Q,e); for(int u=FirstAdjvex(G,G.vertice
12、se);u=0;u=NextAdjvex(G,G.verticese,u) if(!visitedu) visitedu=true; printf(,G.verticesu.data); EnQueue(Q,u); /*主函数* CreateUDG(G); DFSTraverse(G); BFSTraverse(G);三、实验说明: 1.类型定义(邻接表存储) #define MAX_VERTEX_NUM 8 /顶点最大个数 typedef struct ArcNode int adjvex; /边的权 ArcNode; /表结点 #define VertexType int /顶点元素类型 typedef struct VNode int degree,indegree;/顶点的度,入度 VertexType data; VNode/*头结点*/,AdjListMAX_VERTEX_NUM; typedef struct AdjList vertices; int vexnum,arcnu
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1