摘要: 邻接表是图的链式压缩存储,即我们只记录这个结点与哪些结点连通,没有连通的就不予记录。有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;