我的程序应该从用户(未知长度)中获取一个单词,然后创建一个链接列表,其中每个节点应包含一个字符。它适用于预先声明的单词,但如果我尝试简化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 << " ]\n\n";
}
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] != '\0'; i++)
{
l_push(head, str[i]);
l_printl(head);
}
system("PAUSE");
return 0;
}
答案 0 :(得分:1)
在l_push
()方法中,分配新节点:
void l_push(slistEl * & head, char v)
{
slistEl * p = new slistEl;
p->data = v;
现在,下面几行,我们有:
p->next = p;
您认为将新节点的next
指针设置为指向自身是否有意义?
显然不是,这就是你的问题。
P.S。如果l_push()
的意图是将下一个字符附加到列表的末尾(您在问题中是否明确表明是否是这种情况),即使解决了此问题,{ {1}}()不会正确执行。您需要一个完全不同的算法才能正确实现此逻辑。
答案 1 :(得分:0)
这是因为char str[]
是使用传递给它的文字的正确长度创建的数组,并且C ++数组不会动态扩展。
如果我用:char* str = new char[256];
替换str的定义,那么程序就会完美执行(只要你现在不给它超过256个字符)。
更好的方法是使用getline
和string
来使用C ++。
std::string str;
std::getline(cin, str);
for (int i = 0; str[i] != '\0'; i++)
{
l_push(head, str[i]);
l_printl(head);
}
或者在您从cin
读取时添加字符,但这并不像我期望的那样在换行符上终止。
char c;
while (cin >> c)
{
l_push(head, c);
l_printl(head);
}