鱼C论坛

 找回密码
 立即注册
查看: 5431|回复: 4

这个链表问题在哪里呀?怎么运行不正常?

[复制链接]
发表于 2014-1-4 19:40:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我用Dev-C++编写链表程序,运行以后有问题。
#include <iostream>
#include <string>
/************************************************
 * linked_list -- Class to handle a linked list *
 *              containing a list of strings.   *
 *                                              *
 * Member functions:                            *
 *      add -- Add an item to the list          *
 *      is_in -- Check to see if a string is    *
 *                      in the list.            *
 ************************************************/
class linked_list {
    private:
        /*
         * Node in the list
         */
        struct node {
            // String in this node
            std::string data;
            // Pointer to next node
            struct node *next;
        };
        //First item in the list
        struct node *first;
    public:
        // Constructor
        linked_list(void): first(NULL) {};
        // Destructor
        ~linked_list();
    private:
        // No copy constructor
        linked_list(const linked_list &);
        // No assignment operator
        linked_list& operator = (const linked_list &);
    public:
        // Add an item to the list
        void add(
            // Item to add
            const std::string &what
        ) {
            // Create a node to add
            struct node *new_ptr = new node;
            // Add the node
            new_ptr->next = first;
            new_ptr->data = what;
            first = new_ptr;
        }
        bool is_in(const std::string &what);
};
/************************************************
 * is_in -- see if a string is in a             *
 *      linked list.                            *
 *                                              *
 * Returns true if string's on the list,        *
 *              otherwise false.                *
 ************************************************/
bool linked_list::is_in(
    // String to check for
    const std::string &what
) {
    /* current structure we are looking at */
    struct node *current_ptr;
    current_ptr = first;
    while (current_ptr != NULL) {
        if (current_ptr->data == what)
            return (true);
        current_ptr = current_ptr->next;
    }
    return (false);
}
/************************************************
 * linked_list::~linked_list -- Delete the      *
 *      data in the linked list.                *
 ************************************************/
linked_list::~linked_list(void) {
    while (first != NULL) {
        delete first;
        first = first->next;
    }
}
int main() {
    linked_list list;   // A list to play with
    list.add("Sam");
    list.add("Joe");
    list.add("Mac");
    if (list.is_in("Harry"))
        std::cout << "Harry is on the list\n";
    else
        std::cout << "Could not find Harry\n";
    return (0);
}
这段是代码。调试过程中到最后一步,跳出一个窗口

CPU

CPU

如果直接执行返回值为3221226356
请问出什么问题了?怎么解决?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-4 20:41:31 | 显示全部楼层
大哥,既然DELETE,就不要再用他了好吗? 你看你的析构函数,已经delete了first了 还要去找他的next 这样不太好吧,你要不先找个中间指针变量把他的next装好了再去delete他,然后把first赋值。没调试过你的程序,只有先给出这样一个答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-5 08:33:02 | 显示全部楼层

谢谢哦,我把first = first->next;和delete first;颠倒了次序就好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-9 19:42:48 | 显示全部楼层
路过看看= =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-9 11:56:45 | 显示全部楼层
纠正一下这个问题的答案。我上面说的只颠倒两个语句次序的做法不能说是正确的。也许当时测试的编译器忽略了这个问题。那就是当最后一个first = first->next;的时候,first就已经是NULL了,于是就要delete一个已经是NULL的节点。这不科学。应该像下面这样做:
linked_list::~linked_list() {
    while (first != NULL) {
        node * prev = first;
        delete first; //NOTICE: the link should be reset before first is deleted. 
        first = prev->next;
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 16:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表