数据结构 邻接矩阵深度及广度优先

      邻接矩阵这个想了挺久,因为数据结构的定义,网上很多直接用二位数组,这里用的是指针数组。比起二叉树应用于简单的搜索和分页,图更像是用来表示几种事物之间的复杂联系。


       


从A到D分别为矩阵第1到4列,1到4行,如Edges[0]表示的是A点与其他点的连接情况,Edges[0][1] = 1 表示为A与B相连,Edges[0][2] = 0 表示为A与C不相连。

     

     还是三个文件

      LinkMatrix.h

#include<stdio.h>

typedef char NodeType;
typedef float SideType;
typedef char DataType;

typedef struct LinkMatrix *PMatrix;
typedef struct LinkMatrix{
	int n;
	NodeType *Node;
	SideType *Side[]; 
};

typedef struct Node *PNode;
struct Node{
	DataType info;
	PNode link;
};
typedef struct LinkQueqe *PQueqe;
struct LinkQueqe{
	PNode f;
	PNode b;
};

PMatrix createMatrix(int n);
void printMatrix(PMatrix pmatrix);
void depthOrder(PMatrix pmatrix,NodeType node);
void breadthOrder(PMatrix pmatrix,NodeType node);
void recovervisit(int visited[100],int n);
void breadthpushQueqe(PMatrix,NodeType node);
NodeType adjacent(PMatrix pmatrix,NodeType node); 
NodeType nextadjacent(PMatrix pmatrix,NodeType node,int from);
PQueqe createQueqe();
void pushQueqe(PQueqe pqueqe,DataType element);
void popQueqe(PQueqe pqueqe);
DataType topQueqe(PQueqe pqueqe); 
int findNode(PMatrix pmatrix,NodeType node);


     LinkMatrix.c


#include "LinkMatrix.h"
int visited[100];

void recovervisit(int visited[100],int n){
	int i;
	for(i= 0; i<n;i++){
		visited[i] = 0;
	}
}

PQueqe createQueqe(){
	PQueqe pqueqe = (PQueqe)malloc(sizeof(struct LinkQueqe));
	if(pqueqe == NULL) printf("create fail");
	pqueqe ->f = NULL;
	pqueqe ->b = NULL;
	return pqueqe;
}

void pushQueqe(PQueqe pqueqe,DataType element){
	PNode p = (PNode)malloc(sizeof(struct Node));
	if(p == NULL) printf("nothing push");
	p ->info = element;
	p ->link = NULL;
	if(pqueqe ->f == NULL){
		 pqueqe->f = p;
	//printf(" f  %5d\n",pqueqe->f->info);
	}
	else pqueqe ->b ->link = p;
	pqueqe ->b = p;
	//	printf("b   %d\n",pqueqe->b->info);
}

void popQueqe(PQueqe pqueqe){
	PNode p;
    if(!pqueqe) printf("queqe is empty");
    p = pqueqe ->f;
    pqueqe ->f = p->link;
    free(p);  
}

DataType topQueqe(PQueqe pqueqe){
	if(pqueqe->f == NULL){
		printf("nothing top");
		return NULL;
	} 
	return pqueqe -> f->info ;
}


void printQueqe(PQueqe pqueqe){
	PNode p = pqueqe ->f;
    if(	!pqueqe){
		printf("nothing print");
	} 
	while(pqueqe->f!= NULL){
		printf("%c\n",pqueqe->f->info);
		pqueqe ->f = pqueqe ->f ->link;
	} 
	pqueqe ->f = p;//此处的f随着link的变化变化  最后需要还原回去! 
}

PMatrix createMatrix(int n){
	PMatrix pmatrix = (PMatrix)malloc(sizeof(struct LinkMatrix));
	int i,j;
	if(!pmatrix){
		printf("create fail");
	}else{
		//printf("test");
		pmatrix ->n = n;
		recovervisit(visited,n);
		pmatrix ->Node = (NodeType *)malloc(sizeof(NodeType)*n);
		for(i = 0; i < n; i++){		
			pmatrix ->Side[i] = (SideType *)malloc(sizeof(SideType)*n);
			for(j = 0; j < n ; j++)
			pmatrix ->Side[i][j] = 0;
		}
	//	printf("test");
	}
	
	return pmatrix;
	
}
void printMatrix(PMatrix pmatrix){
	int i,j;
	for(i = 0; i < pmatrix->n; i++){		
		for(j = 0; j < pmatrix->n ; j++){
			if(pmatrix ->Side[i][j] == 1)
				printf("%c -> %c \n",pmatrix->Node[i],	pmatrix ->Node[j]);
		}			
	}
}

