c - Queue中的node_add,只插入前3个作为前中后

标签 c linked-list queue logic abstract-data-type

我的插入函数对于空队列、前后相等的队列以及多一个队列都可以正常工作。在那之后似乎有一个逻辑错误。我只有 2 小时的时间来提交这个。

测试上升和下降的输出

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

删除:17 3291213 7782

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

删除:42 -22 7782

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

删除: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;

        }
    }

比较函数根据以下条件返回一个 int:

*** < 0 a < b
 = 0    a == b
 > 0    a > b***

其中“>”和“<”取决于被比较的数据

typedef struct node {
    void* data;
    struct node *next;
}node;


struct queueStruct {
    struct node *front;                     /* pointer to front of queue */
    struct node *rear;                      /* pointer to rear of queue  */
    int (*cmprFunc)(const void*a,const void*b);
    //size_t num;                               /* The compare function used for insert */
};

typedef struct queueStruct *QueueADT;       //typedef inserted for pointers, name is QueueADT

#define _QUEUE_IMPL_
#include "queueADT.h"

/// create a queue that is either sorted by cmp or FIFO
//function with two void
QueueADT que_create( int (*cmp)(const void*a,const void*b) ) {

    QueueADT new;
    new = (QueueADT)malloc(sizeof(struct queueStruct));

    if (cmp == NULL) {
        //do I create a new pointer to the cmp_int64?
        new->front = NULL;
        new->rear = NULL;
        new->cmprFunc = NULL;

    } else {
        new->cmprFunc = cmp;
        new->front = NULL;
        new->rear = NULL;
    }

    return ( new );
}

最佳答案

您的que_insert:

void que_insert( QueueADT queue, void *data ) {
    struct node *temp;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data= data;
    node *currNode, *prevNode = NULL;

    currNode = queue->front;

    if(currNode == NULL){
        //first node to add
        temp->next = NULL;
        queue->front = temp;
        queue->rear = temp;

        return;
    }

    while(currNode != NULL){
        if( /* comparison is negative */ ){
            temp->next = currNode;
            if(prevNode != NULL){
                prevNode->next = temp;
            }
            else{
                queue->front = temp;
            }

            return;
        }

        prevNode = currNode;
        currNode = currNode->next;
    }

    //add to the end
    prevNode->next = temp;
    temp->next = NULL;
    queue->rear = temp;
}

关于c - Queue中的node_add,只插入前3个作为前中后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26666130/

相关文章:

c - 如何在函数中传递参数数组指针?

php - Laravel 队列 - 如何设置 FAST 处理器

c - 访问存储在链表中的结构的属性

C: 如何检查何时 coord[xy] == coords[x][y]?

c - 如何更改我的代码(哈希表+链表)以避免内存泄漏?

c# - 二维数组中的寻路

python - python 多处理队列可以传递给子进程吗?

c - 如何设置寄存器值以启用中断?

c - sizeof(),C 结构中的对齐方式 :

c - 具有相同地址的两个不同寄存器