Здравствуйте.
Вот написанный код, и я уже не совсем его понимаю. Помогите разобраться, исправить ошибки.
В общем, нужно было создать список с возможностью добавления нового элемента в конец списка, удаление первого/последнего элемента, поиск и возвращение элемента с заданным id.
При попытке компиляции под gcc, много ошибок, мол, многие переменные не заданы и видимо совсем не распознает структуру Link в других функциях(нет декларации first, last, некорректная инициализация внутри класса статического элемента данных нецелочисленного типа «link*», ISO C++ запрещает инициализацию элемента «last» [-fpermissive], ошибка: в результате которой «first» становится статическим [-fpermissive] и тд)
Очень хотелось бы разобраться.
UPD
читать дальше
Вот написанный код, и я уже не совсем его понимаю. Помогите разобраться, исправить ошибки.
В общем, нужно было создать список с возможностью добавления нового элемента в конец списка, удаление первого/последнего элемента, поиск и возвращение элемента с заданным id.
При попытке компиляции под gcc, много ошибок, мол, многие переменные не заданы и видимо совсем не распознает структуру Link в других функциях(нет декларации first, last, некорректная инициализация внутри класса статического элемента данных нецелочисленного типа «link*», ISO C++ запрещает инициализацию элемента «last» [-fpermissive], ошибка: в результате которой «first» становится статическим [-fpermissive] и тд)
Очень хотелось бы разобраться.
UPD
читать дальше
"class ListItem {static:" - такой конструкции, по-моему, вообще нет. После "class MyClass {" надо добавить модификатор доступа "public: ". В перечислении методов пропущены точки с запятыми. Пропущена точка c запятой после объявления класса. Не указано имя класса при определении методов. Методы Add, Remove объявлены как возвращающие int, хотя они ничего не возвращают (надо void). Функция main вообще неправильная.
И на будущее: не надо пересказывать ошибки компилятора своими словами.
В оп-посте теперь слегка подправленная версия.
>>Не указано имя класса при определении методов.
Это где объявлять и как?
Как должна выглядеть main, в таком случае?
И в какой части кода лучше объявлять len, id?
Глобальная переменная id вам не нужна.
Вместо "void RemLast() { ..." надо писать "void MyClass::RemLast() {".
Структура link у вас внутри класса ListItem, это совершенно излишне. В C++ структура - это простейший класс, поэтому struct можно заменить на class и добавить "public:", а внешний класс ListItem нужно убрать. Соответственно, обращение "struct link" изменится на "link".
Функция main может выглядеть так:
int main() {
MyClass object;
object.Add(15);
object.Add(24);
object.Add(7);
object.Show();
}
Ваш список хранит целые числа. Вам это и нужно? Бывает, что нужно написать список, который может хранить объекты любого типа. Там задействуется шаблонная магия и всё становится немного по-другому.
Да, здесь список с целыми числами. Хотя про список с объектами любого типа тоже хотелось бы узнать.
Какой тип должен стоять для *first, *last?
Раз уж вы убрали link и оставили вместо него ListItem, то вам нужно везде заменить link на ListItem (в т.ч. внутри ListItem).
Я тут вам исправил остальное. Не ручаюсь, что всё правильно, но оно хотя бы компилится и пишет то, что надо.
И у меня еще вопрос будет: что нужно, чтобы все функции заработали из консоли?
Не понял вопрос, поясните.
Добавить, удалить, найти элемент.
Еще раз спасибо за помощь)
После попытки изменения RemFirst при пустом списке возникает ошибка сегментирования.
Хотя все еще непонятно почему возникала ошибка.
А как переработать две другие функции, чтобы все заработало я вообще не знаю.
RemLast() удаляет все элементы кроме первого в списке.
При GetItem() просто выводится список. Ее действие заметно только если id>len - здесь все правильно, выдает ошибку.
Текущий код опять в оп-посте.
В RemFirst тоже память течёт, но это уже сами. Чтобы собиралось с ассертами, подключай assert.h и снимай с них комменты.
А "удаляло" оно весь список потому, что за ифами нужно следить:
if(first->next=NULL)
>>память течёт
Здесь тоже не совсем понимаю.
Это просто проход по списку, переход к следующему элементу. У вас то же самое в Show() написано: " current = current->next;".
память течёт
У вас создаются объекты ListItem через new. Соответственно, вам их надо через delete удалить, чтобы память освободилась. А у вас просто зануляется указатель на объект. Указатель потеряли, delete не сделали - память осталась занятой. Это и есть утечка памяти.
И еще, вы говорили, что здесь по-прежнему много ошибок. Не укажете где?
И с GetItem не все ясно.
Не посмотрите, что в общем коде еще можно доработать/исправить?