gpt4 book ai didi

c++ - 如何从未排序的链表中删除重复项

转载 作者:行者123 更新时间:2023-12-01 14:48:40 25 4
gpt4 key购买 nike

我当前的 remove_repeat 函数出现段错误。

remove_repeats 函数:

void remove_repeats(node*& head){
node* cursor = head;
node* ptr;
node* duplicate;

while(cursor != NULL){
ptr = cursor;
while(ptr -> link != NULL){
if(cursor -> data == ptr -> link -> data){
duplicate = ptr -> link;
ptr -> link = ptr -> link -> link;
delete duplicate;
}
ptr = ptr -> link;
}
cursor = cursor -> link;
}
}

主要的:
int main(){
int start, stop;
int split;
node* head = NULL;
node *lesser;
node * greater;

start = time(NULL);
build_list(head);
stop = time(NULL);
cout<<"Time to build list = "<<stop - start <<"seconds.\n";
start = time(NULL);
show_list(head);
stop = time(NULL);
cout<<"Time to print list = "<<stop - start<<"seconds.\n";
cout<<"Size of the list = "<<size(head)<<endl;
remove_repeats(head);



return 0;
}

build_list 函数主要构建一个由 2000 个随机整数组成的链表,范围从 1 到 500。

show_list 函数将链表的内容输出到屏幕。

size 函数返回链表中的节点数。

我认为问题是当最后一个节点数据是重复的并且之后没有节点被分配给 ptr 的链接时。情况可能并非如此,但如果是这样,我不确定如何处理。

最佳答案

这个说法

ptr = ptr -> link;

应该是前面 if 语句的 else 部分的子语句。这个给你。
void remove_repeats( node*&head )
{
for ( node *cursor = head; cursor != nullptr ; cursor = cursor->link )
{
for ( node *ptr = cursor; ptr->link != nullptr; )
{
if ( cursor->data == ptr->link->data )
{
node *duplicate = ptr->link;
ptr = ptr->link->link;
delete duplicate;
}
else
{
ptr = ptr->link;
}
}
}
}

替代函数定义可以如下所示。
void remove_repeats( node*&head )
{
for ( node *cursor = head; cursor != nullptr ; cursor = cursor->link )
{
for ( node **ptr = &cursor->next; *ptr != nullptr; )
{
if ( cursor->data == ( *ptr )->data )
{
node *duplicate = *ptr;
*ptr = ( *ptr )->link;
delete duplicate;
}
else
{
ptr = &( *ptr )->link;
}
}
}
}

关于c++ - 如何从未排序的链表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60402773/

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