使用类的C ++单链表

时间:2012-03-14 19:47:40

标签: c++ list linked-list

我想创建单链表(使用类),每个列表中都有:指向文本的指针,int数,指向下一个列表的指针。

我需要实现3个功能: 插入(将列表插入到单链表中,并根据指针指向的文本使用strcmp对元素进行排序) removed(int num)删除出现数字的第一个列表。 print()打印整个单链表。

我有删除函数的问题,它在运行时出错,我猜想问题if ( tmp->next == NULL && tmp->number==num ) { delete tmp; first = NULL; }在哪里,但我不知道为什么会这样。

此外,我不确定如何实现对insert函数的排序,所以如果你有任何想法,如果你能解释我在删除函数中的哪个位置,那么错误就是我真的很感激。

以下是代码:

    #include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

class list
{
private:
    int number;

    char* word;
    list* next;
public:
    void inserts(int num, char* text);
    void removes(int num);
    void print();
};
list* first;

void list::print() {
    cout <<"This is our list:"<<endl;

    // Temp pointer
    list *tmp = first;

    // No nodes
    if ( tmp == NULL ) {
    cout << "EMPTY list" << endl;
    return;
    }

    // One node in the list
    if ( tmp->next == NULL ) {
    cout <<"NUMBER:\t"<< tmp->number;
    cout <<"\tWORD:\t"<< tmp->word << endl;
    cout <<"--------------------------------"<<endl;

    }
    else {
    // Parse and print the list
    while ( tmp != NULL ){
         cout <<"NUMBER:\t"<< tmp->number;
         cout <<"\tWORD:\t"<< tmp->word << endl;
         cout <<"--------------------------------"<<endl;

        tmp = tmp->next;
    }
}
}

void list::inserts(int num, char* word){
    // Create a new list
    list* newlist = new list; 
    newlist->number=num;

    newlist->word=word;
    newlist->next=NULL;

    // Create a temp pointer
    list *tmp = first;

    if ( tmp != NULL ) {
    // Nodes already present in the list
    // Parse to end of list
    while ( tmp->next != NULL ) {
        tmp = tmp->next;
    }

    // Point the last node to the new node
    tmp->next=newlist;
    }
    else {
    // First node in the list
    first = newlist;
    }
}

void list::removes(int num){
int k = 0;
    list* tmp=first;
    if(tmp==NULL)
        return;
       //Last node of the list

   if ( tmp->next == NULL && tmp->number==num ) {
    delete tmp;
    first = NULL;
    }
    else {
    //Parse thru the nodes
    list* prev;
    prev = new list;
    while ( tmp != NULL )
    {
        if ( tmp->number == num && k == 0)
            first = first->next;
if ( tmp->number == num)
break;
        prev = tmp;

        tmp = tmp->next;
k++;
    } 

    //Adjust the pointers
    prev->next=(tmp->next);
    //Delete the current node
delete tmp;
delete prev;

}
}


int main ()
{
    first->print();
    first->inserts(1200,"endian");
    first->print();
   /* first->inserts(10,"endianness");
    first->inserts(1200,"PEEK");
    first->inserts(1200,"POKE");
    first->inserts(1200,".MIL");
    first->print();*/
first->removes(100);
first->print();
getchar();
}

3 个答案:

答案 0 :(得分:1)

摆脱delete prev;函数最后一行的removes()

我不是专家,但通过删除prev,您将失去对列表中第一个节点的引用。

顺便说一下,好评,让它很容易阅读!

答案 1 :(得分:0)

removes中,在循环while ( tmp != NULL ) { … }之后,tmp可能为NULL。

但是,在那个循环之后,你有以下几行:

//Adjust the pointers
prev->next=(tmp->next);

您正在取消引用NULL指针,这会导致程序崩溃。

用这些替换这些行:

//Adjust the pointers
if(tmp)
    prev->next=(tmp->next);

<小时/> 另请注意:removes例程中的内存管理仍然存在错误。您永远不会在delete的初始值上调用prev,并删除在某些情况下应保留的列表节点。而不是你正在做什么,因此初始化它:list* prev=0;,并摆脱delete prev

答案 2 :(得分:0)

执行此循环时:

while ( tmp != NULL )

你的tmp指针将到达列表的末尾,并在循环中断时为NULL。

所以,当你执行:

prev->next=(tmp->next);

你的临时指针没有“下一个”值。也许你应该在循环之外维护另一个指针。