使用Class的链接列表

时间:2013-08-01 12:49:05

标签: c++ class pointers linked-list

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

#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. 节点之间是否被指向销毁?如果是这样,评论析构函数,应该做的,对吧?
  3. 我做错了什么?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

稍后修改:另一种方式是拥有以下签名list* newnode(int a, list* tmp),并在功能结束时return tmp;。然后,在主循环中你有tpo = root->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);

答案 2 :(得分:1)

全面实施链接列表,请查看以下链接:

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