데이터 구조 도의 기본 조작 실현

실험 제목: 그림 의 기본 조작 실현               
실험 환경:   Visual C++ 6.0                    
실험 목적: 그림 의 인접 행렬 과 인접 표 두 개의 저장 구조 와 표 시 를 파악 한다.
          그림 의 DFS 와 BFS 두 가지 스 트 리밍 알고리즘 을 파악 합 니 다.
          다음 의 전체 알고리즘 의 기본 사상 과 알고리즘 실현 방법 을 이해 하고 파악 한다. 최소 생 성 트 리 알고리즘, 최 단 경로 알고리즘, 토폴로지 정렬 알고리즘 과 관건 적 인 경로 알고리즘 이다.
실험 내용: 1. 무 방향 도 를 만 들 고 DFS 와 BFS 를 각각 진행 합 니 다.
          2. 최 단 경로, 최소 생 성 트 리, 토폴로지 정렬 세 가지 알고리즘 을 실현 합 니 다.
#include    
#include    
#include    
#include    
#include    
#include    
#define OK 1    
#define ERROR 0    
#define OVERFLOW -2    
#define MaxInt 32767    
#define MVNum 100    
using namespace std;    
typedef int Status;    
bool visited[MVNum];        
typedef struct    
{    
    int vexs[MVNum];//        
    int arcs[MVNum][MVNum];//         
    int vexnum,arcnum; //              
}AMGraph;    
Status CreateUDN(AMGraph &G)//               
{    
    int i,j,k,w;    
    int v1,v2;    
    printf("          
"); cin>>G.vexnum>>G.arcnum;// , for(i=0;i>v1>>v2>>w; G.arcs[v1][v2]=w; G.arcs[v2][v1]=w; } return OK; } Status CreateDirUDN(AMGraph &G)// { int i,j,k,w; int v1,v2; printf("
"); cin>>G.vexnum>>G.arcnum;// , for(i=0;i>v1>>v2>>w; G.arcs[v1][v2]=w; } return OK; } typedef struct ArcNode// { int adjvex;// struct ArcNode * nextarc;// //OtherInfo info;// }ArcNode; typedef struct VNode// { int data; ArcNode *firstarc;// }VNode,AdjList[MVNum]; typedef struct { AdjList vertices; int visited[MVNum]; int vexnum,arcnum;// }ALGraph; Status CreateUDG(ALGraph &G)// { ArcNode *p1,*p2; int v1,v2,i,j,k; printf("
"); cin>>G.vexnum>>G.arcnum; for(i=0;i>i>>j; p1=(ArcNode *)malloc(sizeof(ArcNode)); p1->adjvex=j; p1->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=p1;// *P1 Vi p2=(ArcNode *)malloc(sizeof(ArcNode)); p2->adjvex=i; p2->nextarc=G.vertices[j].firstarc; G.vertices[j].firstarc=p2; } return OK; } Status CreateDirUDG(ALGraph &G)// { ArcNode *p1,*p2; int v1,v2,i,j,k; printf("
"); cin>>G.vexnum>>G.arcnum; for(i=0;i>i>>j; p1=(ArcNode *)malloc(sizeof(ArcNode)); p1->adjvex=j; p1->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=p1;// *P1 Vi } return OK; } void DFS_AL(ALGraph G,int v) {// G , V G ArcNode *p; int w; cout<adjvex;//w V if(!visited[w])// W , DFS__AL DFS_AL(G,w); p=p->nextarc;//p } } typedef struct// { int *base; int front; int rear; }SqQueue; Status InitQueue(SqQueue &Q) {// Q.base=(int*)malloc(sizeof(int)*MVNum) ; if(!Q.base) exit(OVERFLOW); Q.front=Q.rear=0; return OK; } Status EnQueue(SqQueue &Q,int v) {// v Q if((Q.rear+1)%MVNum==Q.front) return ERROR; Q.base[Q.rear]=v;// Q.rear=(Q.rear+1)%MVNum;// return OK; } Status DeQueue(SqQueue &Q,int &v) {// Q , V if(Q.front==Q.rear) return ERROR; v=Q.base[Q.front];// Q.front=(Q.front+1)%MVNum;// return OK; } Status QueueEmpty(SqQueue &Q)// { if(Q.front==Q.rear) return 1; return 0; } void Visit(ALGraph &G,int i) { printf(" %d",G.vertices[i].data) ; G.visited[i]=1; // 1 } void BFS_AL(ALGraph G,int v) {// G SqQueue Q; ArcNode *w; int u; cout<nextarc) {// u w if(!G.visited[w->adjvex] ) { Visit(G,w->adjvex); EnQueue(Q,w->adjvex); } } } printf("
"); } struct node { int adjvex;// U int lowcost;// }closedge[MVNum]; void MiniSpanTree_Prim(AMGraph G,int k) {// G , u G T, T //k=LocateVex(G,u);//k u int i,j,u0,v0,minn; for(j=0;j0) { if(closedge[j].lowcostadjvex]++; G.vertices[i].firstarc=G.vertices[i].firstarc->nextarc; } } } Status TopologicalSort(ALGraph &G)// { SqStack S; int i,m,k,v; int indegree[1100]; ArcNode *p; InitStack(S); Findindegree(G,indegree); printf(" :
"); for(i=0;inextarc) { k=p->adjvex; if(!(--indegree[k])) Push(S,k); } } printf("
"); printf("
"); } int main() { AMGraph G,T; ALGraph M,N,R; int v,k; printf("************************
"); printf("1.DFS
"); printf("2.BFS
"); printf("3.
"); printf("4.
"); printf("5.
"); printf("0.
"); printf("************************
"); int choose=-1; while(choose) { printf(" :
"); scanf("%d",&choose); switch(choose) { case 1: { printf("
:"); CreateUDG(M); printf("
"); printf("
"); scanf("%d",&v); DFS_AL(M,v); break; } case 2: { printf("
"); CreateUDG(N); printf("
"); printf("
"); scanf("%d",&v); BFS_AL(N,v); break; } case 3: { printf("
"); CreateUDN(G); printf("
"); printf("
"); scanf("%d",&k); MiniSpanTree_Prim(G,k); break; } case 4: { printf("
"); CreateDirUDN(T); printf("
"); printf("
"); scanf("%d",&k); ShortestPath_DIJ(T,k); break; } case 5: { printf("
"); CreateDirUDG(R); printf("
"); TopologicalSort(R); break; } } } return 0; }

좋은 웹페이지 즐겨찾기