Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2012, 13:25   #1
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
Вопрос Не работает связный список (C++)

Память для структуры node похоже не выделяется. Не могу понять в чем дело.

Код:
#include <iostream>
#include <stdlib.h>
#include <string.h>

struct node
{
    char word[80];
    node* ptrToNextNode;
};

void fillList(node*& list);
void prntList(node* list);
void makeList(node*& list);

using namespace std;

int main()
{
    node* list;
    fillList(list);
    prntList(list);
    return 0;
}
void fillList(node*& list)
{
    makeList(list);
    cout<<"Input word end press 'Enter'(input '.' for exit): ";
    cin>>list->word;
    cout<<"OK ";
    cout<<list->word;
    if(!strcmp(".",list->word))
    {
        delete list;
        list=NULL;
    }
    node *current, *last;
    current=list;
    while(current!=NULL)
    {
        last=new node;
        cout<<"Input word end press 'Enter'(input '.' for exit): ";
        cin>>last->word;
        if(!strcmp(".",last->word))
        {
            delete last;
            last=NULL;
        }
        current->ptrToNextNode=last;
        current=last;
    }
}
void makeList(node *&list)
{
    list=new node;
    if(list=NULL)
    {
        cout<<"Not enough memory! Terminate program...";
        exit(1);
    }
    cout<<"List ready\n";
    cout<<strlen(list->word);  // <---- Проблемы начинаются здесь;
}
void prntList(node *list)
{
    if(list=NULL)
    {
        cout<<"This list is empty";
    }
    else
    {
        while(list!=NULL)
        {
            cout<<list->word<<endl;
            list=list->ptrToNextNode;
        }
        cout<<"//////////End of list//////////";
    }
}
Hal9000 вне форума Ответить с цитированием
Старый 27.01.2012, 14:01   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Опишите проблему, что конкретно происходит/не происходит
Вадим Мошев вне форума Ответить с цитированием
Старый 27.01.2012, 14:02   #3
AlexDark
Форумчанин
 
Аватар для AlexDark
 
Регистрация: 23.12.2011
Сообщений: 117
По умолчанию

Код:
if(list=NULL)
    {
        cout<<"This list is empty";
    }

if(list=NULL)
    {
        cout<<"Not enough memory! Terminate program...";
        exit(1);
    }
Семен Семеныч... == ,
AlexDark вне форума Ответить с цитированием
Старый 27.01.2012, 14:04   #4
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
Радость

Цитата:
Сообщение от AlexDark Посмотреть сообщение
Семен Семеныч... == ,
Енто точно!

Я пол месяца только с С++ имею дело, не думал, что компилятор и такое может пропустить

OMG, It's a liveeee!!! It's a liveeeeee!...

Последний раз редактировалось Hal9000; 27.01.2012 в 14:08.
Hal9000 вне форума Ответить с цитированием
Старый 27.01.2012, 15:15   #5
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
компилятор и такое может пропустить
С точки зрения компилятора все происходит вполне логично.
Ты присваиваешь list'у значение NULL, при этом проверяешь, прошло ли оно (это присвоение) успешно, то есть, на самом деле, условие у тебя выглядит так:
Код:
if (NULL)...
И каким образом компилятор должен это выловить? -)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 27.01.2012, 16:35   #6
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
Подмигивание

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
И каким образом компилятор должен это выловить? -)
Да все логично. В C++ логический тип данных(boole) соседствует со старым Сишным "нулем"="false" и "больше нуля"="true". Отсюда и проблемы у компилятора. Кстати на Фортране аналогичная штука.
Hal9000 вне форума Ответить с цитированием
Старый 27.01.2012, 16:44   #7
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
Вопрос

Я вот заметил еще, что можно написать "true", а можно "TRUE" и также с "false". И если написать "return TRUE" то компилятор ругается на то, что "TRUE" не было объявлено в данной области(функции). В общем в чем разница между ними?
Hal9000 вне форума Ответить с цитированием
Старый 27.01.2012, 19:14   #8
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
Вопрос

Компилятор указывает на отмеченную строку и пишет:
error: incompatible types in assignment of 'char*' to 'char [80]'|
Я так понимаю, не возможно присвоить указатель на символ к массиву символов или наоборот? Но разве одномерный массив это не указатель на нулевой элемент этого массива? Растолкуйте пожалуйста.

Код:
#include <iostream>
#include <stdlib.h>
#include <string.h>

struct node
{
    char word[80];
    node* ptrToNextNode;
};

void fillList(node*& list);
void prntList(node* list);
void makeList(node*& list);
void add_after(node *&list,char a_word[],char a_word_after[]);

using namespace std;

int main()
{
    node* list;
    char a_word[80],a_word_after[80];
    fillList(list);
    prntList(list);
    cout<<"Input a_word: ";
    cin>>a_word;
    cout<<"Input a_word_after: ";
    cin>>a_word_after;
    add_after(list,a_word,a_word_after);
    prntList(list);
    return 0;
}
void fillList(node*& list)
{
    makeList(list);
    cout<<"Input word end press 'Enter'(input '.' for exit): ";
    cin>>list->word;
    if(!strcmp(".",list->word))
    {
        delete list;
        list=NULL;
    }
    node *current, *last;
    current=list;
    while(current!=NULL)
    {
        last=new node;
        cout<<"Input word end press 'Enter'(input '.' for exit): ";
        cin>>last->word;
        if(!strcmp(".",last->word))
        {
            delete last;
            last=NULL;
        }
        current->ptrToNextNode=last;
        current=last;
    }
}
void makeList(node *&list)
{
    list=new node;
    if(list==NULL)
    {
        cout<<"Not enough memory! Terminate program...";
        exit(1);
    }
    cout<<"List ready\n";
}
void prntList(node *list)
{
    if(list==NULL)
    {
        cout<<"This list is empty\n";
    }
    else
    {
        while(list!=NULL)
        {
            cout<<list->word<<endl;
            list=list->ptrToNextNode;
        }
        cout<<"//////////End of list//////////";
    }
}
void add_after(node *list,char a_word[],char a_word_after[])
{
    if(list==NULL)
    {
        cout<<"This list is empty";
    }
    else
    {
        while(list!=NULL)
        {
            if(!strcmp(list->word,a_word))
            {
                node* filling_pointer;
                makeList(filling_pointer);
                filling_pointer->word=a_word_after;   // <---------------- Почему не происходит присвоения?
                filling_pointer->ptrToNextNode=list->ptrToNextNode;
                list->ptrToNextNode=filling_pointer;
            }
            list=list->ptrToNextNode;
        }
        cout<<"//////////Pasting over//////////";
    }
}
Hal9000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связный список InKo1 Помощь студентам 0 22.12.2011 02:08
Связный список GripEnemy Visual C++ 2 08.12.2011 16:19
Связный список batman01 Общие вопросы C/C++ 1 15.10.2011 01:31
связный список xeops Visual C++ 6 30.09.2011 09:39
Связный список С++ Шёпот Общие вопросы C/C++ 2 01.04.2011 22:56