【问题标题】:Linked list using Class使用类的链表
【发布时间】:2013-08-01 12:49:04
【问题描述】:

我有一个代码,它似乎可以工作,但我无法获取存储在第一个和最后一个节点之间的链表中的值,是否跳过了它们之间的指针?并且取消引用这些跳过的指针会给我一个段错误,这是代码

#include<iostream>
#include <new>
using namespace std;

class list{ 
    int value;
    list* next;

public:    
    list(int a=0, list* b=0) {value=a;next=b;}    
    //~list() {delete next;}
    void newnode(int a, list* tmp) {
        tmp->next=new list;
        tmp=tmp->next;
        cout<<"Address of next: "<<tmp<<'\n';
        tmp->value=a;
    }

    void printlist (list* regist){
        list* tmp;
        tmp=regist; 
        cout<<tmp->value<<'\n';

        while(tmp->next != 0){
            tmp=tmp->next;
            cout<<tmp->value<<'\n';
            cout<<"Address of next: "<<tmp<<'\n';   
        }
    }
};

int main() {
    int first;    
    cout<<"Enter value for origin: \n";
    cin>>first; 
    list* root=new list(first);
    list* tpo=root;
    cout<<"How many numbers to add? \n";

    int choice;
    cin>>choice;

    int num;
    while(choice) {
        cout<<"Enter value: \n";
        cin>>num;    
        root->newnode(num, tpo);
        choice--;  
    }

    cout<<"Do you want me to show you these values, type 1 for yes and 0 for no: \n";
    cin>>choice;

    if(choice) {
        root->printlist(root);
    }
}
  1. 在打印值时为什么会跳过这些指针(节点)?
  2. 被指向的节点之间的中间是否被破坏?如果是这样,评论析构函数应该可以解决问题,对吧?

我做错了什么?

【问题讨论】:

  • 一方面,您没有使用一致的缩进。所以没有人有太多机会阅读你的代码。
  • root-&gt;newnode(num, tpo); 从不更新 roottpo 所以每个新值都会替换前一个
  • 谢谢@FredLarson,对不起,我会考虑的。

标签: c++ class pointers linked-list


【解决方案1】:

1) 当您要求更多值时,您总是会覆盖列表中的第二个元素。您需要将newnode()的签名更改为newnode(int a, list*&amp; tmp)

稍后编辑:另一种方法是使用以下签名list* newnode(int a, list* tmp),并在函数末尾添加return tmp;。然后,在主循环中,您将拥有tpo = root-&gt;newnode(num, tpo);。这样tpo 将始终指向下一个元素。

2) 另外,为了释放内存list 的析构函数不应该做任何特别的事情。我会说你在你的类中创建了一个删除列表的静态方法。像这样的:

public: static void deleteList(list*& root) { list* tmp = root; while (tmp) { tmp = root->next; delete root; root = NULL; root = tmp; } };

并称它为list::deleteList(root);

【讨论】:

  • 关于第1点,为什么要将指针作为引用传递,因为我认为如果变量作为引用传递或作为指针传递,值可以改变
  • 你需要通过引用传递指针,因为你需要修改指针而不是当你做tmp=tmp-&gt;next;时指针指向的对象。如果你不这样做,tmp 仍然会指向tmp 在进入函数之前指向的同一个指针,我相信你希望tmp 指向tmp-&gt;next。哎呀,我真的需要提高我的词汇量:D(我在最后一个短语中使用了 4 次“point”)
  • 非常感谢,做了一些试验来理解你所说的。如果你没有提到它,肯定不会想出来。
【解决方案2】:

您总是将root 提交给newnode(分配给tpo),从而导致一个包含两个元素和任意数量的泄漏内存的列表

【讨论】:

  • 对不起,我对 c++ 比较陌生,但我能问一下传递地址会导致内存泄漏吗?
  • 当您执行tmp-&gt;next=new list; 时,您总是覆盖tmp-&gt;next 的地址。这是因为tmp-&gt;next 总是指向列表中的第二个元素,而不是第二个、第三个等。
  • 再次感谢,您之前的评论对于阐明指针的工作原理非常有用:),现在这更有意义了。
【解决方案3】:

链表的综合实现,请查看以下链接:

http://www.bitsbyta.com/2011/02/how-to-add-node-at-end-of-linked-list-c.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2014-06-18
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多