您的位置:首页 > 其它

邻接表实现图的遍历

2008-05-02 18:17 176 查看

#include <iostream>


#include <cstdio>


#define N 10


using namespace std;


char B
;






class AdjGraph...{ //链式无向图


public:




AdjGraph()...{ vexnum=arcnum=0; }




~AdjGraph()...{ system("pause");}


void CreateGraph();


void DestroyGraph();


void GetVex(int v); //输出下标v的信息


void DeleteArc(int v); //删除下标v的结点和与其对应的弧


void InsertArc(char v,int m); //插入data为v的结点建立与其对应的弧


void DfsTraverse(int v); //深度优先遍历


void BfsTraverse(int v); //广度优先遍历




private:




typedef struct ArcNode...{ //表域


int adjvex;


struct ArcNode *next;


}ArcNode;


ArcNode *p;




typedef struct VNode...{ //顶点域


char data;


ArcNode *firstarc;


}VNode;


VNode AdjList
;


int vexnum,arcnum; //顶点数和弧数


};






void AdjGraph::CreateGraph()...{


printf("Input Vexnums Arcnums: ");


cin>>vexnum>>arcnum;


printf("Input Node value: ");


for(int i=0;i<vexnum;++i)




...{


cin>>AdjList[i].data;


AdjList[i].firstarc=NULL;


}


int m=0,n=0;


printf("Input the Arc message: ");


for(int j=0;j<arcnum;++j)




...{


cin>>m>>n;


p=new ArcNode;


p->adjvex=n;


p->next=AdjList[m].firstarc;


AdjList[m].firstarc=p; //插入到表头


p=new ArcNode;


p->adjvex=m;


p->next=AdjList
.firstarc;


AdjList
.firstarc=p;


}


}






void AdjGraph::DestroyGraph()...{


for(int i=0;i<vexnum;++i)




...{


while(AdjList[i].firstarc)




...{


p=AdjList[i].firstarc;


AdjList[i].firstarc=p->next;


delete p;


}


}


}






void AdjGraph::GetVex(int v)...{


p=AdjList[v].firstarc;


int i=0;


printf("Index %d vex message is: ",v);


while(p)




...{


printf("[%c] --- [%c] ",AdjList[v].data,AdjList[p->adjvex].data);


p=p->next;


}


}






void AdjGraph::DeleteArc(int v)...{ //delete index 2 arc


p=AdjList[v].firstarc;


while(p)




...{


ArcNode *q1=AdjList[p->adjvex].firstarc;


ArcNode *q2=q1;


if(q1->adjvex==v)


AdjList[p->adjvex].firstarc=q1->next;


else




...{


while(q1->adjvex!=v)




...{


q2=q1;


q1=q1->next;


}


q2->next=q1->next;


}


delete q1;


AdjList[v].firstarc=p->next;


delete p;


p=AdjList[v].firstarc;


}


AdjList[v].data='*';


}






void AdjGraph::InsertArc(char v,int m)...{


int i;


for(i=0;i<vexnum;++i)


if(AdjList[i].data=='*')




...{


AdjList[i].data=v;


break;


}


p=new ArcNode;


p->adjvex=m;


p->next=AdjList[i].firstarc;


AdjList[i].firstarc=p;


p=new ArcNode;


p->adjvex=i;


p->next=AdjList[m].firstarc;


AdjList[m].firstarc=p;


}






void AdjGraph::DfsTraverse(int v)...{


printf("%c ",AdjList[v].data);


B[v]='1';


p=AdjList[v].firstarc;


while(p)




...{


if(B[p->adjvex]=='0')




...{


printf("%c ",AdjList[p->adjvex].data);


B[p->adjvex]='1';


}


p=p->next;


}


for(v=0;v<vexnum;++v)


if(B[v]=='0')


DfsTraverse(v);


}






void AdjGraph::BfsTraverse(int v)...{


int Queue
;


int front=-1,rear=-1;


printf("%c ",AdjList[v].data);


B[v]='1';


Queue[++rear]=v;


while(front!=rear)




...{


v=Queue[++front];


p=AdjList[v].firstarc;


while(p)




...{


if(B[p->adjvex]=='0')




...{


printf("%c ",AdjList[p->adjvex].data);


B[p->adjvex]='1';


Queue[++rear]=p->adjvex;


}


p=p->next;


}


}


}






int main()...{


AdjGraph LG;


LG.CreateGraph();


LG.DeleteArc(2);


memset(B,'0',sizeof(B));


printf(" DfsTraverse: ");


LG.DfsTraverse(0);


printf(" Insert 'F',create arc [F] --- [A]. ");


LG.InsertArc('F',0);


LG.GetVex(0);


LG.GetVex(1);


LG.GetVex(2);


LG.GetVex(3);


LG.GetVex(4);


memset(B,'0',sizeof(B));


printf(" DfsTraverse: ");


LG.DfsTraverse(0);


memset(B,'0',sizeof(B));


printf(" BfsTraverse: ");


LG.BfsTraverse(1);


LG.DestroyGraph();


return 0;


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: