单,双链表遍历segment fault的问题

发布于 2022-09-05 05:01:26 字数 2248 浏览 33 评论 0

最近在学习链表,这个code是遍历打印和第一个节点不同的链表。
通过了编译但时不时会出现segmentation fault。弄了半天没太搞清楚是什么原因,貌似是指针超出末节点了?不知道如何修改

int displayall(node * head){
    node * current = head->next;
    int count=0;
    
    cout << "\n和第一个节点不同: ";
    if(!head)
        return 0;
    //遍历
    //while(current!=NULL){
    while(current->next!=NULL){
        while(head->data==current->data){
        //while(head->data!=current->data){
            count++;
            cout << current->data << " ";
            current=current->next;
        }
        current = current->next;
    }
    cout << "\n还剩下 " << count << " 节点.";
    return count;
}

双链表是查找所有"2"节点,并且节点之前添加新的节点。
同样,双链表也是通过了编译但时不时会出现segmentation fault

int deplicate_2(node *&head){
    node*current = head;
    int count=0;

    while(current!=NULL){
        if(current->data==2){
            node*temp=new node;
            
            //2后插入
            //temp->next=current->next;
            //temp->previous=current;
            //current->next=temp;
            //temp->next->previous=temp;

            //2前插入
            temp->next=current;
            temp->previous=current->previous;
            current->previous->next=temp;
            //temp->next->previous=temp;
            current->previous=temp;

            count++;
            current=current->next;
        }else{
            current=current->next;
        }
    }
    cout << endl << count << " 个2节点重复." << endl;
    return count;
}

这个双链表是每隔一个节点删除。这个的segmentation fault找到了,只要末节点被删除就会segment fault。不知道改如何修改

int remove_every_other(node *&head){
    node*current = head;
    int count=0;

    while(current->!=NULL){
        noded * temp = current->next;
        current->next = temp->next;
        temp->next->previous = current;
        cout << temp->data << " 被删除了!\n";
        delete temp;
        
        count++;
        current=current->next;
    }
    cout << endl << count << " 个节点被删除了.\n";
    return count;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酒解孤独 2022-09-12 05:01:26

第一个程序:

int displayall(node * head){
    // head = NULL 怎么办 @yetship
    node * current = head->next;
    int count=0;
    
    cout << "\n和第一个节点不同: ";
    // 这句应该放在最前 @yetship    
    if(!head)
        return 0;
    //遍历
    //while(current!=NULL){
    // 这里current 为空怎么办? @yetship    
    while(current->next!=NULL){
        // 这里是用 while 么?还是 if? @yetship
        while(head->data==current->data){
        //while(head->data!=current->data){
            count++;
            cout << current->data << " ";
            current=current->next;
        }
        current = current->next;
    }
    cout << "\n还剩下 " << count << " 节点.";
    return count;
}

第二个程序

int deplicate_2(node *&head){
    node*current = head;
    int count=0;

    while(current!=NULL){
        if(current->data==2){
            node*temp=new node;
            
            //2后插入
            //temp->next=current->next;
            //temp->previous=current;
            //current->next=temp;
            //temp->next->previous=temp;

            //2前插入
            // 这里的逻辑画个图看看 @yetship   
            temp->next=current;
            temp->previous=current->previous;
            current->previous->next=temp;
            //temp->next->previous=temp;
            current->previous=temp;

            count++;
            // 在2 前面插入数据确定不会死循环? @yetship
            current=current->next;
        }else{
            current=current->next;
        }
    }
    cout << endl << count << " 个2节点重复." << endl;
    return count;
}

第三个程序

int remove_every_other(node *&head){
    node*current = head;
    int count=0;

    // 这里 current-> != NULL ? @yetship   
    while(current->!=NULL){
        noded * temp = current->next;
        // temp = NULL 怎么办? @yetship
        current->next = temp->next;
        temp->next->previous = current;
        cout << temp->data << " 被删除了!\n";
        delete temp;
        
        count++;
        current=current->next;
    }
    cout << endl << count << " 个节点被删除了.\n";
    return count;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文