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);
    }
}
Exemplo n.º 3
0
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);
            }
        }
    }
}
Exemplo n.º 4
0
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]);
            }
        }
    }
}
Exemplo n.º 6
0
/**
 * 调试时参考这几个参数
 * 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]);
            }
        }
    }
}