0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
1

Конец Списка

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

Author24 — интернет-сервис помощи студентам
Создаю список и в последнем элементе всегда мусор, а не 0.
next CXX0030: Error: expression cannot be evaluated
В буфере последнего элемента HHHH...
Буду благодарен на ссылку примера списков, где последний элемент занулен, или за совет, что подправить, чтобы разрешить данную проблему. P.S. Удаление выделенной памяти еще не занимался.
Вложения
Тип файла: rar List.rar (3.58 Мб, 8 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2013, 17:56
Ответы с готовыми решениями:

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

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

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

Элемент двусвязного списка содержит указатель на строку. Вставить строку в конец списка
Элемент двусвязного списка содержит указатель на строку. Вставить строку в конец списка. В список...

14
Kuzia domovenok
21.09.2013, 18:19
  #2

Не по теме:

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

0
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 20:28 5
Ramix57, где, конкретно, в коде, в последнем элементе муссор? И файл, с которым работаете.
0
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
5498 / 4893 / 831
Регистрация: 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
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 00:55 9
Цитата Сообщение от Ramix57 Посмотреть сообщение
Изменил вот так.
Зачем? Чем не устроил предложенный вариант?
0
5498 / 4893 / 831
Регистрация: 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
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 01:45  [ТС] 11
Наверное, я не так выразился, поэтому извиняюсь за потраченное время.
Посмотри приложенный мной скриншот из дебагера Visual Studio 2008.
У последнего элемента списка есть указатель на следующий элемент и там написано
next CXX0030: Error: expression cannot be evaluated
Эта ошибка меня смутила и не понимаю как убрать её и как она возникает...С самого начала темы.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 02:58 12
И что, не понял? После последнего считанного символа в файле - ;, опять создаётся новый объект и добавляется в список, хотя он уже не нужен. В своём коде я это исправил. Ваш вариант (8 пост) тоже рабочий, а скрин... Что вы хотите увидеть по нулевому указателю?
0
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 16:25  [ТС] 13
alsav22, хотел увидел 0х000000, или так и должно быть?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 17:04 14
Цитата Сообщение от Ramix57 Посмотреть сообщение
alsav22, хотел увидел 0х000000, или так и должно быть?
На скрине четыре next, в списке три объекта, next пследнего (третьего) содержит 0 (т.е. за ним нет объектов), дальше смотрится, что находится по адресу 0? Естественно, ничего. Ошибка, адрес в никуда.
1
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 49
22.09.2013, 22:12  [ТС] 15
alsav22, ясно, спасибо. Моя невнимательность.
0
22.09.2013, 22:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2013, 22:12
Помогаю со студенческими работами здесь

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

Вставить элемент в конец списка
Есть структура struct Planet { int Way; char name; Planet *next; }; Написать...

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru