【发布时间】:2017-04-25 01:30:06
【问题描述】:
我正在编写一个程序,它在输入中接受整数列表,并根据整数执行以下操作:
如果输入中的值为负数,则删除绝对值
如果是正数和偶数,则在列表顶部添加
如果是正数和奇数,加到列表的尾部
如果数字为零,则结束程序并打印列表。
我的问题在于 pop_el 函数,它会导致列表出现无限循环,因此当我打印列表时,程序会进入无限循环。 这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct ll_node_S * ll_node_ptr;
struct ll_node_S
{
int v;
ll_node_ptr next;
};
typedef struct ll_node_S ll_node;
ll_node_ptr push_tail(ll_node_ptr head, int v)
{
ll_node_ptr backup = head;
ll_node_ptr current = head;
while(current->next != NULL)
{
current = current->next;
}
current->next = (ll_node_ptr) malloc(sizeof(ll_node));
current->v = v;
return backup;
}
ll_node_ptr push_head(ll_node_ptr head, int v)
{
ll_node_ptr new_head = (ll_node_ptr)malloc(sizeof(ll_node));
new_head->v = v;
new_head->next = head;
return new_head;
}
ll_node_ptr pop_el(ll_node_ptr head, int el)
{
ll_node_ptr backup = head;
ll_node_ptr current = head;
ll_node_ptr previous = NULL;
int found = 0;
while(current != NULL && !found)
{
if(current->v == el)
{
if(previous == NULL)
{
backup = current->next;
free(current);
current = backup;
previous = current;
}
else
{
previous->next = current ->next;
free(current);
current = current->next;
}
found = 1;
}
else
{
previous = current;
current = current->next;
}
}
return backup;
}
void print(ll_node_ptr head)
{
ll_node_ptr current = head;
printf("%d\n", head->v);
while(current->next != NULL)
{
current = current->next;
printf("%d\n", current->v);
}
}
int isPair(int n)
{
return ((n % 2) == 0);
}
int main(int argc, char** argv)
{
int n = 1;
ll_node_ptr list = NULL;
while(n != 0)
{
scanf("%d", &n);
if(n < 0)
{
list = pop_el(list, -n);
}
else
{
if(isPair(n))
{
list = push_head(list, n);
}
else
{
list = push_tail(list, n);
}
}
}
print(list);
//should free the list
return 0;
}
这是测试用例(在输入中传递)我正在测试代码:
4
5
2
-4
-5
-3
9
2
0
应该产生以下输出:
2
2
9
有什么线索吗?
【问题讨论】:
-
调试器会有所帮助。
-
我正在使用自定义脚本在 cloud9 环境中开发程序来对测试用例进行分类并将其通过管道传输到程序中,因此我无法使用 c9 提供的调试工具(不是使用交流环境时工作)
-
如果你想高效地工作,你应该在本地机器上投资一些开发环境。我所说的“投资”不一定是“金钱”,而是“时间”。
-
然后使用免费和开源的离线工具,如 gcc 和 gdb。您不能只是来这里请人为您调试它。
-
您没有可以在其中工作的全功能开发环境确实不是我们的问题。这不是忽略our community standards 的借口,包括在求助于我们之前尽合理努力自己解决问题。
标签: c loops linked-list infinite