1、 for(k=0;kk+) cout输入第k+1v2; i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcsij=1; G.arcsji=1; /置的对称弧 return 0;G,string u) /确定u在G中序号 int i; for (i=0;i+) if (u=G.vexsi) return i; if (i=G.vexnum) Error u!endl; exit(1);void ShowG(MGraph &G) int i,j;G.vexsi coutG.arcsijmain() MGraph A; int a; a=CreateUDN(A);
2、 ShowG(A);2.分别使用邻接矩阵表示法和邻接表表示法,用深度优先搜索法遍历该图。# include malloc.hconio.hint visited30;# define MAX_VERTEX_NUM 30# define OK 1/typedef int VertexType;typedef int InfoType;typedef struct ArcNode /弧 int adjvex; struct ArcNode *nextarc;ArcNode;typedef struct VNode/表头 int data; ArcNode *firstarc;VNode,AdjLi
3、stMAX_VERTEX_NUM;typedef struct/图 AdjList vertices; int kind;ALGraph;void CreateDG(ALGraph &G) int k,i,v1;endladjvex=v1;nextarc=NULL; G.verticesk.firstarc=p; for(int i=1;i+) int m;m; ArcNode *q; q=(ArcNode *)malloc(sizeof(ArcNode);/动态指针q) exit(-1); q-adjvex=m; /顶点给Pnextarc=q; p=q; /free(q); /free(p)
4、; void DFS (ALGraph G,int v )/深度搜索 visitedv=1;G.verticesv.datanextarc) w=x-adjvex; if(visitedw=0) DFS(G,w);void DFSB (ALGraph G,int v)/深度搜索的边集 ArcNode *y; y=(ArcNode*)malloc(sizeof(ArcNode);y) exit(-1); y=G.verticesv.firstarc; int u=G.verticesv.data; for(;y;y=y- w=y-uwnext=NULL;void EnQueue (LinkQue
5、ue &Q,int e)/进队 QNode *p; p=(QNode*)malloc(sizeof(QNode);data=e; Q.rear-next=p; Q.rear=p;int DeQueue (LinkQueue &Q,int &e)/出队 if(Q.front=Q.rear) return -1; p=Q.front-next; e=p-data;next=p- if(Q.rear=p) Q.rear=Q.front; free(p); return e;int QueueEmpty (LinkQueue Q)/判断队列是否为空 return 1;void BFS(ALGraph
6、G,int v)/广度搜索 int u; LinkQueue Q; InitQueue(Q); if(visitedv=0) EnQueue(Q,v); while(QueueEmpty(Q)!=1) DeQueue(Q,u); ArcNode *z; z=(ArcNode*)malloc(sizeof(ArcNode);z) exit(-1); z=G.verticesu.firstarc; /* for(int w=z-w=0;w=z-nextarc-adjvex) visitedw=1; EnQueue(Q,w); */z;z=z- w=z-void BFSB (ALGraph G,in
7、t v)/广度搜索的边集 ArcNode *r; r=(ArcNode*)malloc(sizeof(ArcNode);r) exit(-1); r=G.verticesu.firstarc;r!=NULL;r=r- w=r-int main() ALGraph G; CreateDG(G); int x;请输入结点数:邻接表为: for(int j=1;=x;j+)G.verticesj.dataadjvexnextarc;请输入第一个要访问的结点序号: int n;n; for( i=0;30; visitedi=0;广度搜索: BFS(G,n);边集: BFSB(G,n);深度搜索: D
8、FS(G,n); DFSB(G,n); /system(pause);3.对学生选课工程图进行拓扑排序.stdio.hstdlib.h#define MAX_VEXTEX_NUM 20#define M 20#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define ERROR 0typedef int ElemType;typedef struct ArcNodeint adjvex;struct ArcNode *nextarc;typedef struct VNodeint data;ArcNode *f
9、irstarc;VNode,AdjListMAX_VEXTEX_NUM;AdjList vertices;int vexnum, arcnum;typedef struct /构件栈ElemType *base;ElemType *top;int stacksize;SqStack;void InitStack(SqStack *); /函数声明int Pop(SqStack *, ElemType *);void Push(SqStack *,ElemType );int StackEmpty(SqStack *);void CreatGraph(ALGraph *);void FindIn
10、Degree(ALGraph , int * );void TopologicalSort(ALGraph );void InitStack(SqStack *S)/初始化栈S-base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType);if(!base)printf(memory allocation failed, goodbyeexit(1);top=S-base;stacksize=STACK_INIT_SIZE;int Pop(SqStack *S,ElemType *e)/出栈操作if(S-top=S-return ERROR;
11、*e=*-S-top;/printf(%dn,e);/ return e;return 0;void Push(SqStack *S,ElemType e)/进栈操作if(S-top-S-base=S-stacksize)base = (ElemType *)realloc(S-base,(S-stacksize+STACKINCREMENT)*sizeof(ElemType);top = S-base+S-stacksize;stacksize+=STACKINCREMENT;*S-top+=e;int StackEmpty(SqStack *S)/判断栈是否为空return OK;else
12、return ERROR;void CreatGraph(ALGraph *G)/构件图int m, n, i;ArcNode *p;请输入顶点数和边数:scanf(%d%d,&G-vexnum,&arcnum);for (i = 1; i vexnum; i+)G-verticesi.data = i;verticesi.firstarc = NULL;arcnum; i+) /输入存在边的点集合n请输入存在边的两个顶点的序号:n,&m);while (n G-vexnum | m vexnum)printf(输入的顶点序号不正确 请重新输入:p = (ArcNode*)malloc(siz
13、eof(ArcNode);if (p = NULL)memory allocation failed,goodbeyadjvex = m;nextarc = G-verticesn.firstarc;verticesn.firstarc = p;建立的邻接表为:n /输出建立好的邻接表for(i = 1;%d,G-verticesi.data);for(p = G-verticesi.firstarc; p; p = p-%3d,p-adjvex);void FindInDegree(ALGraph G, int indegree)/求入度操作int i;= G.vexnum;indegree
14、i = 0;while (G.verticesi.firstarc)indegreeG.verticesi.firstarc-adjvex+;G.verticesi.firstarc = G.verticesi.firstarc-void TopologicalSort(ALGraph G) /进行拓扑排序int indegreeM;int i, k, n;int count = 0;SqStack S;FindInDegree(G, indegree);InitStack(&S);第%d个点的入度为%d n, i, indegreei);for ( i = 1;if (!indegreei)Push(&S,i);进行拓扑排序输出顺序为: /输出结果while(!StackEmpty(&S)Pop(&S,&n);%4d,G.verticesn.data);count+;for (p = G.verticesn.firstarc; p != NULL;k = p-(-indegreek)S,k);printf(if (count G.vexnum)出现错误n排序成功nint main(void) /主函数ALGraph G;CreatGraph(&G);TopologicalSort(G);system(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1