Название: Динамические структуры данных Отправлено: Deni от Ноябрь 02, 2013, 14:55 Нужно написать функцию, которая будет удалять i-ый элемент из структуры.Я очень плохо понимаю как это сделать.Кое-что наваял, но получилась какая-то ересь.
tstrtuct.h #ifndef TSTRUCT_H #define TSTRUCT_H #include "mainwindow.h" struct Array{ QString aFIO; QString aAge; QString aPost; QString aDegree; QString aGender; }; struct Zveno{ Array Inf; Zveno *Next; Zveno *Prev; }; class TStruct{ private: Zveno *Head; int Count; QString Author; public: TStruct(); TStruct(Array); ~TStruct(); void AddElement(Array); int GetCount(); QVector <QString> ToVector(); void DeleteElement(Array,int); }; #endif // TSTRUCT_H tstruct.cpp #include "tstruct.h" TStruct::TStruct() { } TStruct::TStruct(Array Element) { Head=NULL; Count=0; Author=""; this->AddElement(Element); } void TStruct::AddElement(Array Element){ Zveno *p=new Zveno; //Выделяем память для нового элемента p->Inf=Element; //Записываем в поле Inf принимаемый в функцию элемент Element p->Next=Head; //Указываем, что следующий элемент это предыдущий Head=p; //Сдвигаем голову на позицию вперед p->Prev=Head; Count++; } int TStruct::GetCount(){ return Count; } QVector <QString> TStruct::ToVector(){ Zveno *p=new Zveno; QVector <QString> vector; p=Head; for(int i=0;i<Count;i++){ vector.append(p->Inf.aFIO+" "+p->Inf.aAge+" "+p->Inf.aPost+" "+p->Inf.aGender+" "+p->Inf.aDegree+"\n"); p=p->Next; } return vector; } void TStruct::DeleteElement(Array Element, int j){ Zveno *p=new Zveno; p=Head; Zveno *temp=p->Prev; Zveno *x=p->Prev; Zveno *y=p->Prev->Next; for(int i=j; i<Count-1;i++){ x=x->Next; y=y->Next; temp=temp->Next; } p->Prev->Next=x; p->Prev->Next->Next=y; p->Prev->Next=p->Prev->Next->Next; Element=temp->Inf; qDebug()<<temp->Inf.aFIO; delete temp; Count--; } Название: Re: Динамические структуры данных Отправлено: kambala от Ноябрь 02, 2013, 20:45 Код
Название: Re: Динамические структуры данных Отправлено: Deni от Ноябрь 02, 2013, 22:30 По непонятным мне причинам происходит вот что:
j=1 Содержание структуры: 4 3 2 1 при выполнении функции DeleteElement 4 раза qDebug: "3" "" "" index out of bounds Название: Re: Динамические структуры данных Отправлено: kambala от Ноябрь 03, 2013, 00:42 если я правильно понял, у тебя кольцевой двусвязный список? функция добавления как-то подозрительно написана… обычно голова всегда указывает на самый первый элемент списка, а не на последний.
и у меня там в коде небольшая ошибка: в условии цикла должно быть <= Название: Re: Динамические структуры данных Отправлено: Deni от Ноябрь 03, 2013, 00:50 Добавление происходит вот так вот:
http://ci-plus-plus-snachala.ru/image/1.gif Поэтому голова указывает на конец,но на самом деле это начало. Название: Re: Динамические структуры данных Отправлено: kambala от Ноябрь 03, 2013, 02:46 в твоем коде голова всегда указывает на добавленный элемент, а не на первый: Head=p; //Сдвигаем голову на позицию вперед
Название: Re: Динамические структуры данных Отправлено: Igors от Ноябрь 03, 2013, 11:00 Назвав элемент Array Вы внесли большую путаницу. Классы также построены плохо. Поэтому разгребать что Вы нагородили трудно и неблагодарно. Если хотите - начнем с нуля, так проще
Название: Re: Динамические структуры данных Отправлено: Deni от Ноябрь 04, 2013, 13:38 Проблема решена следующим образом:
Код: void TStruct::DeleteElement(int j){ |