我尝试使用链表执行队列,但总是出现错误:赋值和赋值中的不兼容类型使得指针来自整数而没有强制转换。
这是我的代码:
#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()中发生错误'赋值中的不兼容类型'?我该如何解决?
答案 0 :(得分:0)
是家庭作业还是真正的需要?对于第一个我不会说什么。但是如果你在实践中需要它,那么使用已经实现的解决方案会更好。
有一种流行的风格,在链表中,head看起来像一个普通的条目,唯一能区分它的是head指针值本身。第一个很好的例子是Linux链表实现(a description)。它的细节是从链接成员获取整个入口地址的技巧。这个很容易学习,可以立即回答你的目标。
第二个好的例子是BSD列表和队列宏集(一个manpage;特别是,你可以从TAILQ宏集开始)。由于一些技巧(例如,前向指针地址链接字段但后向指针解决了整个结构)但它仍然有效,因此它更麻烦。
我希望两者都能满足你,并防止重新发明轮子:)
答案 1 :(得分:0)
您要将tail->element
(一个int)分配给e
QUEUE_ELEMENT
。如果你想访问e
中的元素,你必须尊重它,就像你先用尾巴做的那样。
所以tail->element = e->element