Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 11

Не работает указатель на предыдущий элемент в списке

17.12.2014, 02:14. Показов 2896. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть такова: создается список из n элементов(вводится с клавиатуры), затем нужно вставить элемент в конкретную позицию, которая так же вводится с клавиатуры, затем удалить из нужной позиции. Проблема в том, что указатель на предыдущий элемент Pred=NULL и нигде не изменяется, программа выдает исключение и прекращает работу. Как правильнее описать функцию вставки\удаления Элемента?

Исходник с функциями и обработчиками событий:
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// ---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "List.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
List<int>f;
PNode First = NULL;
PNode Pred;
PNode p;
PNode p1;
PNode p2;
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
 
    Form1->Edit7->Text = "Input number: ";
    Form1->Edit5->Text = "Input number: ";
    Form1->Edit1->Text = "Input number of elements: ";
}
 
// ---------------------------------------------------------------------------
template<class T>
List<T>::List()
{
}
 
template<class T>
void List<T>::AddFirst(int Data)
 {
    p = new TNode;
    p->Data = Data;
    p->Next = First;
    First = p;
}
 
template<class T>
void List<T>::AddAfter(int Data)
{
    p = new TNode;
    p->Data = Data;
    p->Next = Pred->Next;
    Pred->Next = p;
}
template<class T>
void List<T>::AddLast(int Data)
{
    p1, p2 = First;
    while (p2->Next != NULL)
    p2 = p2->Next;
    p1 = new TNode;
    p1->Data = Data;
    p2->Next = p1;
    p1->Next = NULL;
}
 
template<class T>
void List<T>::DelFirst()
{
    PNode p = First;
    First = First->Next;
 
    delete p;
}
 
template<class T>
void List<T>::DelAfter()
 {
    p = Pred->Next;
    if (p)
     {
        Pred->Next = p->Next;
        delete p;
    }
}
 
template<class T>
void List<T>::DelLast()
 {
    p1 = First, p2;
    while (p1->Next->Next != NULL)
        p1 = p1->Next;
    p2 = p1->Next;
    p1->Next = NULL;
 
    delete p2;
}
 
template<class T>
void List<T>::InputList1(int Data)
 {
    Data = StrToInt(Form1->Edit2->Text);
    while (Data != 0) {
        if (Data != 0) {
            f.AddFirst(Data);
            Data--;
        }
        else {
            Form1->Edit1->Text = "Нет данных";
        }
        Form1->Memo1->Lines->Add(IntToStr(p->Data));
    }
}
 
template<class T>
void List<T>::FindAndInsert(int Data)
 {  Data=StrToInt(Form1->Edit6->Text);
    PNode p1 = p;
    while (p1->Data != Data)
    p1 = p1->Next;
    f.AddAfter(Data);
}
 
template<class T>
void List<T>::FindAndDel(int Data)
{
    PNode p1 = p;
    while (p1->Data != Data)
    p1 = p1->Next;
    f.DelAfter();
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int Data;
    f.InputList1(Data);
}
 
void __fastcall TForm1::Button2Click(TObject *Sender)
 {
    int Data;
    f.FindAndInsert(Data);
    f.AddLast(Data);
 
}
// ---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
 {
    int Data;
    Data = StrToInt(Edit8->Text);
    f.FindAndDel(Data);
    f.DelLast();
 
}
// ---------------------------------------------------------------------------
.h файл с классом List
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
#ifndef ListH
#define ListH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
struct TNode;
typedef TNode* PNode;
struct TNode
{
    int Data;
    PNode Next;
};
template <class T>
class List
{
public:
        List();
        void AddFirst(int Data);
    void AddAfter(int Data) ;
    void AddLast(int Data);
    void DelFirst();
    void DelAfter();
    void DelLast();
        void InputList1(int Data);
        void FindAndInsert(int Data);
        void FindAndDel(int Data);
        void FindDel();
        void FindIns(int x);
        PNode First;
        PNode Pred;
        PNode p;
        PNode p1;
        PNode p2;
};
#endif
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2014, 02:14
Ответы с готовыми решениями:

