这是使我陷入困境的功能,实际上我无法理解为什么 该函数假设从给定的链表中删除所有奇数元素,并返回删除的奇数元素的新链表的地址。
typedef struct node {
int data;
struct node* next;
} Node;
Node* removeOddValues(Node **source)
{
Node *curr = *source;
Node *even;
Node *even_curr;
Node *odd;
Node *odd_curr;
Node *next;
even->next=NULL;
odd->next=NULL;
even_curr = even;
odd_curr = odd;
while(curr)
{
next = curr->next;
curr->next = NULL;
if(curr->data % 2!=0)// odd//
odd_curr = odd_curr->next = curr;//node add to last//
else //even//
even_curr = even_curr->next = curr;
curr = next;
}
*source= even->next;//update source//
return odd->next; //the new list of odd elements removed//
}
当我尝试编译它时,我收到以下错误:
warning C4700: uninitialized local variable 'even' used
warning C4700: uninitialized local variable 'odd' used
答案 0 :(得分:1)
两件事:
首先,您会收到警告(并且您的程序包含未定义的行为并且可能会崩溃),因为您访问/取消引用了未初始化的变量:
Node *even;
Node *odd;
even->next=NULL; // even has not been initialised
odd->next=NULL; // odd has not been initialised
其次,您的代码不会记得"新列表的根,即您管理odd_curr
和even_curr
,每个列表都指向相应列表的最后一个节点,但您没有odd_root
和{{1}这样的内容}。
以下代码显示了这可行的方法。在另外考虑根节点的同时在末尾附加节点的逻辑对于两个列表是奇数和偶数相同,因此被分解为单独的函数:
even_root
答案 1 :(得分:0)
curr = next;
给你第一个警告,因为next
未初始化。
odd_curr = odd;
给出第二个警告,因为odd
未初始化。
您应该考虑使用malloc
来分配结构,因为您只是分配指针,而不是实际的节点。您可以从this interactive guide.开始了解有关链接列表的更多信息。即使您以某种方式修复了这两个警告,它仍然无效。
答案 2 :(得分:0)
最简单的情况,只使用两个变量。 甚至节点保留在原始列表中; 奇数节点从链中删除并作为链表返回。
t = newNode(temp->key);