0 / 0 / 0
Регистрация: 11.06.2011
Сообщений: 33
|
|
1 | |
Связанные списки15.06.2012, 13:53. Показов 30231. Ответов 44
Метки нет (Все метки)
Составить программу, работающую со связанными списками. Мы будем рассматривать связанный список как объект, содержащий связанный список данных и операций (методов), которые вы можете с ними выполнять. Связанный список данных состоит из указателей на начало («голову») и конец («хвост») связанного списка (в нашем примере из-за его гибкости используется двунаправленный связанный список). Каждый элемент связанного списка представляет собой реализацию отдельного объекта. Возможности, необходимые для использования связанного списка, предоставляют следующие операции:
• создание связанного списка (выделение для него памяти); • уничтожение связанного списка (освобождение используемой памяти); • инициализация связанного списка; • деинициализация связанного списка; • вставка элемента в середину списка перед существующим элементом; • присоединение элемента к концу связанного списка; • удаление элемента из связанного списка; • возвращение первого элемента связанного списка; • возвращение последнего элемента связанного списка. Необходимо иметь в виду, что создание и инициализация, а также уничтожение и деинициализация методов — это не синонимы. При создании и уничтожении методы create и destroy выделяют и освобождают память для объекта (связанного списка), а методы инициализации и деинициализации initialize и deinitialize только инициализируют и деинициализируют ранее выделенные экземпляры объекта. Вы можете видеть, как объект связанного списка наследуется объектами стека или очереди, поскольку очередь и стек можно реализовать как связанный список с ограниченным числом операций. Например, можно реализовать очередь в виде связанного списка, в котором элементы могут добавляться к концу и извлекаться из начала. Если вы таким образом реализуете очередь, то нужно запретить наследуемые методы связанного списка, которые для очереди недопустимы (например, вставку в середину списка). Добавлено через 2 часа 22 минуты По ходу никто не сможет помочь
0
|
15.06.2012, 13:53 | |
Ответы с готовыми решениями:
44
связанные списки Связанные списки Связанные списки Связанные списки С++ |
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
|
||||||
15.06.2012, 15:18 | 2 | |||||
Вот тебе возьми за основу связный список, ничего не хватает добавишь сам
2
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
|
25.09.2012, 23:40 | 3 |
Всем привет. ребят подскажите плз., где косяк допустил в листинге, уже голову сломал.
Смысл такой, надо создать метод для добавления элемента в конец связанного списка. при компиляции возникает сообщение о прекращении работы программы вот мой листинг: #include <iostream> using namespace std; //////////////////////////////////////////////////////////////////////////////// struct link { int data; link* next; }; //////////////////////////////////////////////////////////////////////////////// class linklist { private: link* first; public: linklist() { first = NULL; } void additem(int d) { link *newlink = new link; if(first==NULL) { newlink -> data = d; newlink -> next = first; first = newlink; } else { link *temp = first; while(temp) temp = temp -> next; temp -> next = newlink; newlink -> data = d; newlink -> next = NULL; } } void display() { link *temp = first; while(temp) { cout << temp -> data << endl; temp = temp -> next; } } }; //////////////////////////////////////////////////////////////////////////////// int main() { linklist m; m.additem(10); m.additem(20); m.additem(30); m.additem(40); m.display(); cout << endl; system("pause"); return 0; }
0
|
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
|
25.09.2012, 23:44 | 4 |
Sher_vud, у вас получается петля при добавлении первого элемента в список.
newlink -> next = first; не надо. надо занулять
0
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
|
25.09.2012, 23:56 | 5 |
I.M. попробовал проставить NULL, к сожалению работать метод по прежнему отказывается.
больше всего сомнений в этих строках: else { link *temp = first; while(temp) temp = temp -> next = newlink; //temp -> next = newlink; newlink -> data = d; newlink -> next = NULL; } вот не могу не много понять. по идее когда завершается цикл указатель темп глядит на последний элемент списка. ну и я логично пытаюсь в поле next этого элемента изменить указатель со значения NULL на новоявленый элемент. Вешаться начало все после написания строки: temp -> next = newlink; я ее закоментил и попробовал по другому, что так же привело к аварийному завершению temp = temp -> next = newlink; ( добавил =newlink) вот и не пойму где я не правильно понял работу метода
0
|
26.09.2012, 00:19 | 6 | |||||
Sher_vud, вот, чуть подкорректировал функцию добавления:
0
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
|
26.09.2012, 00:44 | 7 |
BumerangSP спасибо большое, все работает. сей час попробую разобраться где допустил ошибку.
0
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
26.09.2012, 00:45 | 8 | |||||
Можно и так сделать:
0
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
|
26.09.2012, 01:01 | 9 |
alsav22 такой метод я как раз использовал, изучая главу "указатели". в задании к этой главе было необходимо как раз изменить данный метод, так что бы элементы вставали не в начала списка, а с конца.
если честно, пока тяжело понять каким образом описать метод с привязкой по времени создания элемента. наверное должна использоваться какая то библиотечная функция, если alsav22 Вы расскажете подробнее, буду рад узнать что то новое. BumerangSP никак не могу понять вот эту строчку: while(temp->next) делаем, пока указатель содержит не NULL? я в правильную сторону мыслю?
0
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
26.09.2012, 01:26 | 10 | |||||
Тогда вот так:
0
|
26.09.2012, 01:34 | 11 | |||||
Sher_vud, вот у Вас было так:
0
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
||||||
26.09.2012, 01:56 | 13 | |||||
BumerangSP спасибо огромное, теперь понял
alsav22 спасибо, я понял суть метода, но вот механизм пока не удается осмыслить. запутался в этих строках:
0
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
26.09.2012, 02:09 | 14 |
Мне кажется, что вариант BumerangSP не очень рационален. Из за того, что нет указателя на конец очереди, приходится каждый раз, при добавлении нового элемента, пробегать по очереди от первого элемента до последнего.
0
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
||||||
26.09.2012, 02:19 | 15 | |||||
alsav22, BumerangSP, еще раз Вам спасибо. может тороплюсь, но все же. переработал свой метод, на основании Ваших замечаний и поправок. все заработало
вот что у меня получилось:
while(temp)
0
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
26.09.2012, 02:42 | 17 |
Два указателя first и rear. Один указывает на начало списка, другой на конец. Сначала оба на NULL. Создаётся новый элемент, на него указывает newlink. Если список пустой, то значение newlink присваивается указателю на начало списка - first. Это произойдёт одни раз. В следующие разы заход будет уже только в else. То есть first в дальнейшем меняться не будет, и он будет указывать на начало списка. В первый раз else пропускается, после него указателю rear присваивается значение newlink, то есть, пока элемент в списке один, начало и конец списка совпадают. При добавлении следующего элемента заход только в else. После этого элемент, который до этого был в конце списка, будет содержать указатель на добавляемый элемент (rear -> next = newlink), а rear присваивается адресс нового элемента (rear = newlink), т.е. новый элемент становится концом списка, адресс которого находится в rear.
Добавлено через 6 минут Я и имел ввиду список. Просто в разных источниках это всё по разному называется, где очередь, где список. Односторонняя очередь, двусторонняя. Односвязанный список, двусвязанный список. Сути это не меняет. Я не спорю, просто поясняю. Тут можно увязнуть в определениях.
0
|
5 / 5 / 5
Регистрация: 25.09.2012
Сообщений: 42
|
||||||
26.09.2012, 02:47 | 18 | |||||
alsav22 спасибы, наконец то дошло. я видимо пересидел уже.. смотрел и представлял:
0
|
26.09.2012, 12:24 | 20 |
0
|
26.09.2012, 12:24 | |
26.09.2012, 12:24 | |
Помогаю со студенческими работами здесь
20
Связанные списки данных Связанные списки (переделать программу) Односвязанные и двух-связанные списки Подскажите как отладить код (связанные списки) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |