int main(int argc, char *argv[]) { LinkQueue* queue = LinkQueue_Create(); int a[10] = {0}; int i = 0; for(i=0; i<10; i++) { a[i] = i + 1; LinkQueue_Append(queue, a + i); } printf("Header: %d\n", *(int*)LinkQueue_Header(queue)); printf("Length: %d\n", LinkQueue_Length(queue)); LinkQueue_Clear(queue); while( LinkQueue_Length(queue) > 0 ) { printf("Retrieve: %d\n", *(int*)LinkQueue_Retrieve(queue)); } LinkQueue_Destroy(queue); return 0; }
void LinkQueue_Clear(LinkQueue* queue) // O(n) { while( LinkQueue_Length(queue) > 0 ) { LinkQueue_Retrieve(queue); } }
static void bfs(TMGraph* graph, int v, int visited[], MGraph_Printf* pFunc) { LinkQueue* queue = LinkQueue_Create(); if( queue != NULL ) { LinkQueue_Append(queue, graph->v + v); visited[v] = 1; while( LinkQueue_Length(queue) > 0 ) { int i = 0; v = (MVertex**)LinkQueue_Retrieve(queue) - graph->v; pFunc(graph->v[v]); printf(", "); for(i=0; i<graph->count; i++) { if( (graph->matrix[v][i] != 0) && !visited[i] ) { LinkQueue_Append(queue, graph->v + i); visited[i] = 1; } } } } LinkQueue_Destroy(queue); }
void LinkQueue_Clear(LinkQueue* queue)/* 由于我们在LinkQueue_Append()在#line:32中创建节点时分配了空间所以需要手工释放 */ { while( LinkQueue_Length(queue) > 0) { LinkQueue_Retrieve(queue); } }
static void bfs(TMGraph* graph, int v, int visited[], MGraph_Printf* pFunc) { LinkQueue* queue = LinkQueue_Create(); if( queue != NULL ){ LinkQueue_Append(queue, graph->v + v); // 直接+v 跳到v对应的地方 实际上就是 v[v][0] visited[v] = 1; while( LinkQueue_Length(queue) > 0 ){ int i = 0; v = (MVertex**)LinkQueue_Retrieve(queue) - graph->v; // 出队列减去 graph->v 起始地址得到偏移量 pFunc(graph->v[v]); printf(", "); for(i=0; i<graph->count; i++){ if( (graph->matrix[v][i] != 0) && !visited[i] ){ LinkQueue_Append(queue, graph->v + i); // 压人的时候 实际上是压入了定点v 这里的遍历可以理解成一颗大树 visited[i] = 1; } } } } LinkQueue_Destroy(queue); }