C 为什么这个用于反向打印单连接链表的代码段不能按预期工作?
我正在将用于存储链接列表(已创建)所需详细信息的结构(定义如下)的地址传递给printRev()函数,该函数将其作为指向void的指针接受。 以下是最低可行代码: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-
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.4010
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);
}