void depthOrder(PMatrix pmatrix,NodeType node){
	int n,i,j;	
	for(i = 0; i < pmatrix->n; i++){
			if(pmatrix ->Node[i] == node)
				n = i;
	}//找到这个node在矩阵中的位置。 
	printf("%c\n",pmatrix->Node[n]);
	visited[n] = 1;
	for(i = 0; i < pmatrix->n; i++){		
		if(pmatrix ->Side[i][n] == 1 && visited[i] != 1){		
			depthOrder(pmatrix,pmatrix->Node[i]);
		}									
	}

}

int findNode(PMatrix pmatrix,NodeType node){
	int i,n;
	for(i = 0; i < pmatrix->n; i++){
			if(pmatrix ->Node[i] == node)
				n = i;
	}
	return n;
}//找到这个node在矩阵中的位置。

NodeType adjacent(PMatrix pmatrix,NodeType node){
	int n,i,j;	
	for(i = 0; i < pmatrix->n; i++){
			if(pmatrix ->Node[i] == node )
				n = i;
	}//找到这个node在矩阵中的位置。 
	for(i = 0; i < pmatrix->n; i++){		
		if(pmatrix ->Side[i][n] == 1 && visited[i] == 0){		
			return pmatrix ->Node[i];
		}									
	}
	return NULL;
}

NodeType nextadjacent(PMatrix pmatrix,NodeType node,int from){
	int n,i,j;	
	for(i = 0; i < pmatrix->n; i++){
			if(pmatrix ->Node[i] == node)
				n = i;
	}//找到这个node在矩阵中的位置。 
	for(i = from+1; i < pmatrix->n; i++){		
		if(pmatrix ->Side[i][n] == 1 && visited[i] == 0){		
			return pmatrix ->Node[i];
		}									
	}
	return NULL;
}

void breadthOrder(PMatrix pmatrix,NodeType node){
	PQueqe pqueqe;  
	int n,i,j;	
	recovervisit(visited,pmatrix->n);//将深度优先时 visited的值变回0
	breadthpushQueqe(pmatrix, node);
	while(node!= NULL){
		node = adjacent(pmatrix,node);
	if(visited[findNode(pmatrix,node)] == 0)
		breadthpushQueqe(pmatrix, node);
	} 
	
	
}

void breadthpushQueqe(PMatrix pmatrix,NodeType node){
	int i,n,count;
	NodeType ftemp,temp;
	PQueqe pqueqe = createQueqe();
	n = findNode(pmatrix,node);
		if(visited[n] == 0 && n != 1){
			pushQueqe(pqueqe,node);			
			printf("%c\n",topQueqe(pqueqe));		
			popQueqe(pqueqe);
			visited[n] = 1;
		}
		temp = adjacent(pmatrix,node);
		n = findNode(pmatrix,temp);
		while(temp != NULL && visited[n] == 0) {
			n = findNode(pmatrix,temp); 
			pushQueqe(pqueqe,temp); 	
			printf("%c\n",topQueqe(pqueqe));
			if(nextadjacent(pmatrix,temp,n)== NULL)
				visited[n] = 1;	 
			popQueqe(pqueqe);
			temp = nextadjacent(pmatrix,node,n);		
		}
 
}


   main.c


#include "LinkMatrix.h"

int main(){
	PMatrix p = createMatrix(4);
	p -> Node[0] = 'A';
	p -> Node[1] = 'B';
	p -> Node[2] = 'C';
	p -> Node[3] = 'D';
	
	p->Side[0][1] = 1;
	p->Side[0][4] = 1;
	p->Side[1][0] = 1;
	p->Side[1][2] = 1;
	p->Side[1][3] = 1;
	p->Side[2][1] = 1;
	p->Side[3][0] = 1;
	p->Side[3][1] = 1;
//数组越界 程序自动崩溃 
	printf("output the linkmatrix : \n"); 
	printMatrix(p);	
	printf("output the linkmatrix in depthorder : \n");
	depthOrder(p,p->Node[0]);
	printf("output the linkmatrix in depthorder : \n");
	breadthOrder(p,p->Node[0]);
	return 0;
}


   深度优先用一个递归即可,麻烦的是广度优先,因为要把一个点周围的点取出来,所以用到队列,放进队列后,要标记好其余的点,再循环此步,在这一步写得有漏洞,再去参考别人的代码,看看别人怎么写,再改到最好。

    自己写和自己之前纯抄有很大区别,之前没有多用心学,感觉很复杂,静下心后,慢慢敲,接下来捣鼓一下排序的算法,差不多就完成了。

       

 

posted @ 2013-08-15 17:59  pangbangb  阅读(461)  评论(0编辑  收藏  举报