【问题标题】:Enqueue/Dequeue/Insert struct in a queue在队列中入队/出队/插入结构
【发布时间】:2016-06-18 12:49:00
【问题描述】:

我有一个包含指针next 的结构。我正在尝试创建一个结构队列,但是当我调用enqueue/dequeue 时,我最终在尝试写入信息时遇到错误;不知道是不是因为enque/dequeue/insert。只是学习 C 而不是很确定 free/malloc 或者是否有必要。插入基于 int 值(最小值在前)。

struct queue { 
    struct RCB* front; 
    struct RCB* back; 
};

/*Initialize queue */ 
struct queue* new_queue(void){
    struct queue* tmp = malloc( 1 * sizeof(tmp));  
    tmp->front = NULL; 
    tmp->back = NULL;
    return tmp;  
}

/*Add RCB to Queue FIFO */
struct queue* enqueue(struct queue* queue, struct RCB* rcb){
    if(queue->front == NULL && queue->back == NULL){
        queue->front = rcb; 
        queue->back = rcb;
            printf("added front to queue\n");  
        return queue; 
    }
    else {
        queue->back->next = rcb; 
        queue->back = rcb;
            printf("added to queue\n");  
    }
    return queue; 
} 

/*Remove RCB from Queue FIFO */ 
struct RCB* dequeue(struct queue* queue){
    struct RCB *tmp1 = (struct RCB *)malloc(sizeof(struct RCB)); 
    struct RCB *tmp2 = (struct RCB *)malloc(sizeof(struct RCB)); 
    if(queue->front == NULL && queue->back == NULL){
        printf("queue is empty\n"); 
    }   
    tmp1 = queue->front; 
    tmp2 = tmp1->next; 
    queue->front = tmp2; 
    if(queue->front == NULL){
        queue->back = queue->front;
            printf("removed rcb from queue\n");  
    }
    return tmp1; 
}
/*Insert RCB into Queue */ 
 struct queue* insert(struct queue* queue, struct RCB* rcb){
            if(queue->front == NULL && queue->back == NULL){
                queue->front = rcb; 
                queue->back = rcb;
                return queue; 
            }
            if(queue->front->next == NULL){
                queue->front->next = rcb; 
                return queue; 
            }

            struct RCB *tmp = (struct RCB *)malloc(sizeof(struct RCB));
                    tmp = queue->front; 
                        while(tmp->next->b2r < rcb->b2r || tmp->next == NULL){
                        tmp = tmp->next;
                    }
                    rcb->next = tmp->next; 
                    tmp->next = rcb; 

                    return queue; 
    }

非常感谢任何帮助。

【问题讨论】:

  • sizeof(tmp) 是错误的,它是 pointer 的大小,而不是它所指向的大小。你应该改用sizeof(*tmp)
  • 谢谢!,还在学习指针
  • dequeue 中的两个malloc 泄露了,删除它们,看我的回答。

标签: c struct queue


【解决方案1】:
  1. Do not cast malloc return value

  2. new_queue 中,struct queue* tmp = malloc( 1 * sizeof(tmp)); 是错误的,因为这将分配一个大小为指向struct queue 的缓冲区,而不是struct queue 的大小,而且1*foo 的东西根本没有用。使用以下:

    struct queue* tmp = malloc(sizeof(*tmp));
    
  3. dequeue 中,您正在分配struct RCB 的两个缓冲区,同时通过分配给指针tmp1 and tmp1 立即失去对它们的引用,这些不是必需的,并且您正在创建内存泄漏。你需要的只是两个指针:

    struct RCB* dequeue(struct queue* queue) {
            struct RCB *tmp1; 
            struct RCB *tmp2; 
            if(queue->front == NULL && queue->back == NULL) {
                printf("queue is empty\n"); 
            }   
            tmp1 = queue->front; 
            tmp2 = tmp1->next; 
            queue->front = tmp2; 
            if(queue->front == NULL) {
                queue->back = queue->front;
                    printf("removed rcb from queue\n");  
            }
            return tmp1; 
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2012-11-05
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多