链表实现的堆栈损坏



我的程序应该从用户那里获取一个单词(长度未知),然后创建一个链表,其中每个节点应该包含一个字符。它适用于预先声明的单词,但是如果我尝试简化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++,使用getlinestring

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);
}

相关内容

  • 没有找到相关文章

最新更新