C 如何在此链表中使用正确的指针

C 如何在此链表中使用正确的指针,c,pointers,recursion,queue,function-definition,C,Pointers,Recursion,Queue,Function Definition,这是我从codesdope.com获得的一段代码,我做了一些修改,以了解带有链表的队列ADT是如何工作的 然而,我在这个代码上使用指针时遇到了麻烦。 我只是试图打印出队列中的所有元素,试图更改参数。 我无法从队列中转到下一个节点,我是否正在尝试此代码中不可能的内容? 因为它是这样设计的还是这里有什么解决方案 我需要你们的帮助或提示如何使用正确的指针来跟踪指针 ''' #包括 #包括 #定义真1 #定义FALSE 0 #定义完整的10 类型定义结构节点{ int数据; 结构节点*下一步; }节点;

这是我从codesdope.com获得的一段代码,我做了一些修改,以了解带有链表的队列ADT是如何工作的

然而,我在这个代码上使用指针时遇到了麻烦。 我只是试图打印出队列中的所有元素,试图更改参数。 我无法从队列中转到下一个节点,我是否正在尝试此代码中不可能的内容? 因为它是这样设计的还是这里有什么解决方案

我需要你们的帮助或提示如何使用正确的指针来跟踪指针

'''

#包括
#包括
#定义真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!БГББММСаб