tag:blogger.com,1999:blog-5293857734625424176.post3886113390956634143..comments2022-03-29T02:23:00.703+02:00Comments on Дневник программиста: Как я провалил собеседование по теме C/C++/Linuxknzsofthttp://www.blogger.com/profile/08074227529499389671noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-5293857734625424176.post-9848272357798058302020-01-23T10:10:04.202+02:002020-01-23T10:10:04.202+02:00Тоже сперва подумал, что не имея указателя на пред...Тоже сперва подумал, что не имея указателя на предыдущий элемент, текущий удалить неьльзя. Потом подумал, что можно сместить данные и удалить последний элемент. Но не обязательно перемещать все данные от текущего элемента и до конца списка. ДОстаточно скопировать данные из следующего элемента списка, затем в следующем элементе данные занулить,чтобы при удалении элемента не сработал деструктор объекта данных, затем удалить этот [следующий] элемент.<br /><br />struct list<br />{<br /> list *next;<br /> T *data;<br />};<br /><br />list *cur = то что нам дано, и его надо удалить. ПРоблема в том, что на него указывает prev->next от предыдущего элемента списка prev, котрый мы не знаем. Поэтому удалять сам элемент cur нельзя, но можно модифицировать его поля.<br />list *todel = cur->next;<br />delete cur->data;<br />cur->data = cur->next->data;<br />cur->next = cur->next->next;<br />todel->data=0;<br />delete todel;Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5293857734625424176.post-15867444041073136792013-11-27T20:18:43.280+03:002013-11-27T20:18:43.280+03:00T *p; // указатель на объект, который нужно удалит...T *p; // указатель на объект, который нужно удалить<br />T *pNext = p->next;<br />std::swap(*p,*p->next); // меняем местами объекты<br />delete pNext;<br />// теперь pNext уазывает на объект, на который указывал раньше p, и наоборот p уже указывает на следующий объект в списке<br />// тоесть указатель next предыдущего объекта будет указывать на ту же область памяти, что и раньше, но в ней уже будет другой объект<br />// тоесть целостность списка не нарушилась<br />// и мы имеем указатель на pNext? который указывает на перемещенный объект, который нужно удалитьAnonymoushttps://www.blogger.com/profile/16879158061480492175noreply@blogger.comtag:blogger.com,1999:blog-5293857734625424176.post-55846342415622036502013-07-23T17:07:06.832+03:002013-07-23T17:07:06.832+03:00Компания наверное была Samsung?^_^Компания наверное была Samsung?^_^Anonymoushttps://www.blogger.com/profile/14603179748745238507noreply@blogger.comtag:blogger.com,1999:blog-5293857734625424176.post-3037546893995187672013-07-14T12:50:32.950+03:002013-07-14T12:50:32.950+03:00По условию был дан элемент из середины односвязног...По условию был дан элемент из середины односвязного списка. та что не последний. ;)Anonymoushttps://www.blogger.com/profile/00967304288885564308noreply@blogger.comtag:blogger.com,1999:blog-5293857734625424176.post-23144820732520455812013-01-22T00:47:25.700+03:002013-01-22T00:47:25.700+03:00Представленными методами можно удалить все элемент...Представленными методами можно удалить все элементы кроме последнего, т.к. если просто удалить последний у предпоследнего останется ссылка указывающая по старому адресу.vbuldakovhttps://www.blogger.com/profile/10308327053833782457noreply@blogger.comtag:blogger.com,1999:blog-5293857734625424176.post-36992923458438476402012-08-09T18:22:37.085+03:002012-08-09T18:22:37.085+03:00По поводу односвязного списка. Возможно тут игра с...По поводу односвязного списка. Возможно тут игра слов - вам дали не АДРЕС элемента, а УКАЗАТЕЛЬ на элемент который нужно удалить. Если указатель *p, тогда *p_tmp = p,<br />p=p->next, free(p_tmp).Anonymoushttps://www.blogger.com/profile/10957777051456753972noreply@blogger.com