c - 使用链表实现队列

时间:2014-04-20 05:16:39

标签: c linked-list queue

我尝试使用链表执行队列,但总是出现错误:赋值和赋值中的不兼容类型使得指针来自整数而没有强制转换。

这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include "Queue.h"

struct QUEUE_ELEMENT{
int element;
struct QUEUE_ELEMENT *next;
};

int size;
struct QUEUE_ELEMENT *head, *tail;

void initQueue(){

    head = NULL;
    tail = NULL;
    size = 0;

}       // void initQueue()



int queueEmpty(void) {

return (head == NULL && tail == NULL);

}   // int queueEmpty(void)





int enqueue(QUEUE_ELEMENT e) {
struct QUEUE_ELEMENT *temp;
if (tail == NULL){
    tail -> next = NULL;
    tail -> element = e;
    head = tail;
}
else {
    temp = malloc(sizeof(QUEUE_ELEMENT));
    tail -> next = temp;
    temp -> element = e;
    temp -> next = NULL;
    tail = temp;
}
return size++;

}   //  int enqueue(QUEUE_ELEMENT e)





int dequeue(QUEUE_ELEMENT *e){
struct QUEUE_ELEMENT *temp;
temp = malloc(sizeof(QUEUE_ELEMENT));

if (queueEmpty() != 0 ){
    temp = head;
    if(temp -> next != NULL){
    temp = temp -> next;
    free(head);
    head = temp;
    }
    else{
        free(head);
        head = NULL;
        tail = NULL;
    }
}
    return size--;


}   //  int dequeue(QUEUE_ELEMENT *e)

我修改了很多代码。

为什么'尾巴 - &gt; element = e;'在enqueue()中发生错误'赋值中的不兼容类型'?我该如何解决?

2 个答案:

答案 0 :(得分:0)

是家庭作业还是真正的需要?对于第一个我不会说什么。但是如果你在实践中需要它,那么使用已经实现的解决方案会更好。

有一种流行的风格,在链表中,head看起来像一个普通的条目,唯一能区分它的是head指针值本身。第一个很好的例子是Linux链表实现(a description)。它的细节是从链接成员获取整个入口地址的技巧。这个很容易学习,可以立即回答你的目标。

第二个好的例子是BSD列表和队列宏集(一个manpage;特别是,你可以从TAILQ宏集开始)。由于一些技巧(例如,前向指针地址链接字段但后向指针解决了整个结构)但它仍然有效,因此它更麻烦。

我希望两者都能满足你,并防止重新发明轮子:)

答案 1 :(得分:0)

您要将tail->element(一个int)分配给e QUEUE_ELEMENT。如果你想访问e中的元素,你必须尊重它,就像你先用尾巴做的那样。 所以tail->element = e->element