我的程序应该从用户那里获取一个单词(长度未知),然后创建一个链表,其中每个节点应该包含一个字符。它适用于预先声明的单词,但是如果我尝试简化cin >> word
,我会遇到问题:
变量"str"周围的堆栈已损坏。
欢迎任何帮助。
#include <iostream>
#include <iomanip>
#include <stdio.h>
using namespace std;
struct slistEl
{
slistEl * next;
char data;
};
unsigned l_size(slistEl * head)
{
unsigned c = 0;
slistEl * p = head;
if (p)
do
{
c++;
p = p->next;
} while (p != head);
return c;
}
void l_printl(slistEl * head)
{
slistEl * p;
cout << setw(3) << l_size(head) << " [";
p = head;
if (p)
do
{
p = p->next;
cout << " " << p->data;
} while (p != head);
cout << " ]nn";
}
void l_push(slistEl * & head, char v)
{
slistEl * p = new slistEl;
p->data = v;
if (head)
{
p->next = head->next;
head->next = p;
}
else
p->next = p;
head = p;
}
void l_pop(slistEl * & head)
{
if (head)
{
slistEl * p = head->next;
head->next = p->next;
if (p->next == p)
head = NULL;
delete p;
}
}
int main()
{
slistEl * head = NULL;
char str[] = "abcdefgh"; // pre-declarated word
//cin >> str; //program should take word from user
for (int i = 0; str[i] != ' '; i++)
{
l_push(head, str[i]);
l_printl(head);
}
system("PAUSE");
return 0;
}
在 l_push
() 方法中,分配新节点:
void l_push(slistEl * & head, char v)
{
slistEl * p = new slistEl;
p->data = v;
现在,下面几行,我们有这个:
p->next = p;
您认为将新节点的next
指针设置为指向自身是否有意义?
显然不是,那是你的问题。
附言如果您的l_push()
的目的是将下一个字符附加到列表的末尾(您在问题中没有明确说明是否是这种情况),即使在解决此问题后,l_push
() 也不会正确执行此操作。您需要完全不同的算法来正确实现此逻辑。
这是因为char str[]
是使用传递给它的文字的正确长度创建的数组,并且C++数组不会动态扩展。
如果我将str的定义替换为:char* str = new char[256];
那么程序就可以完美执行(只要你现在给它不超过256个字符)。
更好的方法是利用C++,使用getline
和string
。
std::string str;
std::getline(cin, str);
for (int i = 0; str[i] != ' '; i++)
{
l_push(head, str[i]);
l_printl(head);
}
或者,当您从cin
中读取时添加字符,尽管这不会像我期望的那样在换行符上终止。
char c;
while (cin >> c)
{
l_push(head, c);
l_printl(head);
}