关于用链表结构编写队列的问题,请指教
struct queue_node
{
int data;
struct queue_node * next;
};
typedef struct queue_node queue;
typedef queue * link;
link front = NULL; /*初始队头指针*/
link rear = NULL; /*初始队尾指针*/
void addqueue(int value) /*从队尾输入队列数据*/
{
link newnode;
newnode = (link) malloc(sizeof(queue));
newnode->data = value;
newnode->next = NULL;
if ( rear == NULL ) { /*若为队列第一个数据*/
rear = newnode; /*rear指向新结点*/
front = newnode; /*front指向新结点*/
}
else {
rear->next = newnode; /*rear所指的结点指向新结点*/
rear = newnode; /*rear指向新结点*/
}
}
int outqueue() /*从队头输出队列数据*/
{
link top;
int temp;
if ( front != NULL ) { /*看队列是否为空*/
top = front;
front = front->next;
temp = top->data;
free(top);
return temp;
}
else
return -1;
}
如果我开始用addqueue(int value)输入了一个数据,那么rear和front都会指向新结点newnode,然后我再用outqueue()把这个数据输出,根据这个outqueue()函数,front指向了front->next,也就是NULL,这个结点也被释放,可是原先也指向这个结点的rear指向什么了?
outqueue()这个函数是不是写的有问题?
参考答案:rear会指向一个被释放了的内存地址,所以再addqueue的时候,有可能会引起内存访问出错。
其实编列队的时候,最好多一个空元素,做头。使得头尾不可能指向同一个元素。
不过,如果你要这样也可以:
int outqueue() /*从队头输出队列数据*/
{
link top;
int temp;
if ( front != NULL ) { /*看队列是否为空*/
if (front!=rear){
top = front;
front = front->next;
temp = top->data;
free(top);
return temp;
}else{
temp = front->data;
free(front);
front =NULL;
rear=NULL;
return temp;
}
}
else
return -1;
}