列表追加功能中的错误

时间:2014-02-06 22:26:04

标签: c++ linked-list

我在visual studio和g ++中都遇到了错误我试过gdb但没有从中获得任何有用的东西

visual studio = array2.exe中0x00CD464F处的未处理异常:0xC0000005:访问冲突读取位置0xCCCCCCCC。

gdb给出=程序接收信号SIGSEGV,分段错误。 370.c000000010040118f in list :: append(this = 0x23aa80,x = 6)at main.cpp:61

      #include <iostream>
#include <stdlib.h>
// "arraylist.h"
#include <new>
//#include "myList.h"
using namespace std;


struct node{
    int data;
    node* next;
};
struct list{
    node* head;
    void append(int x);
};
int main()
{
    list L;
    L.append(6);
    node* cur = L.head;
    while (cur->next != 0)
    {
        std::cout << cur->data << std::endl;
        cur = cur->next;
    }
    return 0;
}

void list::append(int x)
{
    node* tmp = new node;
    node* cur = head;
    tmp->data = x;
    tmp->next;
    if (cur->data == 0)
    {
        head = tmp;
    }

    else{
        while (cur->next != 0)
        {
            cur = cur->next;
        }
        cur->next = tmp;

    }


}

3 个答案:

答案 0 :(得分:2)

一些提示:

  1. 您没有初始化L.head(感谢@Alan Stokes)。

  2. 您尚未初始化tmp->next

  3. cur->data == 0不是检查列表是否为空的正确方法。

答案 1 :(得分:0)

您的代码无效,因为创建列表对象时未初始化列表的数据成员头

struct list{
    node* head;
    void append(int x);
};
int main()
{
    list L;  // <== head is not initialized.

你可以写例如

    list L = { 0 };

或者

struct list{
    node* head = 0;
    void append(int x);
};

答案 2 :(得分:-1)

in

if (cur->data == 0)
{
    head = tmp;
}

您正在尝试访问新创建的list对象的头部,这意味着您正在使用未初始化的指针。这意味着无论何时取消引用它,您都将访问内存中未确定的部分,在这种情况下是您不想访问的部分(这会导致访问冲突错误)。我建议在结构构造函数中使用head设置NULL,并在每个尝试访问它的方法中检查head是否为NULL(在本例中为list::append(int))。 / p>

list::list(){
   head = NULL;
}

使用list L;

时会隐式调用此空构造函数