C 节点\加载项队列,仅插入前3个,如前、后和中

C 节点\加载项队列,仅插入前3个,如前、后和中,c,linked-list,queue,logic,abstract-data-type,C,Linked List,Queue,Logic,Abstract Data Type,我的insert函数对于空队列、前后相等的队列和一个以上的队列工作良好。在那之后,似乎有一个逻辑错误。我只有2个小时来提交这个 用于测试升序和降序的输出 测试上升队列 插入:42 17-12 9982 476 2912-22 3291213 7782 void que_insert( QueueADT queue, void *data ) { struct node *temp; temp = (struct node*)malloc(sizeof(struct node));

我的insert函数对于空队列、前后相等的队列和一个以上的队列工作良好。在那之后,似乎有一个逻辑错误。我只有2个小时来提交这个

用于测试升序和降序的输出

测试上升队列 插入:42 17-12 9982 476 2912-22 3291213 7782

void que_insert( QueueADT queue, void *data ) {
    struct node *temp;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data= data;
    node *currNode;
                //currNode = (struct node*)malloc(sizeof(struct node));
    currNode = queue->front;
    //cmp = &(queue->cmprFunc);
    if ( queue->front != NULL ) {
            if ( queue->cmprFunc == NULL ) {        //if the cmp_func is FIFO

                queue->rear->next = temp;
                queue->rear= temp;
                queue->rear->next=NULL;
                if ( queue->front == queue->rear ) {
                    currNode->next = temp;
                    queue->rear = temp;
                    temp->next= NULL;
                    }
            } else {

                while ( currNode->next != NULL ){
                    if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
                        temp->next = currNode->next;
                        currNode->next = temp;
                        break;

                    } else  {
                        currNode = currNode->next;
                        if (currNode->next != NULL )  {
                            currNode->next = temp;
                            queue->rear = temp;
                            temp->next = NULL;
                        }
                                            //exit_failure  
                    }
                }
                if ( queue->front == queue->rear ) {

                    if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
                            queue->rear = temp;
                            queue->front->next = queue->rear;
                            temp->next= NULL;
                        } else {
                            queue->front = temp;
                            temp->next = temp;

                        }
                    }
                //printf("Front is equal to next %i\n", (queue->front == queue->rear));
            }
    } else {                                                //( queue->front == NULL )
        queue->front = temp;
        queue->rear= queue->front;
        queue->front->next= queue->rear->next = NULL;

        }
    }
拆卸:17 3291213 7782

void que_insert( QueueADT queue, void *data ) {
    struct node *temp;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data= data;
    node *currNode;
                //currNode = (struct node*)malloc(sizeof(struct node));
    currNode = queue->front;
    //cmp = &(queue->cmprFunc);
    if ( queue->front != NULL ) {
            if ( queue->cmprFunc == NULL ) {        //if the cmp_func is FIFO

                queue->rear->next = temp;
                queue->rear= temp;
                queue->rear->next=NULL;
                if ( queue->front == queue->rear ) {
                    currNode->next = temp;
                    queue->rear = temp;
                    temp->next= NULL;
                    }
            } else {

                while ( currNode->next != NULL ){
                    if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
                        temp->next = currNode->next;
                        currNode->next = temp;
                        break;

                    } else  {
                        currNode = currNode->next;
                        if (currNode->next != NULL )  {
                            currNode->next = temp;
                            queue->rear = temp;
                            temp->next = NULL;
                        }
                                            //exit_failure  
                    }
                }
                if ( queue->front == queue->rear ) {

                    if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
                            queue->rear = temp;
                            queue->front->next = queue->rear;
                            temp->next= NULL;
                        } else {
                            queue->front = temp;
                            temp->next = temp;

                        }
                    }
                //printf("Front is equal to next %i\n", (queue->front == queue->rear));
            }
    } else {                                                //( queue->front == NULL )
        queue->front = temp;
        queue->rear= queue->front;
        queue->front->next= queue->rear->next = NULL;

        }
    }
测试下行队列 插入:42 17-12 9982 476 2912-22 3291213 7782

void que_insert( QueueADT queue, void *data ) {
    struct node *temp;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data= data;
    node *currNode;
                //currNode = (struct node*)malloc(sizeof(struct node));
    currNode = queue->front;
    //cmp = &(queue->cmprFunc);
    if ( queue->front != NULL ) {
            if ( queue->cmprFunc == NULL ) {        //if the cmp_func is FIFO

                queue->rear->next = temp;
                queue->rear= temp;
                queue->rear->next=NULL;
                if ( queue->front == queue->rear ) {
                    currNode->next = temp;
                    queue->rear = temp;
                    temp->next= NULL;
                    }
            } else {

                while ( currNode->next != NULL ){
                    if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
                        temp->next = currNode->next;
                        currNode->next = temp;
                        break;

                    } else  {
                        currNode = currNode->next;
                        if (currNode->next != NULL )  {
                            currNode->next = temp;
                            queue->rear = temp;
                            temp->next = NULL;
                        }
                                            //exit_failure  
                    }
                }
                if ( queue->front == queue->rear ) {

                    if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
                            queue->rear = temp;
                            queue->front->next = queue->rear;
                            temp->next= NULL;
                        } else {
                            queue->front = temp;
                            temp->next = temp;

                        }
                    }
                //printf("Front is equal to next %i\n", (queue->front == queue->rear));
            }
    } else {                                                //( queue->front == NULL )
        queue->front = temp;
        queue->rear= queue->front;
        queue->front->next= queue->rear->next = NULL;

        }
    }
