我正在尝试使用存储无效指针的链表在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);
}
}
使用:
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);
}
这样做,你需要记住释放(…)
你的对象,一旦你完成了它们。