数据结构-图的基本操作

图的基本操作-数据结构

1.创建图
2.输入元素
3.广度优先遍历BFS
4.深度优先遍历DFS

#include
#include
#include
#include
using namespace std;
typedef int Status;
#define maxnode 40
#define MAXSIZE 100
#define MVNum 100  //最大顶点数
#define null 0
#define TRUE 1
#define FALUSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char VerTexType;  //顶点为字符
typedef struct ArcNode{
     
 int adjvex;  //边 弧
 struct ArcNode *nextarc;
 int weight;
}ArcNode;  //边结点
typedef struct VNode
{
     
  VerTexType data;
  ArcNode *firstarc;
}VNode,AdjList[MVNum];  //adjlist 表示领结表类型
typedef struct
{
     
  AdjList vertices;
  int vexnum,arcnum;//图顶点数和弧数
}ALGraph,Graph,AdjGraph;
Status LocateVex(ALGraph G,int v)//根据顶点的序号查找
{
     
  int i;
  i=v;
  if(i>=0&&i<G.vexnum) return i;
  return OVERFLOW;
}
Status CreateUDG(ALGraph &G)  //创建无向图
{
     
 int i,j,k,w,v1,v2;
 ArcNode *p1,*p2;
 printf("input vexnum arcnum: \n");  //输入图总顶点数,总边数
 //cin>>G.vexnum>>G.arcnum;
 scanf("%d%d",&G.vexnum,&G.arcnum);
 for(i=0;i<G.vexnum;i++)
 {
     
   printf("input vertex data:");
   cin>>G.vertices[i].data;  //输入顶点值
   G.vertices[i].firstarc=NULL;  //初始化表头结点
 }
for(k=0;k<G.arcnum;++k)
 {
     
 printf("input List Vnode NO i:");
 scanf("%d",&v1);
 printf("input List next node NO j:");
 scanf("%d",&v2);
 i=LocateVex(G,v1);
 j=LocateVex(G,v2);
 if(i>-1&&j>-1)
 {
     
   p1=new ArcNode;  //生成一个新结点p1
   p1->weight=w;
   p1->adjvex=j;
   p1->nextarc=G.vertices[i].firstarc;
   G.vertices[i].firstarc=p1;
   p2=new ArcNode;  //对称新结点p2
   p2->adjvex=i;
   p2->nextarc=G.vertices[j].firstarc;
   G.vertices[j].firstarc=p2;
 }
 else 
 {
     
   printf("Vnode No i or j ERROR :");
   k--;
 }
 }
return OK;
}
void PrintNode(ALGraph G) //打印图中结够
{
     
 ArcNode *q;
 int i;
 printf("adjcency list of the graph:\n");
 for(i=0;i<G.vexnum;i++)
 {
     
  printf("V%d\t",i);
  printf("%c==>",G.vertices[i]);
  q=G.vertices[i].firstarc;
  while(q!=NULL)
  {
     
    printf("--> %d",q->adjvex); 
	q=q->nextarc;
  }
  printf("\n");
 }
}
bool visited[MVNum];
void DFS_AL(ALGraph G,int v)
{
     
 int w;
 ArcNode *p;
 printf("->%c",G.vertices[v].data);
 visited[v]=true;
 p=G.vertices[v].firstarc;
 while(p!=NULL)
 {
     
  w=p->adjvex;
  if(!visited[w]) DFS_AL(G,w);
  p=p->nextarc;
 }
}
typedef struct
{
     
  int *base;
  int front;
  int rear;
}SqQueue;
Status  InitQueue(SqQueue &Q)
{
     
  Q.base=new int[MAXSIZE];
  if(!Q.base) exit(OVERFLOW);
  Q.front=0;Q.rear=0;
  return OK;
}
Status EnQueue(SqQueue &Q,int e)
{
     
  if((Q.rear+1)%MAXSIZE==Q.front)
	  return ERROR;
  Q.base[Q.rear]=e;
  Q.rear=(Q.rear+1)%MAXSIZE;
  return OK;
}
Status DeQueue(SqQueue &Q,int &e)
{
     
  if(Q.front==Q.rear) return ERROR;
  e=Q.base[Q.front];
  Q.front=(Q.front+1)%MAXSIZE;
  return OK;
}

Status QueueEmpty(SqQueue Q)
{
     
 if(Q.front==Q.rear) return OK;
 else return ERROR;
}

void BFS(Graph G,int v)
{
     
 SqQueue Q;int u,w;
 cout<<"-->"<<v;
 visited[v]=true;
 InitQueue(Q);
	 EnQueue(Q,v);
 while(!QueueEmpty(Q))
 {
     
  DeQueue(Q,u);
  ArcNode *p;
  p=G.vertices[u].firstarc;
  while(p!=NULL)
  {
     
   w=p->adjvex;
   if(!visited[w])
   {
     
     cout<<"-->"<<w,visited[w]=true;
   }
   p=p->nextarc;
  }
 }
}
/*void DFS1(AdjGraph G)
{
  int i;
  for(i=0;i
void main()
{
     
  int i,j,n,k,w,v,select;
  ALGraph G1;
  CreateUDG(G1);
  PrintNode(G1);
  do{
     
   printf("\n  first  used \n");
   printf("please chose(0-6)");
   printf("   1  create graph\n");
   printf("   2   printf  algraph\n");
   printf("   3 dfs     \n");
   printf("   4   bfs    \n");
   printf("    0   exit   \n");
   printf("================");
   scanf("%d",&select);
   switch(select)
   {
     
   case 1:{
     
		   CreateUDG(G1);
		   break;
		  }
   case 2:{
     
		   PrintNode(G1);
			   break;
		  }
   case 3:{
     
		   printf("input Vertex serial number :\n");
		   cin>>v;
		   for(i=0;i<G1.vexnum;i++)
			   visited[i]=0;
		   DFS_AL(G1,v);
		   break;
		  } 
   case 4:{
     
		   printf("input vertex serial number:\n");
		   cin>>v;
		   for(i=0;i<G1.vexnum;i++)
			   visited[i]=0;
		   BFS(G1,v);
		   break;
		  }
   case 0: exit(0); 
   }

  }while(select<6);
}

:输入方式
数据结构-图的基本操作_第1张图片

你可能感兴趣的:(数据结构,数据结构,c++)