【问题标题】:c - Implementation of queue using linked listc - 使用链表实现队列
【发布时间】:2014-04-20 05:16:39
【问题描述】:

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

这是我的代码:

#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)

我修改了很多代码。

为什么是'tail -> element = e;'在 enqueue() 中发生错误“分配中的类型不兼容”?我该如何解决?

【问题讨论】:

  • 在哪里???发布实际的编译器错误
  • 那个带有sizeheadtail next的“节点”看起来不是一个好的设计..
  • 这段代码的bug太多了,看得我头疼……为什么一个简单的链表需要这么多指针?
  • 在每个作用域中,您都在分别创建链表。永不解脱。大量内存泄漏,函数范围之间没有恢复。
  • This:if (tail == NULL) { tail -&gt; next = NULL; ... 只是此代码中 未定义行为 重复实例的一个示例。在你对指针在 C 中的工作方式有一个合理的理解之前,这个任务将是你的撤销。

标签: c linked-list queue


【解决方案1】:

这是作业还是真正的需要?第一个我就不说了。但如果实际需要,最好使用已经实现的解决方案。

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

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

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

【讨论】:

    【解决方案2】:

    您将tail-&gt;element(一个int)分配给e(一个QUEUE_ELEMENT)。如果你想访问e 中的元素,你必须先像使用tail 一样尊重它。 所以tail-&gt;element = e-&gt;element

    【讨论】:

    • 对不起,我看了 dequeue 一秒钟,然后只是 e.element 。另一个提示,您正在检查 tail 是否为 NULL 然后尝试尊重它并为其分配值,这是一个分段错误。您必须先分配内存或将其分配给另一个指针
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2021-05-20
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多