johnmtz 2020-08-28 10:33 采纳率: 50%
浏览 227
已采纳

C++循环链表问题,调试的时候一直显示*****是nullptr,求问怎么解决

代码如下

#ifndef _LinkedList_H_
#define _LinkedList_H_
using namespace std;
template <class T>
class LinkedList
{
private:
    struct node
    {
        T data;
        node*next;
        node(const T& x, node* n = NULL) :data(x), next(n) {};
        node() :next(NULL) { data = 0; };

    };
    node* head;
    int size;
protected:
    node* get(int i)const
    {
        if (i < 0)return head;
        node* p = head->next;
        for (int j = 0; j < i; j++)
            p = p->next;
        return p;
    }
public:
    LinkedList() :size(0)
    {
        head = new node;
    }
    ~LinkedList()
    {
        clear();
        delete head;
    }
    int length()
    {
        return size;
    }
    void clear()
    {
        while (length() > 0) remove(0);
    }
    void insert(int i, const T&x)
    {
        node* p = get(i - 1);
        p->next = new node(i, p->next);
        size++;
    }
    void remove(int i)
    {
        node* p = get(i - 1);
        node* q = p->next;
        p->next = q->next;
        delete q;
        --size;
    }
    int search(const T& x)const
    {
        node* p = head->next;
        for (int i = 0; p; ++i)
        {
            if (x == p->data)
                return i;
            p = p->next;
        }
        return -1;
    }
    T visit(int i)const
    {
        return get(i)->data;
    }

    void traverse()const
    {
        node* p = head->next;
        while (p)
        {
            cout << p->data << endl;
            p = p->next;
        }
    }
    void erase(int x, int y)
    {
        int i;
        node* p = get(x - 1);
        node* q = p->next;
        for (i = x; i <= y; i++)
        {
            p->next = q->next;
            delete q;
            q = p->next;
        }
    }

};
#endif

#include <iostream>
#include "LinkedList.h"
using namespace std;
int main()
{
    LinkedList <int> list;
    int n;
    cout << "input n" << endl;
    cin >> n;
    int *arr = new int[n];
    for (int i = 0; i < n; i++)
    {
        arr[i] = i;
    }
    for (int i = 0; i < n; i++)
    {
        list.insert(i,arr[i]);
    }
    cout<<list.search(2);
    list.erase(1,3);
    list.traverse();
    delete[]arr;
    return 0;
}


图片说明

  • 写回答

2条回答 默认 最新

  • qtchen_1988 2020-08-28 12:17
    关注

    你的

     void erase(int x, int y)
    

    实现有问题,没有删除元素后把列表长度减一;应改为

        void erase(int x, int y)
        {
            int i;
            node* p = get(x - 1);
            node* q = p->next;
            for (i = x; i <= y; i++)
            {
                p->next = q->next;
                delete q;
                q = p->next;
                             --size;
            }
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 前端echarts坐标轴问题
  • ¥15 CMFCPropertyPage
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