Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Однастороний список


Автор: ledi 26.4.2006, 22:36
Помогите пожалуйсто, на этой нидели уже сдавать надо, а у меня проблемы  smile 
Не работает функция izmest, эта функция должна стирать в списке те элементы у каторых цифра в списке совподает с порядковым номером, например, если у нас список = 54321, то izmest = 5421

Код

#include <iostream>
using namespace std;

struct elem                    
       {
       friend class saraksts;  
       elem *next;             
       int num;                
};

class saraksts
      {
      private:
              elem *sak;        
              elem *end;         
      public:                   
             saraksts();         
             ~saraksts();
             void pievienot(int);
             void erase();
             void print();
             void izmest();
      };
             
             saraksts::saraksts()                    
                  { 
                  sak = end = NULL;
                  };
                  
             saraksts::~saraksts()                  
                  {
                  erase();
                  };
                  
             void saraksts::pievienot(int x)        
             {
                  elem *tmp = new elem;
                  tmp -> next = NULL;
                  tmp -> num = x;
                  if ( sak == NULL )                
                  {
                     sak = tmp;                     
                  }
                  else
                  {
                     end -> next = tmp;             
                  }
                  end = tmp;
             };

             void saraksts::erase()                 
             {
                  elem *tmp;                        
                  while ( sak != NULL )             
                  {
                        tmp = sak;
                        sak = sak -> next;
                        delete tmp;
                  }
             };

             void saraksts::print()                 
             {
                  int num;
                  elem *tmp = sak;
                  if ( tmp == NULL ) 
                  {               
                     cout << "Saraksts ir tukshs!" << endl;
                  }
                  else 
                  {
                       while ( tmp != NULL ) 
                       {
                             cout << tmp -> num << " ";
                             tmp = tmp -> next; 
                       }
                  }
             };
             
             void saraksts::izmest()    
             {
                  int i=1;
                  elem *p1 = sak;
                  elem *p2 = sak;
                  elem *tmp = sak;
                  while (p2 != NULL)
                  {
                       
                        tmp = tmp -> next;
                        if (tmp != NULL) {
                        if (p2 == sak) {
                        if ( p2 -> num == i) {
                        
                           sak = sak -> next;
                           p1 = sak;
                           delete p2;
                           p2 = sak;
                           tmp = sak;
                        }
                         else
                        {
                             p2 = p2 -> next;
                        }
                       }
                        else if (tmp == end) 
                        {
                             if (p2 -> num == i) { 
                             
                                    p1 -> next = tmp;
                                    delete p2;
                                    p2 = tmp = NULL;
                                     }
                                    }else 
                                    {
                                          if (p2 -> num == i) 
                                          {
                                             p1 -> next = tmp;
                                             delete p2;
                                             p2 = tmp;
                                           }
                                           else
                                          {
                                            p2 = p2 -> next;
                                             p1 = p1 -> next;
                                          } 
                                        }
                                       }   else {
                                               p2 = NULL;
                                               }
                             
                          
                        }
                              
             
                i++;           
                        
                        
                  
             
};        






Зарание ОГРОМНОЕ спасибо за помощ! smile  

Автор: Lamak 26.4.2006, 23:45
 

136 строка   она за цыклом 

если запостиш тестовый main() то будет проще разобраться 

Автор: ledi 26.4.2006, 23:52
Спасибки, сейчас попробуем!  smile  

Автор: Lamak 26.4.2006, 23:59
 как должен работать izmest ?                                   

если у нас список 
    1 2 3 4 5 6
=  5 4 3 1 4 6  то izmest 
=  5 4 1 4        
или     
=  5 4 1 6
 

Автор: ledi 27.4.2006, 00:08
первый вариант  smile  если у нас 
543146 то
5414  

Автор: Lamak 27.4.2006, 00:21
тогда при удалении элемента надо i++;

а вообще
мне сложно разобраться в твоём коде и понять где там ошибка
но если хош могу завтра с утречка сварганить свой вариант метода  izmest

Добавлено @ 00:22 
т.е. уже сегодня smile  

Автор: ledi 27.4.2006, 00:27
Ой, даже и незнаю, свою как то роднее  smile  да и + я могу представить, 4то за код будет написан! Я почти уверенна, 4то много всего не пойму в нем т.к. я не професионал, а только 1курс  smile 

Спасибо за помощ полюбому!!!!!   smile 

 

Автор: MAKCim 27.4.2006, 08:02
friend в elem явно лишний
а так
Код

void saraksts::izmest()
{
    unsigned int i=1;
    elem* ptr=sak, previos=0;
    while (ptr)
    {
        elem* temp=ptr->next;
        if (ptr->num==i)
        {
            if (!previos) sak=sak->next;
            else previos->next=ptr->next;
            delete ptr;
        }
        else previos=ptr;
        ptr=temp;
        i++;
    }
}
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)