数据结构笔记整理1

图的操作

  • 第一次写博客,还不会使用md
    • 图的操作

第一次写博客,还不会使用md

先把所有的笔记贴上了,顺便熟悉一下md的使用。慢慢整理,笔记太多太杂了。

图的操作

大学学习严蔚敏的数据结构,一下是图的一些常见操作

/*创建无向网UDN*/
int CreateUDN(MGraph * G){
	int w = 0;
	char v1,v2;
	int IncInfo = 0;
	scanf("%d%d%d", &G->vexnum, &G->arcnum),&IncInfo);
	for (int i = 0; i < G->vexnum; ++i){
		scanf("%d", &G->vexs[i]);
	}
	//初始化矩阵
	for (int i = 0; i < G->vexnum; ++i){
		for (int j = 0; j < G->vexnum; ++j){
			G->arcs[i][j].adj = 0;
			G->arcs[i][j].info = NULL;
		}
	}
	//构造邻接矩阵
	for (int k = 0; k < G->arcnum; ++k){
		scanf("%c%c%d", &v1, &v2, &w);
		int i = LocateVex(G, v1);
		int j = LocateVex(G, v2);
		G->arcs[i][j].adj = w;
		G->arcs[j][i].adj = w;
		//if(IncInfo)
		//	Input(G,i,j);
	}
	return OK;
}
/*创建无向图UDG*/
Status CreateUDG(MGraph *G){
  int i,j,k;
  char v1[20],v2[20];
  scanf("%d%d",&G->vexnum,&G->arcnum);

  for(i=0;i<G->vexnum;i++) 
	  scanf("%s",G->vexs[i]);
  for(i=0;i<G->vexnum;i++)
    for(j=0;j<G->vexnum;j++){
      G->arcs[i][j].adj=0;
      G->arcs[i][j].info=NULL;
    }
  for(k=0;k<G->arcnum;k++){
    scanf("%s%s",v1,v2);
    i=LocateVex(*G,v1);
    j=LocateVex(*G,v2);
    G->arcs[i][j].adj=G->arcs[j][i].adj=1;
  }
  return OK;
}
/*对节点v的定位*/
Status LocateVex(MGraph G,char * v){
  for(int i=0;i<G.vexnum;i++)
    if(!strcmp(G.vexs[i],v)) return i;
  return -1;
}
/*寻找图G中定点V的下一个点的位置*/
Status FirstAdjVex(MGraph G,int v){
  for(int j=0;j<G.vexnum;j++)
    if(G.arcs[v][j].adj) 
		return j;
  return -1;
}
/*寻找图G中和定点V同层次的点的位置*/
Status NextAdjVex(MGraph G,int v,int w){
  if(!G.arcs[v][w].adj) 
	  return -1;
  for(int k=w+1;k<G.vexnum;k++)
    if(G.arcs[v][k].adj) 
		return k;
  return -1;
}
/*深度优先搜索*/
void DFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)){
  VisitFunc=Visit;
  for(int i=0;i<G.vexnum;i++)
	  visited[i]=FALSE;
  for(int i=0;i<G.vexnum;i++)
    if(!visited[i]) DFS(G,i);
}
/*递归-深度优先搜索*/
void DFS(MGraph G,int v){
  visited[v]=TRUE;
  (*VisitFunc)(G,v);
  for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
    if(!visited[w]) 
		DFS(G,w);
}
/*广度优先搜索*/
void BFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)){
  int i,w,u;
  LinkQueue Q;
  for(i=0;i<G.vexnum;i++) 
	  visited[i]=FALSE;
  InitQueue(&Q);
  for(i=0;i<G.vexnum;i++)
    if(!visited[i]){
      visited[i]=TRUE;
      (*Visit)(G,i);
      EnQueue(&Q,i);
      while(!QueueEmpty(Q)){
		DeQueue(&Q,&u);
		for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)){			
		  if(!visited[w]){
			visited[w]=TRUE;
			(*Visit)(G,w);
			EnQueue(&Q,w);
		  }
		}
      }
    }
}
/*创建邻接表*/
Status Create(ALGraph *G){
  int i,j,k;
  char v1[20],v2[20];
  ArcNode *p,*q;
  fscanf("%d%d",&G->vexnum,&G->arcnum);

  for(i=0;i<G->vexnum;i++) {
    scanf("%s",G->vertices[i].data);
    G->vertices[i].firstarc=NULL;
  }

  for(k=0;k<G->arcnum;k++){
    scanf("%s%s",&v1,&v2);
    i=LocateVex(*G,v1);
    j=LocateVex(*G,v2);
    p=(ArcNode*)malloc(sizeof(ArcNode));
    p->nextarc=G->vertices[i].firstarc;
    G->vertices[i].firstarc=p;
    p->adjvex=j;

    q=(ArcNode*)malloc(sizeof(ArcNode));
    q->nextarc=G->vertices[j].firstarc;
    G->vertices[j].firstarc=q;
    q->adjvex=i;
  }
}
/*寻找图G中定点V的下一个点的位置*/
Status FirstAdjVex(ALGraph G,int v){
  ArcNode *p;
  if(p=G.vertices[v].firstarc)
    return p->adjvex;
  return -1;
}
/*寻找图G中和定点V同层次的点的位置*/
Status NextAdjVex(ALGraph G,int v,int w){
  ArcNode *p;
  for(p=G.vertices[v].firstarc;p->adjvex!=w;p=p->nextarc);
  if(p=p->nextarc)
    return p->adjvex;
  else
    return -1;
}
/*对节点v的定位*/
Status LocateVex(ALGraph G,char *v){
  for(int i=0;i<G.vexnum;i++)
    if(!strcmp(G.vertices[i].data,v)) 
		return i;
  return -1;
}
/*数组存储转链式存储(邻接表)*/
Status MGtoALG(MGraph G,ALGraph *ALG){
  int i,j;
  ArcNode *p;
  ALG->vexnum=G.vexnum;
  ALG->arcnum=G.arcnum;
  for(i=0;i<G.vexnum;i++){
    strcpy(ALG->vertices[i].data,G.vexs[i]);
    ALG->vertices[i].firstarc=NULL;
  }
  for(i=0;i<G.vexnum;i++)
    for(j=0;j<G.vexnum;j++){
      if(G.arcs[i][j].adj){
        p=(ArcNode*)malloc(sizeof(ArcNode));
        p->nextarc=ALG->vertices[i].firstarc;
        ALG->vertices[i].firstarc=p;
        p->adjvex=j;         
      }    
    }
}

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