数据结构17:邻接表及其广度遍历

摘要: 邻接表是图的链式压缩存储,即我们只记录这个结点与哪些结点连通,没有连通的就不予记录。有N个结点就要用N个链表来存储他们的连通关系。一.代码块由于我们写的代码是由之前的二维数组图结构转化为邻接表结构,所以之前写的代码很大一部分用得上,我们先copy过来1)copy代码#define MAXSIZE 10int* visited; typedef struct graph{ int** connections; int numNodes;}*graphPtr;typedef
摘要由CSDN通过智能技术生成

摘要: 邻接表是图的链式压缩存储,即我们只记录这个结点与哪些结点连通,没有连通的就不予记录。有N个结点就要用N个链表来存储他们的连通关系。
一.代码块
由于我们写的代码是由之前的二维数组图结构转化为邻接表结构,所以之前写的代码很大一部分用得上,我们先copy过来
1)copy代码

#define MAXSIZE 10

int* visited;  

typedef struct graph
{
   
	int** connections;
	int numNodes;
}*graphPtr;

typedef struct graphQueue
{
   
	int *node;
	int front;
	int rear;
}*graphQueuePtr;

graphQueuePtr queueInit()
{
   
	graphQueuePtr resultQueue = (graphQueuePtr)malloc(sizeof(struct graphQueue));
	resultQueue->node = (int*)malloc(MAXSIZE * sizeof(int));
	
	resultQueue->front = 0;
	resultQueue->rear = 0;
	return resultQueue;
}

void enqueue(graphQueuePtr paraQueue,int paraData)
{
   
	if((paraQueue->rear + 1) % MAXSIZE == (paraQueue->front) % MAXSIZE)
	{
   
		printf("队列满了,无法入队!\n");
		return ;
	}
	
	paraQueue->node[(paraQueue->rear) % MAXSIZE] = paraData;
	paraQueue->rear = (paraQueue->rear + 1) % MAXSIZE;
}

int dequeue(graphQueuePtr paraQueue)
{
   
	if(paraQueue->front == paraQueue->rear)
	{
   
		printf("队列为空,无法出队!\n");
		return ;
	}
	
	int temp =  paraQueue->node[(paraQueue->front) % MAXSIZE];
	paraQueue->front = (paraQueue->front + 1) % MAXSIZE;
	
	return temp;
}
  
void visitedInit(AdjacencyListPtr paraPtr)
{
   
	int i;
	visited = (int*)malloc(paraPtr->numNodes * sizeof(int));
	
	for(i = 0;i < paraPtr->numNodes;i ++)
	{
   
		visited[i] = 0;
	}
}
 
graphPtr graphInit(int **paraConnections,int paraNumNodes)
{
   
	int i,j;
	graphPtr resultGraph = (graphPtr)malloc(sizeof(struct graph));
	resultGraph->numNodes = paraNumNodes;
	
	//这里如何给二维数组动态分配空间如果不明白可以参考我以前的二维数组文章 
	resultGraph->connections = (int**)malloc(resultGraph->numNodes * sizeof(int*));
	for(i = 0;i < resultGraph->numNodes;i ++)
	{
   
		resultGraph->connections[i] = (int*)malloc(resultGraph->numNodes * sizeof(int));
	}
	
	for(i = 0;i < resultGraph->numNodes;i ++)
		for(j = 0;j < resultGraph->numNodes;j ++)
		{
   
			resultGraph->connections[i][j] = paraConnections[i][j];
		}
		
	return resultGraph;
}

2)邻接表的结构体定义

第一个结构体是邻接表每个链表的结点的定义。

第二个结构体包括了邻接表的元素个数,即包含多少个链表。struct AdjacencyNode* headers;这句代码是相当于定义了一个链表数组,每一个元素都是一个链表,但是目前都只有头结点

typedef struct AdjacencyNode
{
   
	int column;
	struct AdjacencyNode* next;
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值