我尝试使用存储void指针的链表在C中实现队列。我有插入功能的问题;插入后前面总是等于后面(用整数测试)。我无法确定问题所在。
typedef struct node{
void *data;
struct node *next;
} Node;
typedef struct queueStruct{
struct node *front, *rear;
} queueStruct;
typedef struct queueStruct *QueueADT;
QueueADT que_create( ){
QueueADT queue;
queue = (QueueADT) malloc(sizeof(queueStruct));
if(queue != NULL){
queue->front = queue->rear = NULL;
}
else{
printf("Insufficient memory for new queue.\n");
exit(1);
}
return queue;
}
void que_insert( QueueADT queue, void *data ){
Node *newNode;
newNode = malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
if(queue->front == NULL){
queue->front = queue->rear = newNode;
}
else{
queue->rear->next = newNode;
queue->rear = newNode;
}
printf("%i\t%i\n", *((int *) queue->front->data), *((int *)queue->rear->data) );
}
int main(void){
QueueADT test;
test = que_create();
for(int i=0; i<9; ++i) {
que_insert(test, (void *) &i);
}
}
答案 0 :(得分:0)
使用:
int main(void)
{
int a =1, b=2, c=3;
struct queueStruct queue = {0};
que_insert( &queue, &a);
que_insert( &queue, &b);
que_insert( &queue, &c);
}
我明白了:
> ./q
1 1
1 2
1 3
似乎对我有用。再一次,你没有发布你的驱动程序代码。如果您正在做类似的事情:
int main(void)
{
int a=1;
struct queueStruct queue = {0};
que_insert( &queue, &a);
a=2;
que_insert( &queue, &a);
}
然后它将始终是相同的,因为两个节点都指向内存中的相同地址,因此当您将a更改为2时,两个节点的指针都指向同一个内存,因此会同时更改。最有可能的是,这是你真正的问题。
答案 1 :(得分:0)
问题是您要放入队列的数据。你有一个局部变量i
,你为所有东西提供了&i
- 所以队列中的所有元素都是相同的元素(当你在循环中运行时,它的值会发生变化)。 / p>
您需要将离散对象放入队列中!
for(int i=0; i<9; ++i) {
int *object = malloc(sizeof(*object);
*object = i;
que_insert(test, (void *) object);
}
执行此操作后,您需要记住free(...)
对象完成后的操作。