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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список: потеря связи между элементами. Потеря связи между элементами списка. 
V
    Опции темы
Kemix
  Дата 22.4.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И ещё раз здравствуйте, уважаемое сообщество.
На этот раз проблема с ООП на базе C++.
Задача:Дан список А, занести в список Б порядковые номера элементов содержащих максимум (т.е. могут быть несколько элементов содрежащих максимальное число).
Проблема:При заполнении списка есть связь только между предпоследним и последним элементом списка.
Код:
Код

#include "stdafx.h"

#pragma hdrstop
#include <iostream>
#pragma argsused
using namespace std;
struct spisok {
        int chislo;
        spisok * next;
    };
//---------------------------------------------------------------------------

void print(spisok *tmp)
{
  while(tmp!=NULL)
  {
   cout << tmp->chislo<<" ";
   tmp=tmp->next;
  }
}
spisok* add(spisok *tmp, int tempch)
{
 if (tmp==NULL) {
 tmp=new spisok;
 tmp->chislo=tempch;
 tmp->next=NULL;
}
else
{
 while(tmp->next!=NULL)
 {
  tmp=tmp->next;
 }
 spisok *tmpx;
 tmpx=new spisok;
 tmpx->chislo=tempch;
 tmpx->next=NULL;
 tmp->next=tmpx;
}
return tmp;
}
int searchmax(spisok *tmp)
{
  int max=tmp->chislo, i=0;
  while(tmp->next!=NULL)
  {
   if (tmp->chislo>max) {max=tmp->chislo; ++i;}
  }
  return i;
}
int main(int argc, char* argv[])
{
    spisok *a=NULL;
    int x=1;
    cout << "Zapolnite massive A, 0 - okonchanie \n";
    while(x!=0)
    {
    cin >> x;
    if (x!=0){
    a=add(a,x);
    }
    else
    {break;}
    }
    cout << "Pechat' spiska A \n";
    print(a);
    cout << "Maximum = " << searchmax(a) << "\n";
    cin >> x;
    return 0;
}

Заранее спасибо smile.
PM MAIL   Вверх
feodorv
Дата 22.4.2012, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Kemix @  22.4.2012,  16:18 Найти цитируемый пост)
Проблема:При заполнении списка есть связь только между предпоследним и последним элементом списка.

А то:
Цитата(Kemix @  22.4.2012,  16:18 Найти цитируемый пост)
spisok* add(spisok *tmp, int tempch)
{
 if (tmp==NULL) {
 tmp=new spisok;
 tmp->chislo=tempch;
 tmp->next=NULL;
}
else
{
 while(tmp->next!=NULL)
 {
  tmp=tmp->next;
 }
 spisok *tmpx;
 tmpx=new spisok;
 tmpx->chislo=tempch;
 tmpx->next=NULL;
 tmp->next=tmpx;
}
return tmp;
}


Если при входе в функцию tmp есть NULL, то под него выделяется память и она же возвращается из функции.
А если не NULL, тогда беда:
Цитата(Kemix @  22.4.2012,  16:18 Найти цитируемый пост)
 while(tmp->next!=NULL)
 {
  tmp=tmp->next;
 }

В результате tmp перестаёт указывать на начало списка и начинает указывать на его конец. При добавлении нового элемента tmp начинает указывать на предпоследний элемент списка. Начало потеряно  smile 

При работе со связными списками лучше всего называть начало списка head'ом, последний элемент - tail'ом. Тогда при чтении программы сразу возникнет вопрос: а чего это head изменяется, ведь не должен? При использовании имён типа tmp глаз замыливается...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Kemix
Дата 22.4.2012, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(feodorv @  22.4.2012,  18:32 Найти цитируемый пост)
При работе со связными списками лучше всего называть начало списка head'ом, последний элемент - tail'ом. Тогда при чтении программы сразу возникнет вопрос: а чего это head изменяется, ведь не должен? При использовании имён типа tmp глаз замыливается... 

Т.е. вы предлагаете заменить tmp на tail, но передавать в функцию указатель head, с которого tail и начнёт "прогонку" до NULL?
PM MAIL   Вверх
feodorv
Дата 22.4.2012, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Kemix @  22.4.2012,  23:39 Найти цитируемый пост)
Т.е. вы предлагаете заменить tmp на tail, но передавать в функцию указатель head, с которого tail и начнёт "прогонку" до NULL? 

Ага:
Код

spisok *add( spisok *head, int num)
{
   if( head == NULL ) 
  {
     head = new spisok;
     head->chislo = num;
     head->next=NULL;
  }
  else
  {
     spisok *tail;
     for( tail = head; tail->next != NULL; tail = tail->next) continue;
     spisok *tmp = new spisok;
     tmp->chislo = num;
     tmp->next=NULL;
     tail->next = tmp;
  }

  return head;
}

При этом head в else не меняется (у Вас - менялось) smile 
Было бы недурно сделать конструктор к spisok(num), который автоматом бы ставил next в NULL...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Kemix
  Дата 25.4.2012, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем. Задача сдана.
Вот финальный код:
Код

#include "stdafx.h"
#include <iostream>
using namespace std;
struct spisok {
        int chislo;
        spisok * next, * head;
    };
//---------------------------------------------------------------------------

void print(spisok *tmp)
{
  while(tmp!=NULL)
  {
   cout << tmp->chislo<<" ";
   tmp=tmp->next;
  }
}
spisok *add( spisok *head, int num)
{
   if( head == NULL ) 
  {
     head = new spisok;
     head->chislo = num;
     head->next=NULL;
  }
  else
  {
     spisok *tail;
     for( tail = head; tail->next != NULL; tail = tail->next) continue;
     spisok *tmp = new spisok;
     tmp->chislo = num;
     tmp->next=NULL;
     tail->next = tmp;
  }
  return head;
}
int searchmax(spisok *head)
{ 
  spisok *tail;
  tail=head;
  int max=tail->chislo;
  do
  {
   tail = tail->next;
   if (tail->chislo>max)
   {max=tail->chislo;}
  }
  while(tail->next!=NULL);
  return max;
}
spisok *kolmax(spisok *head, int max)
{
  spisok *tail, *headb;
  int i=0;
  tail=head;
  headb=NULL;
  while(tail->next!=NULL)
  {
   if (tail->chislo==max)
   {
       headb=add(headb,i);
   }
   tail = tail->next;
   i++;
  }
  if (tail->chislo==max)
   {
       headb=add(headb,i);
   }
  return headb;
}
int main(int argc, char* argv[])
{
    spisok *head=NULL;
    int x=1;
    cout << "Zapolnite massive A, 0 - okonchanie \n";
    while(x!=0)
    {
    cin >> x;
    if (x!=0){
    head=add(head,x);
    }
    else
    {break;}
    }
    cout << "Pechat' spiska A \n";
    print(head);
    cout << "\n";
    cout << "Maximum = " << searchmax(head) << "\n";
    cout << "Poryadkovie nomera: \n";
    print(kolmax(head, searchmax(head)));
    cin >> x;
    return 0;
}

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

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

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

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

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


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

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


 




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


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

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