我在打印链表的内容时遇到了一些麻烦。我正在使用我在某处找到的示例代码。我做了一点编辑,但我不认为这就是崩溃的原因。
class stringlist
{
struct node
{
std::string data;
node* next;
};
node* head;
node* tail;
public:
BOOLEAN append(std::string newdata)
{
if (head)
{
tail->next = new node;
if (tail->next != NULL)
{
tail=tail->next;
tail->data = newdata;
return TRUE;
}
else
return FALSE;
}
else
{
head = new node;
if (head != NULL)
{
tail = head;
head->data = newdata;
return TRUE;
}
else
return FALSE;
}
}
BOOLEAN clear(std::string deldata)
{
node* temp1 = head;
node* temp2 = NULL;
BOOLEAN result = FALSE;
while (temp1 != NULL)
{
if (temp1->data == deldata)
{
if (temp1 == head)
head=temp1->next;
if (temp1==tail)
tail = temp2;
if (temp2 != NULL)
temp2->next = temp1->next;
delete temp1;
if (temp2 == NULL)
temp1 = head;
else
temp1 = temp2->next;
result = TRUE;
}
else // temp1->data != deldata
{
temp2 = temp1;
temp1 = temp1->next;
}
}
return result;
}
BOOLEAN exists(std::string finddata)
{
node* temp = head;
BOOLEAN found = FALSE;
while (temp != NULL && !found)
{
if (temp->data == finddata)
found=true;
else
temp = temp->next;
}
return found;
}
void print()
{
node* tmp = head;
while (tmp)
{
printf("%s", tmp->data.c_str());
tmp = tmp->next;
}
}
stringlist()
{
head=NULL;
tail=NULL;
}
};
我的main()函数非常简单:
int main()
{
stringlist mylist;
if (mylist.append("something"))
count++;
if (mylist.append("else"))
count++;
if (mylist.append("yet"))
count++;
cout<<"Added "<<count<<" items\n";
mylist.print();
return 0;
}
由于某些原因,在Print()中,tmp永远不会为NULL
答案 0 :(得分:3)
在节点中,添加一个构造函数以在null
旁边进行初始化答案 1 :(得分:0)
最初head->tail
时,您未正确初始化head==NULL
。
答案 2 :(得分:0)
正确。这是因为在最初创建链表时,tail
在代码中仅为NULL。添加节点后,设置tail = head,从那个时间点开始,每次添加元素时,设置tail-&gt; next = new node,然后tail = tail-&gt; next ... so尾巴 - >下一个总是=尾巴。
答案 3 :(得分:0)
正如@rmn指出的那样,你没有初始化node-&gt;的值。
BOOLEAN append(std::string newdata)
{
if (head)
{
tail->next = new node;
if (tail->next != NULL)
{
tail=tail->next;
tail->data = newdata;
tail->next = NULL; // <- this is the part that is missing
return TRUE;
}
else
return FALSE;
}
else
{
head = new node;
if (head != NULL)
{
tail = head;
head->data = newdata;
head->next = NULL; // <- it's also missing here.
return TRUE;
}
else
return FALSE;
}
}
您可以通过为节点提供默认构造函数来解决此问题:
struct node
{
std::string data;
node* next;
node() : next(NULL) { }
};
使用默认构造函数,您无需添加tail->next = NULL;
。