使用链表实现堆栈损坏

时间:2016-03-16 23:33:08

标签: c++ arrays list linked-list

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

2 个答案:

答案 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个字符)。

更好的方法是使用getlinestring来使用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);
}