Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка списка в список. 
:(
    Опции темы
Atij
Дата 21.5.2008, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Добрый день.
Помогите пожалуйста найти ошибку.

Вставить список B в список A за первым вхождением элемента "е" если "е" входит в A

Создаю список с заголовочным звеном:
Код

void Spisok::Construction (ifstream &file)
{

  node *t;
  int  el;

  t = phead; (*t).sled = NULL;
  while  (!file.eof())
  {
    (*t).sled = new (node);
    t = (*t).sled; (*t).elem = el; (*t).sled = NULL;
    file>>el;

  }


}


Ищу нужный элемент в А, если нашёл, то записываю его местоположение в Res, а следующее звено записываю в Res1, чтобы знать между чем вставлять спикос B:
Код

node *Spisok::Search (int el)
{

  node *t;

  Res = NULL;  t = phead;  t = (*t).sled;
  while  (t!=NULL)
    {
    if  ((*t).elem==el) {Res = t; t = (*t).sled; Res1=t; break;} 
    else  t = (*t).sled;
    }
  return Res;
}


Ну и соответсвенно основная часть проргаммы с крментариями:

Код

void Spisok::Work ()
{


  node *t,*t1;
  t = phead; t = (*t).sled;// перешагивая заголовочное звено 
  t1=t;  //записываю место расположения первого элемента списка B
  
  while (t!=NULL) //пробегаю до конца списка
  t=(*t).sled; 

  (*t).sled=Res1;// последний элемент вставляю перед Res1
  (*Res).sled=t1; //и первый элемент содержащий информационную часть связываю с указателем Res 


}


удаляю и вывожу списки:
Код

void Spisok::DelList ()
{
  node *q,*q1;

  q = phead;
  q1 = (*q).sled; 
  while (q1!=NULL)
  { q = q1; q1 = (*q1).sled; delete q;}
}

void Spisok::OutList ()

{
  node *t;

  t = phead; t = (*t).sled; t = (*t).sled;

for ((*t).sled;t!=NULL;t = (*t).sled)
output<<(*t).elem <<" ";

}


main() и описание класса, соответсвено вот:

Код

struct node
{
  int  elem;
  node *sled;
};

class Spisok 
{
   private:
     node *phead, *Res, *Res1;
   public:
     Spisok() {phead=new(node);Res=NULL;Res1=NULL;}
     ~Spisok() {delete phead;}
     void Construction (ifstream &);
     void OutList ();
     void Work ();
     node *Search (int);
     void DelList();
};

void main ()
{

  Spisok A;
  Spisok B;
  
  int e;

 el>>e;  

 A.Construction (inputL);
  output<<"Elements from list L:"<<endl;
  A.OutList ();

 B.Construction (inputL1);
  output<<endl<<"Elements from list L1:"<<endl;
  B.OutList ();
 
  output<<endl<<"Element e: "<<endl<<e;
  
 if (A.Search (e)!=NULL)
    {
        B.Work ();
        output<<endl<<"Created list:"<<endl;
        A.OutList ();
    }
 else 
 output<<endl<<"Created list is empty, e wasn`t found:"<<endl;
  
  A. DelList();
  B. DelList();
  
}


Выводит в результирующем списке список A не модрнизированный.
Большое спасибо за внимание.

PM MAIL   Вверх
mes
Дата 21.5.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



я так понял, это попытка создать свой список ради обучения  в противовес использования стандартных решений stl`а..
но посмотреть логику у проверенного решения не помешало бы.. ))


class Spisok 
{
   private:
     node *phead, 
      *Res, *Res1; // - это не должно быть членом этого класса
   public:
     Spisok() {phead=new(node);Res=NULL;Res1=NULL;} // зачем создаешь node для pheаd?  какое значение она хранить будет?
     ~Spisok() {delete phead;} // удаляет только главный элемент , а остальное кто будет удалять? (только не говори что программист)
     void Construction (ifstream &); 
     void OutList ();  
     void Work (); // и этот метод здесж также лишний
     node *Search (int); // поиск по значению - но если два значения то вернет найдет только одно // поэтому 
     void DelList(); 
};

также не понятно какой смысл делать список типа list для int`ов
и еше желательно наименование интерфейса делать стандартиризованным

Добавлено через 2 минуты и 26 секунд
на сам вопрос ответ искать бессмыслено потому как все равно это надо переделать 


--------------------
PM MAIL WWW   Вверх
Atij
Дата 21.5.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Что касается:
Цитата

class Spisok 
{
   private:
     node *phead, 
      *Res, *Res1; // - это не должно быть членом этого класса
   public:
     Spisok() {phead=new(node);Res=NULL;Res1=NULL;} // зачем создаешь node для pheаd?  какое значение она хранить будет?

то делал я это по аналогии с Этим 
примером.
Насчёт: 
Цитата

~Spisok() {delete phead;} // удаляет только главный элемент , а остальное кто будет удалять? (только не говори что программист)

Да, здесь не заметил, сцори=)

Что касается:
Цитата

node *Search (int); // поиск по значению - но если два значения то вернет найдет только одно // поэтому 

Почему?
По этому поводу:
Цитата

также не понятно какой смысл делать список типа list для int`ов

Вы сами ответили на свой вопрос, я делаю это в учебных целях, учусь так сказать)
Ну и наконец:
Цитата

на сам вопрос ответ искать бессмыслено потому как все равно это надо переделать 

Думаю, вся проблема в этих строках:
Код

(*t).sled=Res1;// последний элемент вставляю перед Res1
 (*Res).sled=t1; //и первый элемент содержащий информационную часть связываю с указателем Res 

потомучто выводится исходный список А, модернизация не происходит.
Спс за нимание=)
PM MAIL   Вверх
mes
Дата 21.5.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Atij @  21.5.2008,  11:28 Найти цитируемый пост)
то делал я это по аналогии с Этим 

посмотрел..осталось не очень приятное впечатление.. 
например здесь

Код

 node *Spisok::POISK (int el)
{
  node *t;

  Res = NULL; // обнуление результата
  t = phead; t = (*t).sled; //  не легче здесь написать t=phead->sled;  //кстати а где проверка phead  на NULL? 
                                           // также обратите внимание что поиск всегда начинается со следуюшего элемента после головы
  while  (t!=NULL && Res==NULL) 
    if  ((*t).elem==el)  Res = t; // запоминаем результат, но для чего? поиск все равно начнется не с этой точки (см. выше)
    else  t = (*t).sled;
  return Res; 
}


сочуствую тем кому приходится учиться по таким образцам..

Это сообщение отредактировал(а) mes - 21.5.2008, 11:59


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.