Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
#1

Конец Списка - C++

21.09.2013, 17:56. Просмотров 482. Ответов 14
Метки нет (Все метки)

Создаю список и в последнем элементе всегда мусор, а не 0.
next CXX0030: Error: expression cannot be evaluated
В буфере последнего элемента HHHH...
Буду благодарен на ссылку примера списков, где последний элемент занулен, или за совет, что подправить, чтобы разрешить данную проблему. P.S. Удаление выделенной памяти еще не занимался.
Вложения
Тип файла: rar List.rar (3.58 Мб, 7 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2013, 17:56     Конец Списка
Посмотрите здесь:

Добавить в конец списка L1 все элементы списка L2 - C++
Разработать программу обработки односвязных линейных списков с числом элементов в списке не менее пяти в соответствии с индивидуальным...

Добавление в конец списка - C++
Привет всем, необходимо реализовать алгоритм вставки. В общем беру элемент на нечетной позиции списка и вставляю его в конец. 3-й час...

Добавление элемента в конец списка - C++
Сначала добавляет первый элемент, а далее не хочет? Посмотрите свежим глазом, а то я лагаю! void List::bound(char data) {if (!Head) {...

Добавление элемента в конец списка - C++
Решил перегрузить функцию добавления элемента, чтоб пользователь мог выбрать куда добавить новый элемент, в начало (перед первым) или в...

Добавление в конец односвязного списка - C++
Не получается написать эту функцию.Добавление в начало более тривиально.Сам список представлен так. Насколько я знаю,нужно 2 случая...

Добавление в конец двусвязного списка - C++
Помогите найти ошибку в коде: не работает добавление в конец. Список формируется добавлением в начало! Функция добавления: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
21.09.2013, 18:19
  #2

Не по теме:

качать это никто не будет

Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
21.09.2013, 19:16  [ТС]     Конец Списка #3
Kuzia domovenok, поэтому в первую очередь я буду благодарен за ссылку с правильной реализацией списков, где последний элемент правильно задат.
Так как при записи Node->this = NULL; он всё равно не может занулить указатель.
Kuzia domovenok
21.09.2013, 20:10
  #4

Не по теме:

что мы обсуждаем? я кода не вижу!

alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 20:28     Конец Списка #5
Ramix57, где, конкретно, в коде, в последнем элементе муссор? И файл, с которым работаете.
Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
21.09.2013, 21:26  [ТС]     Конец Списка #6
alsav22, когда идет последние ";" он создает последний элемент в списке, у которого должен быть указатель нулевым. Да, там мусор судя по дебагу.
C++
1
2
3
4
5
6
7
8
if (c=='\n' && _c==';')
        {
            ListF->MyStack.PutInStack(cBufSymbol, cBufOperator);
            ListF->next = new CNodeStack;
            ListF->next->next = NULL;
            ListF = ListF->next;
            . . .
        }
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 22:47     Конец Списка #7
Так попробуйте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    do
    {
        c = fgetc(fIn);
        
        if (feof(fIn)) break;
        
        if (isdigit(c))
        {
            *cBS++=c;
        }
        else if(isalpha(c) && isdigit(_c))
        {
            *cBS++=',';
        }
        else if(c=='{' && _c=='}')
        {
            *cBS++=',';
        }
        else if(isspace(c) && _c=='}')
        {
            *cBS++='|';
        }
        else if(isspace(c) && (_c=='+' || _c=='-' || _c=='*' || _c=='/' || _c=='^' || _c=='S' || _c=='(' || _c==')'))
        {
            *cBO++=_c;
        }
        if (c == ';')
        {
            ListF->MyStack.PutInStack(cBufSymbol, cBufOperator);
            
            FreeBuf(cBufSymbol);
            FreeBuf(cBufOperator);
            cBS = cBufSymbol;
            cBO = cBufOperator;
            
            c = fgetc(fIn);
            
            if (c != EOF)
            {
                ungetc(c, fIn);
                ListF->next = new CNodeStack;
                ListF->next->next = NULL;
                ListF = ListF->next;
            }
            else break;
        }
        _c = c;
    } while(true);
Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 00:53  [ТС]     Конец Списка #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
if(!(fIn=fopen("in.txt","r"))) EMyError.CriticalError(3);
    do
    {
        c = tolower(fgetc(fIn));
        if (CountErrorLex!=0) EMyError.CriticalError(4);
        if (isdigit(c))
        {
            *cBS++=c;
        }
        else if(isalpha(c) && isdigit(_c) || c=='{' && _c=='}')
        {
            *cBS++=',';
        }
        else if(isspace(c) && _c=='}')
        {
            *cBS++='|';
        }
        else if(isspace(c) && (_c=='+' || _c=='-' || _c=='*' || _c=='/' || _c=='^' || _c=='S' || _c=='(' || _c==')'))
        {
            *cBO++=_c;
        }
        if ((c=='\n' || c==EOF) && _c==';')
        {
            ListF->MyStack.PutInStack(cBufSymbol, cBufOperator);
            ListF->next = NULL;
            FreeBuf(cBufSymbol);
            FreeBuf(cBufOperator);
            cBS = cBufSymbol;
            cBO = cBufOperator;
            if(c!=EOF)
            {
                ListF->next = new CNodeStack;
                ListF->next->next = NULL;
                ListF = ListF->next;
            }
            else
            {
                
            }
        } 
        _c = c;
    }while(!feof(fIn));
    fclose(fIn);
    ungetc(c,fIn);
    ListF = Start;
Изменил вот так. Вроде бы логики не нарушил, как у вас, единственно цикл сделал более ... проще что ли. Всё равно в дэбаге показывает, что там следующий указатель непонятно на что ссылается, а не 0. Ниже скриншот.
Миниатюры
Конец Списка  
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 00:55     Конец Списка #9
Цитата Сообщение от Ramix57 Посмотреть сообщение
Изменил вот так.
Зачем? Чем не устроил предложенный вариант?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 01:03     Конец Списка #10
Вот файл fract.cpp (добавил два метода для вывода) и результат работы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "Fraction.h"
#include "NodeStack.h"
 
void FreeBuf(char *buf);
 
int main()
{
   
   
    
    FILE *fIn = NULL, *fOut = NULL;
    Error EMyError;
    CNodeStack *Start;
    CNodeStack *ListF = new CNodeStack;
    ListF->next = NULL;
    Start = ListF;
    char c, _c, cBufSymbol[255] = {0}, *cBS = cBufSymbol, cBufOperator[255] = {0}, *cBO = cBufOperator;
    if(!(fIn=fopen("in.txt","r")))EMyError.CriticalError(3);
    do
    {
        c = fgetc(fIn);
        
        if (feof(fIn)) break;
        
        if (isdigit(c))
        {
            *cBS++=c;
        }
        else if(isalpha(c) && isdigit(_c))
        {
            *cBS++=',';
        }
        else if(c=='{' && _c=='}')
        {
            *cBS++=',';
        }
        else if(isspace(c) && _c=='}')
        {
            *cBS++='|';
        }
        else if(isspace(c) && (_c=='+' || _c=='-' || _c=='*' || _c=='/' || _c=='^' || _c=='S' || _c=='(' || _c==')'))
        {
            *cBO++=_c;
        }
        if (c == ';')
        {
            ListF->MyStack.PutInStack(cBufSymbol, cBufOperator);
            
            FreeBuf(cBufSymbol);
            FreeBuf(cBufOperator);
            cBS = cBufSymbol;
            cBO = cBufOperator;
            
            c = fgetc(fIn);
            
            if (c != EOF)
            {
                ungetc(c, fIn);
                ListF->next = new CNodeStack;
                ListF->next->next = NULL;
                ListF = ListF->next;
            }
            else break;
        }
        _c = c;
    } while(true);
    
    fclose(fIn);
    ListF->next = NULL;
    ListF = Start;
    while(ListF)
    {
        cout << ListF ->MyStack.GetInStackSymbols() << endl;
        cout << ListF ->MyStack.GetInStackOperator() << endl;
        ListF=ListF->next;
    }
    
    system("pause");
    return 0;
}
 
void FreeBuf(char *buf)
{
    while(*buf) *buf++=0;
}
Что ещё нужно?
Миниатюры
Конец Списка  
Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 01:45  [ТС]     Конец Списка #11
Наверное, я не так выразился, поэтому извиняюсь за потраченное время.
Посмотри приложенный мной скриншот из дебагера Visual Studio 2008.
У последнего элемента списка есть указатель на следующий элемент и там написано
next CXX0030: Error: expression cannot be evaluated
Эта ошибка меня смутила и не понимаю как убрать её и как она возникает...С самого начала темы.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 02:58     Конец Списка #12
И что, не понял? После последнего считанного символа в файле - ;, опять создаётся новый объект и добавляется в список, хотя он уже не нужен. В своём коде я это исправил. Ваш вариант (8 пост) тоже рабочий, а скрин... Что вы хотите увидеть по нулевому указателю?
Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 16:25  [ТС]     Конец Списка #13
alsav22, хотел увидел 0х000000, или так и должно быть?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 17:04     Конец Списка #14
Цитата Сообщение от Ramix57 Посмотреть сообщение
alsav22, хотел увидел 0х000000, или так и должно быть?
На скрине четыре next, в списке три объекта, next пследнего (третьего) содержит 0 (т.е. за ним нет объектов), дальше смотрится, что находится по адресу 0? Естественно, ничего. Ошибка, адрес в никуда.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 22:12     Конец Списка
Еще ссылки по теме:

Добавить элемент в конец списка - C++
написал две функции, add заполняет список, а функция add1 добавляет элемент в конец списка, помогите разобраться с функцией add1 void...

Не работает добавление в конец односвязного списка - C++
работаю с формой, рисую там различные объекты, которые надо добавлять в собственное хранилище(такое задание) вот отрывок кода из header...

Добавить элемент в конец односвязного списка - C++
Поправьте, пожалуйста, что не так с функцией Add_end.(остальное работает) #include &lt;iostream&gt; #include &lt;conio.h&gt; using...

Добавление элементов в конец связного списка - C++
Пишу программу по добавление элементов в конец связного списка: // linklist destructor #include &lt;iostream&gt; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 22:12  [ТС]     Конец Списка #15
alsav22, ясно, спасибо. Моя невнимательность.
Yandex
Объявления
22.09.2013, 22:12     Конец Списка
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru