C - 链表队列;前面总是等于后方

时间:2014-04-09 19:56:57

标签: c queue

我尝试使用存储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);
   }
}

2 个答案:

答案 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(...)对象完成后的操作。