关于用链表结构编写队列的问题,请指教

王朝知道·作者佚名  2012-04-22
窄屏简体版  字體: |||超大  
 
分類: 電腦/網絡 >> 程序設計 >> 其他編程語言
 
問題描述:

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;

}

小贴士:① 若网友所发内容与教科书相悖,请以教科书为准;② 若网友所发内容与科学常识、官方权威机构相悖,请以后者为准;③ 若网友所发内容不正确或者违背公序良俗,右下举报/纠错。
 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航