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

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

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

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

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

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

Списки. Функции добавление списка в конец и в середину другого списка. - C++
Всем привет!) Я вот написал две функции, 1- добавляется список2 в середину списка1, а 2 - добавляет список2 в конец списка1....когда я...

Разработать класс Итератор, методы которого: переход в начало списка, в конец, к текущему элементу списка, к с - C++
Разработать класс Итератор, методы которого: переход в начало списка, в конец, к текущему элементу списка, к следующему элементу, к...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
21.09.2013, 18:19
  #2

Не по теме:

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

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

Не по теме:

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

0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 20:28 #5
Ramix57, где, конкретно, в коде, в последнем элементе муссор? И файл, с которым работаете.
0
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;
            . . .
        }
0
alsav22
5419 / 4815 / 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);
0
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. Ниже скриншот.
0
Миниатюры
Конец Списка  
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 00:55 #9
Цитата Сообщение от Ramix57 Посмотреть сообщение
Изменил вот так.
Зачем? Чем не устроил предложенный вариант?
0
alsav22
5419 / 4815 / 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;
}
Что ещё нужно?
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
Эта ошибка меня смутила и не понимаю как убрать её и как она возникает...С самого начала темы.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 02:58 #12
И что, не понял? После последнего считанного символа в файле - ;, опять создаётся новый объект и добавляется в список, хотя он уже не нужен. В своём коде я это исправил. Ваш вариант (8 пост) тоже рабочий, а скрин... Что вы хотите увидеть по нулевому указателю?
0
Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 16:25  [ТС] #13
alsav22, хотел увидел 0х000000, или так и должно быть?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 17:04 #14
Цитата Сообщение от Ramix57 Посмотреть сообщение
alsav22, хотел увидел 0х000000, или так и должно быть?
На скрине четыре next, в списке три объекта, next пследнего (третьего) содержит 0 (т.е. за ним нет объектов), дальше смотрится, что находится по адресу 0? Естественно, ничего. Ошибка, адрес в никуда.
1
Ramix57
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 22:12  [ТС] #15
alsav22, ясно, спасибо. Моя невнимательность.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 22:12
Привет! Вот еще темы с ответами:

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

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

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

Добавление объекта в конец односвязного списка - C++
необходимо добавить объект в конец списка. как это сделать с помощью моей функции #include &lt;iostream&gt; #include &lt;conio.h&gt; using...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.09.2013, 22:12
Ответ Создать тему
Опции темы

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