Двунаправленный стек

C++, Assembler, PHP и т.д. и т.п...

Модератор: Tiger

Аватара пользователя
Dominion
Сообщения: 1757
Зарегистрирован: Вс 13 июл, 2003 23:53
Откуда: Россия-Москва-Тушино
Контактная информация:

Двунаправленный стек

Сообщение Dominion » Сб 09 июн, 2007 19:46

Знающие люди, подскажите, пожайлуста , есть программа, в которой пользователь вводит кол-во элементов стека, а затем удаляет выбранный элемент. Проблема в том что удаление работает не правильно, в чем причина не пойму. :cry:

Код: Выделить всё

#include <stdio.h>

class stek{
     public :
          int number;     
          stek *head;
          stek *prev;
          stek *next;
          stek(int i,stek *ptr1 = NULL,stek *ptr2 = NULL){

               number=i;
               next = ptr1;
               prev = ptr2;

          }

          void print(){

               printf(" %d \n",number);

          }
          void del(int i,stek *ptr1,int n){


                int j;
                stek *q=NULL;
                for (j = 0; j < n-1; j++){
                    ptr1 = ptr1->next;
                }
                q = new stek(i, ptr1->next, ptr1);
                ptr1->next->prev=q;
                ptr1->next=q;

          }
     };

void main(){

     int i,j,n,a[10];
     stek *p,*q = NULL;
     printf("Vvedite kol-vo elementov \n");
     scanf("%d",&j);
     
     printf("Vvodite chisla \n");
     for(i = 0; i < j; i++){

          scanf("%d",&a[i]);
          q = new stek(a[i], p,  q);
          q->next = p;
          p=q;

}

     printf("Vvedite nomer elementa , kotoriy nado ydalit \n");
       scanf("%d",&n);

     printf(" do udaleniya elementa \n");
     for(i = 0; i < j; i++){
         q->print();
         q=q->next;
         };
     q = p;
     q->del(i,p,n);
     q = p;
     printf("\n posle udaleniya elementa \n");
     for(i = 0; i < j+1; i++){
         q->print();
         q=q->next;
         };
}

Аватара пользователя
Dominion
Сообщения: 1757
Зарегистрирован: Вс 13 июл, 2003 23:53
Откуда: Россия-Москва-Тушино
Контактная информация:

Сообщение Dominion » Сб 09 июн, 2007 21:17

Помогите плиз написать удаление , вот так же программа, но тут добавление заданного элемента после выбранного элемента. По сути можно просто изменить добавление на удаление, но что-то у меня все не то поулчается. Вот код:

Код: Выделить всё

#include <stdio.h>

class stek{
     public :
          int number;     
          stek *head;
          stek *prev;
          stek *next;
          stek(int i,stek *ptr1 = NULL,stek *ptr2 = NULL){

               number = i;
               next = ptr1;
               prev = ptr2;

          }

          void print(){

               printf(" %d \n",number);

          }
          void add(int i,stek *ptr1,int n){


                int j;
                stek *q=NULL;
                for (j = 0; j < n-1; j++){
                    ptr1 = ptr1->next;
                }
                q = new stek(i, ptr1->next, ptr1);
                ptr1->next->prev=q;
                ptr1->next=q;

          }
     };

void main(){

     int i,j,n,k,a[10];
     stek *p,*q = NULL;
     printf("Vvedite kol-vo elementov \n");
     scanf("%d",&j);
     
     printf("Vvodite chisla \n");
     for(i = 0; i < j; i++){

          scanf("%d",&a[i]);
          q = new stek(a[i], p, q);
          q->next = p;
          p=q;

}

     printf("Vvedite chislo kotoroe nado vstavlat \n");
       scanf("%d",&k);
     printf("Vvedite nomer, posle kotorogo nado vstavlat \n");
       scanf("%d",&n);

     printf(" do vstavki elementa \n");
     for(i = 0; i < j; i++){
         q->print();
         q=q->next;
         };
     q = p;
     q->add(k,p,n);
     q = p;
     printf("\n posle vstavki elementa \n");
     for(i = 0; i < j+1; i++){
         q->print();
         q=q->next;
         };
}

214
Сообщения: 166
Зарегистрирован: Сб 14 фев, 2004 20:03
Контактная информация:

Сообщение 214 » Вс 10 июн, 2007 1:23

Жесть какая-то :) Ты переименовал add в del и думаешь что все заработает? :)
Не все так просто. Надо еще чтобы предыдущий и следующий элементы больше не ссылались на удаляемый.
И еще у тебя prev всегда был равен next. Или next был равен prev...
head не используется по назначению. А зря

Код: Выделить всё

...

   void del(int i,stek *ptr1,int n){

      int j;
      for (j = 0; j < n-1; j++){
         ptr1 = ptr1->next;
      }
      // делаем чтобы предыдущий и следующий элемент ссылались
      // друг на друга, а не на удаляемый
      if (ptr1->next != NULL) ptr1->next->prev = ptr1->prev;
      if (ptr1->prev != NULL) ptr1->prev->next = ptr1->next;
      delete ptr1; // удаляем
   }
...
void main(){
   ...

   stek *p = NULL,*q = NULL; // инициализировать надо p, а не q
   ...
   printf("Vvodite chisla \n");
   for(i = 0; i < j; i++){
   
      scanf("%d",&a[i]);
      q = new stek(a[i], p, NULL); // q->prev равен NULL, а q->next будет равен p
      if (p != NULL) p->prev = q;  // p->prev будет ссылаеться на созданный элемент
      p=q;

   }
   ...
   q->del(i,p,n);
   q = p; // если удалили 1-ый элемент, то это не прокатит (n=1 -- p будет удален)
   printf("\n posle udaleniya elementa \n");
   for(i = 0; i < j-1; i++){ // j-1, т.к. мы удалили один элемент
      q->print();
      q=q->next;
   };

Аватара пользователя
Dominion
Сообщения: 1757
Зарегистрирован: Вс 13 июл, 2003 23:53
Откуда: Россия-Москва-Тушино
Контактная информация:

Сообщение Dominion » Вс 10 июн, 2007 10:45

Спасибо большое за разъяснение. Так стало понятней. :wink:

SERGant
Сообщения: 1003
Зарегистрирован: Вс 26 сен, 2004 22:04
Откуда: с планеты The Мля
Контактная информация:

Сообщение SERGant » Вс 10 июн, 2007 13:47

214 не расммторел случаи удаление элементов на конце списка. Надо изменить Head и Tail. Код не смотрел, видел только удаление элементов. Кстати почему реализация именно такая?


Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость