Задачка на C++: Проблем с една функция

Спам форум
Post Reply
User avatar
misho
Много Редовен
Много Редовен
Posts: 1841
Joined: Wed Apr 26, 2006 2:15 pm
Answers: 49
Location: Бургас
Contact:

Задачка на C++: Проблем с една функция

Post by misho » Thu Jun 02, 2011 8:31 pm

Имам проблем с една задача. Трябва да използвам свързан списък, за да направя опашка и дек. Опашката е ок, но с дека зациклих на едната функция.

Code: Select all

/* Записва в x последния елемент на дека и го премахва
 * return 1 - операцията е успешна
 * retunr 0 - операцията не е успешна
 */
int LinkedList::pollLast(int *x) {
      if(isEmpty())
            return 0;
      *x = this->last->data;

      Queue *to_delete = this->last;
      this->last = this->last->next;
      free(to_delete);
      return 1;
}
Където last ми е private променлива в класа и сочи последния елемент на дека. Изпълнението спира на реда *x = this->last->data;. Странното е, че практически същата функция имах за опашката и работи:

Code: Select all

/* Записва в x главата на опашката и я премахва от опашката
 * return 1 - операцията е успешна
 * retunr 0 - операцията не е успешна
 */
int LinkedList::poll(int *x) {
      if(isEmpty())
            return 0;
      *x = ptr->data;

      Queue *to_delete = ptr;
      ptr = ptr->next;
      free(to_delete);
      return 1;
}

User avatar
lortnoc
Турист
Турист
Posts: 545
Joined: Mon Jul 09, 2007 4:57 am
Answers: 125
Location: Пловдив

Post by lortnoc » Fri Jun 03, 2011 6:44 am

Какво ти писка компилатора? Използвай debug и виж дали са насочени указателите там накъдето трябва. Най - вероятно last сочи null или грешен адрес от паметта.

User avatar
misho
Много Редовен
Много Редовен
Posts: 1841
Joined: Wed Apr 26, 2006 2:15 pm
Answers: 49
Location: Бургас
Contact:

Post by misho » Fri Jun 03, 2011 7:43 am

Unhandled exception at 0x008717dc in Linked_list.exe: 0xC0000005: Access violation reading location 0x00000000.
Изведох си last със cout и показва някакъв адрес, не е 00000000. А и не би трябвало да остава NULL, защото уж му задавам стойност при добавяне на елемент. Пускам целия код, целия код, за да не копирам непрекъснато фрагменти:

main.cpp
dequeue.h
Last edited by misho on Sat Jun 04, 2011 11:03 am, edited 1 time in total.

User avatar
lortnoc
Турист
Турист
Posts: 545
Joined: Mon Jul 09, 2007 4:57 am
Answers: 125
Location: Пловдив

Post by lortnoc » Fri Jun 03, 2011 9:47 am

Това да не е някаква междинна версия в разработката ?
Има методи които ги няма, не присъства last ? :D
Със c++ са измислили new и delete незнам защо замесваш и malloc и free.
И да грешката е която си мислех last сочи към null.

User avatar
misho
Много Редовен
Много Редовен
Posts: 1841
Joined: Wed Apr 26, 2006 2:15 pm
Answers: 49
Location: Бургас
Contact:

Post by misho » Fri Jun 03, 2011 9:06 pm

Объркал съм файловете. :D
Това вече е:
dequeue.h
Иначе с malloc и free ни ги преподават и за това е така.

Е, как last става NULL, като нали уж в offer методите му задавам стойност? :lol:
Last edited by misho on Sat Jun 04, 2011 11:04 am, edited 1 time in total.

User avatar
Jurassic
Турист
Турист
Posts: 272
Joined: Thu Apr 29, 2010 9:46 pm
Location: Велико Търново
Contact:

Post by Jurassic » Fri Jun 03, 2011 9:07 pm

malloc и free са C style.

User avatar
lortnoc
Турист
Турист
Posts: 545
Joined: Mon Jul 09, 2007 4:57 am
Answers: 125
Location: Пловдив

Post by lortnoc » Sat Jun 04, 2011 7:13 am

Ако приемем, че влезне един път в pollLast виж какво даваш на last да сочи -> this->last = this->last->next;, а на теория last->next винаги е null.
Като извикаш втори път този метод last вече сочи null.
Фактически трябва да насочиш last към предишния елемент и тогава изтриваш последния.
Препоръчвам ти да си нарисуваш на хартия дек-а и един елемент нов и да видиш как трябва да насочиш указателите за добавяне на новия елемент от края или началото и как се изтриват съответно

User avatar
misho
Много Редовен
Много Редовен
Posts: 1841
Joined: Wed Apr 26, 2006 2:15 pm
Answers: 49
Location: Бургас
Contact:

Post by misho » Sat Jun 04, 2011 10:53 am

lortnoc, благодаря! Освен това и в poll функциите бях забравил да правя first и last да са NULL, когато списъкът се изпразни.
Рисувах 20 минути стъпка по стъпка какво става, докато изчистя всичко. :D
А и го направих с new и delete. Надявам се вече да е C++ style. :D
dequeue.h

Post Reply