拆卸:42-22 7782

测试FIFO队列 插入:42 17-12 9982 476 2912-22 3291213 7782

void que_insert( QueueADT queue, void *data ) {
    struct node *temp;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data= data;
    node *currNode;
                //currNode = (struct node*)malloc(sizeof(struct node));
    currNode = queue->front;
    //cmp = &(queue->cmprFunc);
    if ( queue->front != NULL ) {
            if ( queue->cmprFunc == NULL ) {        //if the cmp_func is FIFO

                queue->rear->next = temp;
                queue->rear= temp;
                queue->rear->next=NULL;
                if ( queue->front == queue->rear ) {
                    currNode->next = temp;
                    queue->rear = temp;
                    temp->next= NULL;
                    }
            } else {

                while ( currNode->next != NULL ){
                    if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
                        temp->next = currNode->next;
                        currNode->next = temp;
                        break;

                    } else  {
                        currNode = currNode->next;
                        if (currNode->next != NULL )  {
                            currNode->next = temp;
                            queue->rear = temp;
                            temp->next = NULL;
                        }
                                            //exit_failure  
                    }
                }
                if ( queue->front == queue->rear ) {

                    if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
                            queue->rear = temp;
                            queue->front->next = queue->rear;
                            temp->next= NULL;
                        } else {
                            queue->front = temp;
                            temp->next = temp;

                        }
                    }
                //printf("Front is equal to next %i\n", (queue->front == queue->rear));
            }
    } else {                                                //( queue->front == NULL )
        queue->front = temp;
        queue->rear= queue->front;
        queue->front->next= queue->rear->next = NULL;

        }
    }
拆卸:42 17-12 9982 476 2912-22 3291213 7782

void que_insert( QueueADT queue, void *data ) {
    struct node *temp;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data= data;
    node *currNode;
                //currNode = (struct node*)malloc(sizeof(struct node));
    currNode = queue->front;
    //cmp = &(queue->cmprFunc);
    if ( queue->front != NULL ) {
            if ( queue->cmprFunc == NULL ) {        //if the cmp_func is FIFO

                queue->rear->next = temp;
                queue->rear= temp;
                queue->rear->next=NULL;
                if ( queue->front == queue->rear ) {
                    currNode->next = temp;
                    queue->rear = temp;
                    temp->next= NULL;
                    }
            } else {

                while ( currNode->next != NULL ){
                    if (( (*(queue->cmprFunc))(currNode->next->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->next->data, temp->data) == 0 ) ) {
                        temp->next = currNode->next;
                        currNode->next = temp;
                        break;

                    } else  {
                        currNode = currNode->next;
                        if (currNode->next != NULL )  {
                            currNode->next = temp;
                            queue->rear = temp;
                            temp->next = NULL;
                        }
                                            //exit_failure  
                    }
                }
                if ( queue->front == queue->rear ) {

                    if (( (*(queue->cmprFunc))(currNode->data, temp->data) < 0 ) ||
                            ((*(queue->cmprFunc))(currNode->data, temp->data) == 0 ) ) {
                            queue->rear = temp;
                            queue->front->next = queue->rear;
                            temp->next= NULL;
                        } else {
                            queue->front = temp;
                            temp->next = temp;

                        }
                    }
                //printf("Front is equal to next %i\n", (queue->front == queue->rear));
            }
    } else {                                                //( queue->front == NULL )
        queue->front = temp;
        queue->rear= queue->front;
        queue->front->next= queue->rear->next = NULL;

        }
    }
您的que_插入:


此行至少存在一个问题:

if ( queue->front == queue->rear ) {

您已经将
temp
的值分配给
queue->rear
了几行,因此此if测试的计算结果永远不会为true。您需要重新安排分配发生的位置,或者保存旧值以供以后测试,在进行分配之前设置一个标志变量。由于这是家庭作业,您应该自己尝试解决此问题。

您是在列表的末尾还是末尾添加新节点?如果是先进先出,我通常会在开头添加节点,但如果比较(currNode,tempData)返回负数,则它会在currNode之前添加。如果compare(currNode,tempData)为正,则应将队列向后移动。我正在阅读本文,但现在必须提交,这可能比我的方法更干净。离开正数!