当前位置: 首页 > 知识库问答 >
问题:

C不保存其他方法的更改

卢景澄
2023-03-14

我试图实现一个链表类在C和我有问题。我有添加新节点的=运算符。

链接列表类接口

template <typename Type>

class LinkedList {
public:
    LinkedList<Type>* head;
//  linked list stracture
    Type data;
    LinkedList<Type>* next;
//  others ....
    size_t length;
public:
    LinkedList();
    ~LinkedList();
    void initializeHead(LinkedList<Type>* headPtr);
    size_t size() const;
    LinkedList& operator+=(const Type& add);
    void operator-=(const Type& remove);
    LinkedList<Type>& operator[] (const size_t index) const;
    bool operator== (const LinkedList<Type> &versus) const;
    friend ostream& operator<< (ostream& out,LinkedList& obj);
};

这里我有=重载实现:

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator +=(const Type& add) {
    // head ptr - :)
    LinkedList<Type>* p = head->next;
    // go to the end
    while(p) p = p->next;
    // now on end - create new..!!!
    try {
        p = new LinkedList<Type>;
    } catch (bad_alloc& e) {
        cout << "There\'s an allocation error....";
    } catch (...) {
        cout << "An unknown error.." << endl;
    }// fill and done
    p->data = add;
    p->next = NULL;
    // increment length .........
    ++head->length;
    // done ............
    return *p;
}

此外,我还有“数组”访问重载方法:

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator [](const size_t index) const {
    if(index < 0 || index >= length) // invaild argument
        throw  exception();
    // continue
    LinkedList<Type>* p = head;
    for(size_t i = 0; i < index; ++i) p = p->next; // we are at what we want
    return *p;
}

一切正常-我检查了dibugger,

问题是-=不在“head”中保存新节点-

有人知道为什么新的分配没有链接到头-

谢谢!!

共有3个答案

逄俊力
2023-03-14

正如其他答案所说,当您尝试添加时,您超出了列表。试着这样做:

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator +=(const Type& add)
{
    LinkedList<Type> *last;

    // Find the last node in the list
    for (last = head; last != 0 && last->next != 0; last = last->next)
    {
    }

    // `last` now points to the last node in the list, or is zero
    // If zero (i.e. NULL) then list is empty

    if (last == 0)
    {
        head = new LinkedList<Type>;
        head->next = 0;
        head->data = add;
        head->length = 0;
    }
    else
    {
        last->next = new LinkedList<Type>;
        last->next->next = 0;
        last->next->data = add;
    }

    // We can safely use `head` as we are sure it won't be zero
    head->length++;

    // Return the added node
    return (last != 0 ? *last->next : *head);
}
毛峻
2023-03-14

而不是:

// go to the end
while(p) p = p->next;

您需要:

head->next = p;
姬旭
2023-03-14

之后,而(p)p=p-

接下来你要做的是p=newlinkedlist

 类似资料:
  • 我在项目中使用Crudepository进行数据库操作。当我使用由Spring实现的保存方法更新持久化数据时,其他字段将被覆盖。例如,我只发送firstName进行更新,但lastName被转换为空字段。 简单地说,我用这样的实体调用保存方法: 我正在将此JSON发送到更新方法: Spring 将此 JSON 转换为 Rest api endpoint的成员。成员.java是: 如何防止覆盖其他字

  • 问题内容: 我有一个用@Transactional注释的方法。我从Oracle数据库检索一个对象,更改一个字段,然后从该方法返回。我忘了保存对象,但是发现无论如何都会更新数据库。 applicationContext 我的方法 我的问题是为什么MyObject会持久保存到数据库? 问题答案: 因为hibernate将自动检测对持久实体所做的更改并相应地更新数据库。hibernate参考手册的第11

  • 其他认证方法 还有两种其他身份验证方法值得一提。它们是一次性密码和证书。 一次性密码 FreeRADIUS包含一个名为rlm_otp的模块,可用于处理OTP(一次性密码)令牌。该模块应与其他程序一起使用。 不幸的是,为其他程序提供代码的公司Tri-D Systems已经不存在了。但是,代码是分叉的,现在可以从Google Code(http://code.google.com/p/otpd/)获得

  • 所以如果我对一个已经注册的条目调用那个方法,如果它发现一个改变了的属性,它就会更新它? 多谢了。

  • 前言 数组的其他方法如下: 方法 描述 备注 indexOf(value) 从前往后索引,获取 value 在数组中的第一个下标 lastIndexOf(value) 从后往前索引,获取 value 在数组中的最后一个下标 find(function()) 找出第一个满足「指定条件返回true」的元素。 findIndex(function()) 找出第一个满足「指定条件返回true」的元素的in

  • 我有Point2D类作为基类,为了存储点列表,我通常使用,但现在我想在中添加额外的方法和一些属性,比如用于打印的ToString方法,基于特定坐标的排序,用于筛选点的特定方法,我不想使用扩展方法。 我创建了一个新的类,它继承了类,它在正常情况下工作很好,但是当使用FindAll函数时,它现在返回但我希望它返回。我知道我可以编写自己的方法来接受谓词委托,但这是太多的工作了。