提问者:小点点

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


我正在尝试使用存储无效指针的链表在C中实现队列。我在插入函数方面遇到了问题;插入后的前总是等于后(使用int进行测试)。我在定位问题时遇到了麻烦。

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个答案

匿名用户

使用:

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时,两个节点的指针都指向相同的内存,因此同时更改。最有可能的是,这是你真正的问题。

匿名用户

问题是您放入队列的数据。您有一个局部变量i,并且您提供

您需要制作离散的对象以放入队列中!

for(int i=0; i<9; ++i) {
    int *object = malloc(sizeof(*object);
    *object = i;
    que_insert(test, (void *) object);
}

这样做,你需要记住释放(…)你的对象,一旦你完成了它们。