void ListLeaves(BT* btArray, int root) { BT bt; bool isFirst = true; BTQ btQ = CreatBTQueue(); Add2Queue(btQ, btArray[root]); while(!IsEmpty(btQ)) { bt = DeleteQ(btQ); if(bt->Left == -1 && bt->Right == -1) { if(!isFirst) { printf(" "); } printf("%d", bt->Data); isFirst = false; } else { if (bt->Left != -1) { Add2Queue(btQ, btArray[bt->Left]); } if (bt->Right != -1) { Add2Queue(btQ, btArray[bt->Right]); } } } }
void LevelorderTraversal(AVLTree root){ Queue Q; if(root == NULL) return; Q = CreatQueue(100); AddQ(Q,root); while(!IsEmpty(Q)){ root = DeleteQ(Q); if(flag == 0){ flag = 1; }else printf(" "); printf("%d",root->Data); if(root->Left != NULL) AddQ(Q,root->Left); if(root->Right != NULL) AddQ(Q,root->Right); } }
void BFS(int i) { G->Visited[i] = 1; printf("%d ", i); AddQ(Q, i); while (!IsEmptyQ(Q)) { int j = DeleteQ(Q); int k; for (k = 0; k < G->n; k++) { if (!G->Visited[k] && G->Edges[j][k]) { G->Visited[k] = 1; printf("%d ", k); AddQ(Q, k); } } } }
double QueueingAtBank( Queue Q, int N ) { /* 模拟排队并计算平均等待时间 */ struct People Next, Wait; int TotalTime, CurrentTime; int i = N; TotalTime = CurrentTime = 0; Wait = Enter( &i ); /* 至少可以读入一位顾客信息 */ AddQ( Q, Wait ); /* 该顾客排队 */ if (!i) { /* 如果只有1位顾客,则无须等待,直接返回 */ Next = FrontQ(Q); printf("%s\n", Next.Name); return 0.0; } else Wait = Enter( &i ); /* 否则读入下一位顾客信息 */ while ( !IsEmpty(Q) || (Wait.T >= 0) ) { if ( !IsEmpty(Q) ) { /* 如果有人排队 */ Next = FrontQ(Q); /* 下一位顾客准备接受服务 */ printf("%s\n", Next.Name); if ( CurrentTime >= Next.T ) /* 如果Next有等待,累计时间 */ TotalTime += (CurrentTime - Next.T); else /* 否则窗口空闲一段时间,更新当前时间到顾客Next的到达时间 */ CurrentTime = Next.T; /* 更新当前时间到顾客Next处理完事务的时间 */ CurrentTime += Next.P; while ( (Wait.T >= 0) && (Wait.T <= CurrentTime) ) { /* 将输入中所有在顾客Next离开前到达的人入列 */ AddQ( Q, Wait ); Wait = Enter( &i ); } DeleteQ(Q); /* 顾客Next办理完毕离开 */ } else { /* 如果没人排队,读入下面2位顾客的输入信息,并令第1人入列 */ AddQ( Q, Wait ); Wait = Enter( &i ); } } return ((double)TotalTime/(double)N); }
void BFS(V VertexNode, V *AdjacencyList, bool *VertexVisited) { VertexQueue VQ = CreateQueue(); Add2Queue(VQ, VertexNode); while (!IsEmpty(VQ)) { V TempVertex = DeleteQ(VQ); if (!VertexVisited[TempVertex->ID]) { printf("%d ", TempVertex->ID); VertexVisited[TempVertex->ID] = true; } while (TempVertex->Next) { TempVertex = TempVertex->Next; if (!VertexVisited[TempVertex->ID]) { Add2Queue(VQ, AdjacencyList[TempVertex->ID]); } } } }
/** * 调试时参考这几个参数 * q->rear * q->front * IsFull(q) * q->front%MaxSize * (q->rear + 1) % MaxSize * isEmpty(q) */ int main() { Queue *q = CreateQueue(); AddQ(q, 1); DeleteQ(q); AddQ(q, 2); DeleteQ(q); AddQ(q, 3); DeleteQ(q); AddQ(q, 4); DeleteQ(q); AddQ(q, 5); DeleteQ(q); AddQ(q, 6); DeleteQ(q); AddQ(q, 7); AddQ(q, 8); // printf("队列%s\r\n", IsFullQ(q) ? "满" : "未满"); }
void BFS(Vertex V, Vertex *AdjacencyList, int *WeightsOfDistance, int *WeightsOfPrice) { VertexQueue VQ = CreateQueue(); Add2Queue(VQ, V); while (!IsEmpty(VQ)) { V = DeleteQ(VQ); int FatherID = V->ID; while (V->Next) { V = V->Next; int ID = V->ID, WD = V->WeightOfDistance, WP = V->WeightOfPrice; if ( WeightsOfDistance[ID] == -1 || WeightsOfDistance[ID] > WD + WeightsOfDistance[FatherID] || (WeightsOfDistance[ID] == WD + WeightsOfDistance[FatherID] && WeightsOfPrice[ID] > WP + WeightsOfPrice[FatherID]) ) { WeightsOfDistance[ID] = WD + WeightsOfDistance[FatherID]; WeightsOfPrice[ID] = WP + WeightsOfPrice[FatherID]; Add2Queue(VQ, AdjacencyList[ID]); } } } }