微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在此链接列表中使用正确的指针

这是我从codesdope.com获得的代码,我做了一些修改以了解带有链接列表的Queue ADT的工作原理。

但是,我在此代码上使用指针卡住了。 我只是尝试打印出队列中的所有元素,尝试更改参数。 而且我无法从队列转到下一个节点,我是否正在尝试执行此代码无法完成的工作? 是因为它是这种设计还是这里的任何解决方案?

我需要您的帮助或提示,如何使用正确的指针跟随指针。

'''

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define FULL 10


typedef struct node{
    int data;
    struct node *next;
} NodeT;


typedef struct QueueRep{
    int length;
    NodeT *head;
    NodeT *tail;
} QueueRep;

typedef struct QueueRep *queue;


void initialize(queue q){
    q->length = 0;
    q->head = NULL;
    q->tail = NULL;
}


int isempty(queue q) {
    return(q->tail == NULL);
}

void enqueue(QueueRep *q,int value) {
    if(q->length < FULL) {
        NodeT *tmp;
        tmp = malloc(sizeof(NodeT));
        tmp->data = value;
        tmp->next = NULL;
        if(!isempty(q)) {
            q->tail->next = tmp;
            q->tail = tmp;
        } else {
            q->head = q->tail = tmp;
        } 
        q->length++;
    } else {
        printf("List is full\n");
    }
}

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);
}

/* original display function
void display(NodeT *head)
{
    if(head == NULL)
    {
        printf("NULL\n");
    }
    else
    {
        printf("%d\n",head -> data);
        display(head->next);
    }
}
*/

/* 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?
        
    }
    
}



int main() {
    QueueRep *q;
    q = malloc(sizeof(QueueRep));
    initialize(q);
    enqueue(q,10);
    enqueue(q,20);
    enqueue(q,30);
    printf("Queue before dequeue\n");
    //display(q->head); 
    display(q); //this is What I am trying to use
    dequeue(q);
    printf("\nQueue after dequeue\n");
    //display(q->head);
    display(q); //this is What I am trying to use
    return 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的数据成员node不是指针。所以这个if语句

    if(p->data == NULL) {

无效,因为将类型为intp->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 );
    }
} 

void display( const QueueRep *q ) 
{
    display_list( q->head );
}

函数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类型。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。