В двусвязном-циклическом указатель на предыдущий элемент не получился
суть такая: Имеется код: public void Insert_Element(int value) { if(Head == null) { ...

Как сделать указатель на предыдущий элемент в массиве без итераторов?
тип MyData хранит в себе матрицу. myarray хранит в себе указатели на матрицы пробую сделать так. Не могу понять как указатель...

Указатель в списке ссылается на себя, а не на следующий элемент
Уважаемые, форумчане! Помогите разобраться в вопросе. Я хочу реализовать стек(добавление элемента) на основе односвязного списка. ...

7
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.12.2014, 06:54
Цитата Сообщение от SpeshSplish Посмотреть сообщение
Проблема в том, что указатель на предыдущий элемент Pred=NULL и нигде не изменяется
Диагноз поставлен. Почему не удается вылечить? Если смогли поставить верный диагноз, значит более менее понимаете синтаксис языка. Логическое мышление напрочь отсутствует? Скопипастенный вами код кривой до безобразаия. Если не охота думать самому, то возьмите хотя бы код попрямее (одна из первых ссылок в Яндексе).
0
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 11
17.12.2014, 15:31  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Диагноз поставлен. Почему не удается вылечить? Если смогли поставить верный диагноз, значит более менее понимаете синтаксис языка. Логическое мышление напрочь отсутствует? Скопипастенный вами код кривой до безобразаия. Если не охота думать самому, то возьмите хотя бы код попрямее (одна из первых ссылок в Яндексе).
вы либо читайте код и постарайтесь разобраться, либо не пишите, если не намерены помочь. Код рабочий, программа запускается, список создается, но с добавлением элемента в конкретное место у меня проблема, не знаю как правильнее описать функцию AddAfter().
З.ы. то, что скинули вы - консольное приложение реализующее 2 простейшие операции над списком, у меня же, если вы не заметили, их немного больше и приложение объектное. Код писал сам, но навыков для доработки не хватает, так как маловато опыта - студент, как никак.
0
71 / 45 / 24
Регистрация: 11.05.2014
Сообщений: 179
17.12.2014, 15:48
Цитата Сообщение от SpeshSplish Посмотреть сообщение
вы либо читайте код и постарайтесь разобраться, либо не пишите, если не намерены помочь. Код рабочий
Знаете, всё это вообще-то применимо к Вам в полной мере. Даже беглого взгляда на исходники достаточно, чтобы увидеть возможные проблемы.

Кто же Вас так научил запутывать компилятор??

Вот это вы объявили.
C++
1
2
PNode First = NULL;
PNode Pred;
И вот это тоже, но внутри класса, абстрагированного от типа элемента списка:

C++
1
2
3
4
5
6
7
8
template <class T>
class List
{
public:
...
        PNode First;
        PNode Pred;
};
А вот как Вы пытаетесь работать:

C++
1
2
3
4
5
6
7
8
template<class T>
void List<T>::AddAfter(int Data)
{
    p = new TNode;
    p->Data = Data;
    p->Next = Pred->Next;
    Pred->Next = p;
}
Компилятору какой из Pred-ов использовать прикажете?

Для меня очевидно, что отладкой программ Вы себя не утруждаете, тогда почему это за Вас должны делать другие?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.12.2014, 15:57
SpeshSplish, если код писали сами, то почему вы не можете добавить строки, где бы Pred получал нужное значение? Сами же сказали, что ошибка из-за того, что он нигде не изменяется. Значит, изменяйте. В вашем коде не понятно:
- Зачем вы создаете шаблонный класс, если возможности шаблонов вы не используете;
- На что указывают указатели p, p1 и p2.
Из-за второго не ясно, чему приравнивать Pred, так как не ясно, что из них является тем элементом, после которого происходит вставка.
А работа с данными не зависит от того, консолное приложение, или с графическим интерфейсом. Можно этот класс вообще вынести в библиотеку и использовать как в консольных, так и в графических приложениях.
0
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 11
17.12.2014, 16:40  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
SpeshSplish, если код писали сами, то почему вы не можете добавить строки, где бы Pred получал нужное значение? Сами же сказали, что ошибка из-за того, что он нигде не изменяется. Значит, изменяйте. В вашем коде не понятно:
- Зачем вы создаете шаблонный класс, если возможности шаблонов вы не используете;
- На что указывают указатели p, p1 и p2.
Из-за второго не ясно, чему приравнивать Pred, так как не ясно, что из них является тем элементом, после которого происходит вставка.
А работа с данными не зависит от того, консолное приложение, или с графическим интерфейсом. Можно этот класс вообще вынести в библиотеку и использовать как в консольных, так и в графических приложениях.
Я попросил помочь советом, как правильнее должна выглядеть эта функция, пробовал по-разному, применяя третий указатель, перекидывал значения с одного на другой, возможно я просто в чем-то запутался. Вы уж поймите, с "высоты" второго курса универа далеко не все ясно и понятно)
Цитата Сообщение от helper Посмотреть сообщение
Знаете, всё это вообще-то применимо к Вам в полной мере. Даже беглого взгляда на исходники достаточно, чтобы увидеть возможные проблемы.
Кто же Вас так научил запутывать компилятор??
Вот это вы объявили.
Код C++
1
2
PNode First = NULL;
PNode Pred;
тут мой косяк, знаю, просто забыл убрать лишнее перед тем, как выложить сюда. В любом случае это ситуации не меняет.

Добавлено через 5 минут
что-то мы общий язык не находим..
Цитата Сообщение от kodv Посмотреть сообщение
- На что указывают указатели p, p1 и p2.
собственно указатели расставлены правильно. а в AddAfter() , как я понимаю не хватает 1-2 строки кода в которых нужно присвоить значение Pred и Pred->Next, у меня не выходит, я обратился за помощью
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.12.2014, 16:49
Лучший ответ Сообщение было отмечено SpeshSplish как решение

Решение

SpeshSplish, вам и стоило начинать с того, что вы не знаете, каксделать, а не то, что программа с исключением валится. Со своим порядком разбирайтесь сами, так как я не понял, зачем вам столько указателей. Абстрактно вставка нового элемента (newItem) после текущего элемента (curItem) выглядит так:
C++
1
2
3
4
newItem->Next = curItem->Next;
newItem->Prev = curItem;
curItem->Next->Prev = newItem;
curItem->Next = newItem;
1
0 / 0 / 0
Регистрация: 08.06.2014
Сообщений: 11
17.12.2014, 16:50  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
newItem->Next = curItem->Next;
newItem->Prev = curItem;
curItem->Next->Prev = newItem;
curItem->Next = newItem;
Другое дело, спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2014, 16:50
Помогаю со студенческими работами здесь

Как получить указатель на начальный элемент структуры в двусвязном списке
Здравствуйте! Прошу помощи с этим, в чём я ошибаюсь? Программа для консоли, с простым меню. Написал функцию loadList() загружающую...

Дан указатель P1 на первый элемент непустого двусвязного списка Продублировать в списке все элементы с нечетными значениями
Дан указатель P1 на первый элемент непустого двусвязного списка Продублировать в списке все элементы с нечетными значениями (новые...

Не работает проверка на скрытый элемент в списке
С помощью кода пытаюсь найти не скрытые элементы из списка. И все равно класс присваивается последнему элементу несмотря на то чтоо у него...

Двусвязный список с целыми числами - Указатель, который ссылается на предыдущий блок
Всем здравствуйте, сразу прошу прощения за тему, которых и так навалом в нете. Я перечитал уйму информации по созданию и не могу понять с...

Найти максимальный элемент и показать предыдущий элемент в матрице
Дана матрица, нужно найти макс. елемент и и показать предыдущий елемент. как ето реализовать через Stringgrid?? сори за нелепый...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru