Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这个用于反向打印单连接链表的代码段不能按预期工作?_C_Pointers_Linked List_Reverse_Singly Linked List - Fatal编程技术网

C 为什么这个用于反向打印单连接链表的代码段不能按预期工作?

C 为什么这个用于反向打印单连接链表的代码段不能按预期工作?,c,pointers,linked-list,reverse,singly-linked-list,C,Pointers,Linked List,Reverse,Singly Linked List,我正在将用于存储链接列表(已创建)所需详细信息的结构(定义如下)的地址传递给printRev()函数,该函数将其作为指向void的指针接受。 以下是最低可行代码: int printRev(void *l) { list_sll *list= (list_sll *)l; int i= list->noOfNodes-1; node_sll *subject= malloc(sizeof(node_sll)); subject->next= list-

我正在将用于存储链接列表(已创建)所需详细信息的结构(定义如下)的地址传递给printRev()函数,该函数将其作为指向void的指针接受。 以下是最低可行代码:

int printRev(void *l)
{
    list_sll *list= (list_sll *)l;
    int i= list->noOfNodes-1;
    node_sll *subject= malloc(sizeof(node_sll));
    subject->next= list->start;
    node_sll *front= NULL;  /*node directly in front of subject*/
    do {
        while(subject->next!=front)
            subject= subject->next;
        printf("%d. %d\n", i, subject->data);
        front= subject;
        subject->next= list->start;
        --i;
    }
    while(front!=list->start);
    subject= NULL;
    free(subject);
    return 0;
}
这是我调用此函数时得到的输出:

3.40
10
20
30
四十

2.30
10
20
30
四十

1.20
10
20
30
十,

0.10
10
20
10
二十


我想不出这个问题。请帮忙

对于初学者,函数已经具有未定义的行为,因为它具有返回类型
int
,但不返回任何内容

无需动态分配节点
主题
。它可以声明为结构类型的对象

如果列表为空,此do while循环也可能导致未定义的行为

int printRev(void *l)
{
    list_sll *list= (list_sll *)l;
    int i= list->noOfNodes-1;
    node_sll *subject= malloc(sizeof(node_sll));
    subject->next= list->start;
    node_sll *front= NULL;  /*node directly in front of subject*/
    do {
        while(subject->next!=front)
            subject= subject->next;
        printf("%d. %d\n", i, subject->data);

        //printing current list status
        printf("%d", list->start->data);
        printf("%d", list->start->next->data);
        printf("%d", list->start->next->next->data);
        printf("%d", list->start->next->next->next->data);

        front= subject;
        subject->next= list->start;
        --i;
    }
    while(front!=list->start);
    subject= NULL;
    free(subject);
    return 0;
}
因为将尝试访问空指针的值

在这个do while循环中,指针
subject
也发生了变化

do {
    while(subject->next!=front)
        subject= subject->next;
    printf("%d. %d\n", i, subject->data);
    //...
}
while(front!=list->start);
因此,原始列表也发生了变化

这些声明

do {
    while(subject->next!=front)
        subject= subject->next;
    // ...
    subject->next= list->start;
    // ...
}
由于指针
subject
指向的原始动态分配对象未被释放,导致内存泄漏

如果要使用您的方法,那么函数可以按以下方式查看(无需测试)


问题在于这个语句
subject->next=list->start您在更改列表时正在进行更改

您可以按以下方式修改它

void printRev( void *l )
{
    list_sll *list = ( list_sll * )l;

    int i = list->noOfNodes;

    node_sll subject = { 0, list->start };

    node_sll *front = NULL;  /*node directly in front of subject*/

    while ( i != 0 )
    {
        node_sll *current = &subject;

        while ( current->next != front ) current = current->next;

        --i;

        printf( "%d. %d\n", i, current->data );

        front = current;
    }
}

并且请考虑如何做,如果列表是空的,正如弗拉德所说的< P/>是你的猫死在空格键上吗?介意提供一个可重复的例子吗?在DO期间:我不认为这是:<代码>(主题>下一个!=前面)主题=主题->下一步;<代码>做你认为它做的事。它可以重写为

subject=front
@grochmal它在
subject->next==front
时停止,而不是在
subject==front
@Nityesh Agarwal时停止,我指的是MCVE,即我们可以复制粘贴并运行的单个完整程序。在代码的do-while循环中,我只更改subject指针指向的位置。那么它为什么要更改该地址中实际存储的内容呢?@NityeshAgarwal在循环中,主题指针在每次迭代中也会更改subject=subject->next。它没有初始值。是的,完全正确。它现在存储下一个节点的地址。这不应该改变数据。不管怎么说,这不是你如何遍历一个使用指针实现的链表吗?@NityeshAgarwal问题不在于你如何遍历链表。问题是,在此之后,您错误地假设它具有初始值,因此您更改了列表。
subject= NULL;
free(subject);
void printRev( void *l )
{
    list_sll *list = ( list_sll * )l;

    int i = list->noOfNodes;

    node_sll subject = { 0, list->start };

    node_sll *front = NULL;  /*node directly in front of subject*/

    while ( i != 0 )
    {
        node_sll *current = &subject;

        while ( current->next != front ) current = current->next;

        --i;

        printf( "%d. %d\n", i, current->data );

        front = current;
    }
}
int printRev(void *l)
{
 list_sll *list= (list_sll *)l;
 int i= list->noOfNodes-1;
 node_sll *subject = list->start;
 node_sll *front= NULL;  /*node directly in front of subject*/
 do {
     while(subject->next!=front)
         subject= subject->next;
     printf("%d. %d\n", i, subject->data);
     front= subject;
     subject= list->start;
     --i;
 }
 while(front!=list->start);
}