C 如何在此链表中使用正确的指针
这是我从codesdope.com获得的一段代码,我做了一些修改,以了解带有链表的队列ADT是如何工作的 然而,我在这个代码上使用指针时遇到了麻烦。 我只是试图打印出队列中的所有元素,试图更改参数。 我无法从队列中转到下一个节点,我是否正在尝试此代码中不可能的内容? 因为它是这样设计的还是这里有什么解决方案 我需要你们的帮助或提示如何使用正确的指针来跟踪指针 '''C 如何在此链表中使用正确的指针,c,pointers,recursion,queue,function-definition,C,Pointers,Recursion,Queue,Function Definition,这是我从codesdope.com获得的一段代码,我做了一些修改,以了解带有链表的队列ADT是如何工作的 然而,我在这个代码上使用指针时遇到了麻烦。 我只是试图打印出队列中的所有元素,试图更改参数。 我无法从队列中转到下一个节点,我是否正在尝试此代码中不可能的内容? 因为它是这样设计的还是这里有什么解决方案 我需要你们的帮助或提示如何使用正确的指针来跟踪指针 ''' #包括 #包括 #定义真1 #定义FALSE 0 #定义完整的10 类型定义结构节点{ int数据; 结构节点*下一步; }节点;
#包括
#包括
#定义真1
#定义FALSE 0
#定义完整的10
类型定义结构节点{
int数据;
结构节点*下一步;
}节点;
typedef结构QueueRep{
整数长度;
节点*头;
结尾;
}QueueRep;
typedef结构QueueRep*队列;
无效初始化(队列q){
q->长度=0;
q->head=NULL;
q->tail=NULL;
}
int isempty(队列q){
返回(q->tail==NULL);
}
void排队(QueueRep*q,int值){
如果(q->长度<满){
NodeT*tmp;
tmp=malloc(sizeof(NodeT));
tmp->数据=值;
tmp->next=NULL;
如果(!isempty(q)){
q->tail->next=tmp;
q->tail=tmp;
}否则{
q->head=q->tail=tmp;
}
q->length++;
}否则{
printf(“列表已满\n”);
}
}
int出列(QueueRep*q){
NodeT*tmp;
int n=q->head->data;
tmp=q->head;
q->head=q->head->next;
q->长度--;
免费(tmp);
返回(n);
}
/*原始显示功能
无效显示(节点*头部)
{
if(head==NULL)
{
printf(“NULL\n”);
}
其他的
{
printf(“%d\n”,头部->数据);
显示(头部->下一步);
}
}
*/
/*我想这样打印*/
无效显示(队列q){
节点*p=q->head;
如果(p->data==NULL){
printf(“NULL\n”);
}否则{
printf(“%d”,p->data);
显示(q->head);//指针错误?您如何在此处修复?
}
}
int main(){
QueueRep*q;
q=malloc(sizeof(QueueRep));
初始化(q);
排队(q,10);
排队(q,20);
排队(q,30);
printf(“出列前排队\n”);
//显示(q->head);
display(q);//这就是我试图使用的
出列(q);
printf(“\n退出队列后退出\n”);
//显示(q->head);
display(q);//这就是我试图使用的
返回0;
}
''此函数定义
/* I would like to print like this !!!! */
void display(queue q) {
NodeT *p = q->head;
if(p->data == NULL) {
printf("NULL\n");
} else {
printf("%d ", p->data);
display(q->head); //wrong pointer? how can your fix here?
}
}
是错误的,不应编译
例如,结构节点
的数据成员data
不是指针。所以这个if语句
if(p->data == NULL) {
display(q->head); //wrong pointer? how can your fix here?
无效,因为将类型为int
(p->data
)的对象与空指针null
进行比较
在这份声明中
if(p->data == NULL) {
display(q->head); //wrong pointer? how can your fix here?
使用类型为struct node
的参数调用函数,而相应的函数参数的类型为queue
。因此,编译器将再次为此语句发出错误
您可以将函数拆分为两个函数。比如说
void display_list( const NodeT *head )
{
if ( !head )
{
puts( "NULL" );
}
else
{
printf( "%d ", head->data );
display_list( head->next );
}
}
及
函数dequeue
int dequeue(QueueRep *q) {
NodeT *tmp;
int n = q->head->data;
tmp = q->head;
q->head = q->head->next;
q->length--;
free(tmp);
return(n);
}
可以调用未定义的行为。首先,它不检查队列是否为空/。其次,当删除队列中的单个节点时,它不会将指针tail
设置为NULL
例如,可以通过以下方式定义函数
int dequeue( QueueRep *q, int *data )
{
int success = q->head != NULL;
if ( success )
{
NodeT *tmp = q->head;
*data = tmp->data;
q->head = q->head->next;
if ( !q->head ) q->tail = NULL;
--q->length;
free( tmp );
}
return success;
}
请注意,主要是动态声明QueueRep
类型的对象并没有太大意义。你可以写
QueueRep q;
initialize( &q );
还有这个typedef
typedef struct QueueRep *queue;
这只会让代码的读者感到困惑。在程序的某些地方,您使用的是类型
QueueRep*
,而在其他地方,您使用的是类型queue
,这只是一个错误的代码。问题是什么?数据成员不是指针。因此,如果(p->data==NULL){这个if语句没有意义。在这个递归调用显示(q->head)中,参数的类型与函数参数的类型不同。非常感谢Vlad!БГББММСаб