gpt4 book ai didi

c++ - C++从链表中删除给定整数的倍数

转载 作者:行者123 更新时间:2023-12-02 10:36:31 25 4
gpt4 key购买 nike

对不起,我很抱歉,但是我在这里和C++上都是新来的。我正在研究链表,有一个练习必须编写一个函数,该函数接受输入的整数列表和整数n。该函数必须从列表中删除所有倍数为n的节点,然后返回列表。我以为我做对了,但是我的代码什么也没输出。有人可以解释一下为什么吗?谢谢你们!

#include <iostream>
using namespace std;

struct list{
int val;
list* next;
};
typedef list* ptr_list;

ptr_list new_node(ptr_list old_node, int value);

ptr_list remove_mult(ptr_list head, int n);

void print_list(ptr_list head);

int main() {

ptr_list head, p1, p2, p3;
head = new list;
head->val = 1;
p1 = new_node(head, 2);
p2 = new_node(p1, 3);
p3 = new_node(p2, 4);

p3->next = NULL;

remove_mult(head, 2);
print_list(head);

return(0);
}

ptr_list new_node(ptr_list old_node, int value)
{
old_node->next = new list;
old_node->next->val = value;
return old_node->next;
}


ptr_list remove_mult(ptr_list head, int n){
ptr_list prev, curr;
prev = head;
curr = head->next;
while(curr->next != NULL){
if((head->val % n) == 0){
head = head->next;
curr = curr->next;
}
else if((curr->val % n) == 0){
ptr_list tmp;
tmp = prev->next;
prev->next = tmp->next;
delete tmp;
}
prev = curr;
curr = curr->next;
}
if((curr->val % n) == 0){
prev->next = NULL;
delete curr;
}
return(head);
}

void print_list(ptr_list head){
while ( head != NULL ){
cout << head->val << " ";
head = head->next;
}
}

最佳答案

这种方法

ptr_list head, p1, p2, p3;
head = new list;
head->val = 1;
p1 = new_node(head, 2);
p2 = new_node(p1, 3);
p3 = new_node(p2, 4);

p3->next = NULL;

//...

ptr_list new_node(ptr_list old_node, int value)
{
old_node->next = new list;
old_node->next->val = value;
return old_node->next;
}

不好是因为它不安全。例如,用户可以将一个空指针传递给该函数。或者,传递的指针旁边的数据成员可以指向有效节点。在这种情况下,它将在函数中被覆盖,并且将发生内存泄漏。否则,用户在退出函数到 nullptr后,会忘记将数据成员设置为最后一个节点的下一个节点。

函数 remove_mult也无效。例如,传递的指针通常可以等于 nullptr。在这种情况下,该函数具有 undefined 的行为。
ptr_list remove_mult(ptr_list head, int n){
ptr_list prev, curr;
prev = head;
curr = head->next;
//...

该函数还存在内存泄漏,因为您忘记了在此if语句中删除头节点
    if((head->val % n) == 0){
head = head->next;
curr = curr->next;
}

在其他语句中
    else if((curr->val % n) == 0){
ptr_list tmp;
tmp = prev->next;
prev->next = tmp->next;
delete tmp;
}

您忘记设置变量 curr的新值。

在if-else语句之后
    prev = curr;
curr = curr->next;

您将再设置一次 prev。例如,当当前节点被删除时,这再次导致 undefined 的行为。

这是一个演示程序,显示了如何实现列表的功能。
#include <iostream>

struct list
{
int val;
list* next;
};

typedef list* ptr_list;

ptr_list remove_mult(ptr_list head, int n )
{
ptr_list curr = head;
ptr_list prev = nullptr;

while ( curr != nullptr )
{
if ( curr->val % n == 0 )
{
ptr_list tmp = curr;

if ( prev == nullptr )
{
head = curr = curr->next;
}
else
{
curr = prev->next = curr->next;
}

delete tmp;
}
else
{
prev = curr;
curr = curr->next;
}
}

return head;
}

void print_list( ptr_list head )
{
for ( ; head != nullptr; head = head->next )
{
std::cout << head->val << ' ';
}
}

ptr_list append_list( ptr_list tail, int val )
{
if ( tail == nullptr )
{
tail = new list { val, nullptr };
}
else
{
while ( tail->next != nullptr )
{
tail = tail->next;
}

tail->next = new list { val, nullptr };
tail = tail->next;
}

return tail;
}

int main()
{
ptr_list head = nullptr;

const int N = 10;

ptr_list tail = nullptr;
for ( int i = 0; i < N; i++ )
{
if ( head == nullptr )
{
head = append_list( head, i );
tail = head;
}
else
{
tail = append_list( tail, i );
}
}

print_list( head );
std::cout << '\n';

head = remove_mult( head, 2 );

print_list( head );
std::cout << '\n';

return 0;
}

它的输出是
0 1 2 3 4 5 6 7 8 9 
1 3 5 7 9

关于c++ - C++从链表中删除给定整数的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60037261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com