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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Списки! Удвоить вхождение элемента 
V
    Опции темы
pr0ze
Дата 5.12.2012, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



После ввода нужного символа не выводит список ..помогите разобраться пожалуйста :о
Код



#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream>
using namespace std;//Совместимость с новыми компиляторами
//Программа для работы с линейным списком
typedef char Tinf;
struct Tel{
  Tinf inf;
  Tel* pSled;
};
Tel* head;
Tel* foot;
void InSpK(Tinf infEl){
  Tel* pn; //{Ссылка на новый элемент}
  pn = new Tel();//{Резервирование памяти для нового элемента}
  pn->inf=infEl;
  foot->pSled=pn;
  pn->pSled=NULL;//{Заполнение поля ссылки}
  foot=pn;       //{Новая ссылка на головной элемент}
}
void SozdSpN(){
  char s;
  foot=NULL;
  cout << "Введите элементы списка L ";
  cout <<  "Символ '*' будет означать конец списка ";
  do{
      cin >> s;
      if(foot != NULL){
          InSpK(s);
        }else{
          head = new Tel(); //{Резервирование памяти для нового элемента}
          head->inf=s; //{Заполнение поля информации}
          head->pSled=NULL;// {Заполнение поля ссылки}
          foot=head;
        }
    }while (s!='*');
}
void ProsmSp(){
  Tel* pt;
  if(head==NULL){
      cout << "Список пуст!";
      return;
    }
  cout << "элементы списка L:";
  pt=head;
  while (pt->pSled!= NULL)
    {
      cout << pt->inf;
      pt=pt->pSled;
    }
}
void InSpP(Tinf infEl, Tel* pred){
  Tel* pn;// {Ссылка на новый элемент}
  if (pred!=NULL ){ // {Предыдущий элемент существует?}
      pn = new Tel();
      pn->inf=infEl; //{Заполнение поля информации}
      pn->pSled=pred->pSled;// {Заполнение поля ссылки}
      pred->pSled=pn; //{Обновление поля ссылки}
      pred=pn;
    }
}
void insertElAfter(Tinf cmp){
  Tel* pt; //{Cсылка на текущий элемент}
  pt=head;
  while (pt!=NULL){
      if (pt->inf==cmp){
          InSpP(cmp,pt);
        }
      pt=pt->pSled;//{Установка ссылки на следующий элемент}
    }
}
char E1;
int main()
{
  int var;
  int select;
  setlocale(LC_ALL,"Russian");//Ставим русский язык для консоли
  SozdSpN(); //{Прямое включение элементов}
  cout << "Введите элемент Е1 ";
  cin >> E1;

  insertElAfter(E1);
  cout << "Элемент E1="<<E1<<":\n";
  ProsmSp();
}


Это сообщение отредактировал(а) pr0ze - 5.12.2012, 21:03
PM MAIL   Вверх
Albor
Дата 6.12.2012, 08:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это сразу бросилось в глаза:
Код

void InSpP(Tinf infEl, Tel* pred)

InSpP работает с копией указателя pred, а ожидается, наверное, что этот указатель изменит своё значение по окончании работы функции, так как
Код

//.....
pred=pn;// эта строка не изменит входной указатель
 
PM MAIL ICQ   Вверх
Albor
Дата 6.12.2012, 08:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ещё: ф-ция 
Код

void SozdSpN()

постоянно обновляет указатель head, а в конце foot=head, в результате и foot и head будут адресовать хвост списка, а начало теряется и, как результат - список недоступен и будет утечка памяти.
Сделай head константным и компилятор не даст тебе "уничтожить" раньше времени голову списка:
Код

Tel* const head = new Tel; // константный указатель на объект Tel


Это сообщение отредактировал(а) Albor - 6.12.2012, 09:01
PM MAIL ICQ   Вверх
feodorv
Дата 6.12.2012, 09:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Albor @  6.12.2012,  09:43 Найти цитируемый пост)
постоянно обновляет указатель head

Тут всё запущенней))) Обновление происходит один-единственный раз, когда tail == NULL. Когда tail != NULL вызывается подпрограмма вставки нового элемента в непустой список InSpK() smile 

Тупо нужно отладчиком посмотреть, где что портится. 


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


Опытный
**


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

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



Точно! Я невнимателен.
PM MAIL ICQ   Вверх
pr0ze
Дата 11.12.2012, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема еще и в том, что продебажить эту программу у меня не получается(..в других с отладчиком проблем не было
PM MAIL   Вверх
feodorv
Дата 11.12.2012, 08:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(pr0ze @  11.12.2012,  03:33 Найти цитируемый пост)
Проблема еще и в том, что продебажить эту программу у меня не получается(..в других с отладчиком проблем не было 

Я не Станиславский, но "Не верю!!!"))))

Не удаётся отдебажить программу при помощи инструментария своей среды программирования, вставьте вывод на экран в ключевых точках программы. Я, например, грешу вообще на код, добавляющий элементы. Сделайте, например, так:
Цитата(pr0ze @  5.12.2012,  21:58 Найти цитируемый пост)
  do{
      cin >> s;
      if(foot != NULL){
          InSpK(s);
        }else{
          head = new Tel(); //{Резервирование памяти для нового элемента}
          head->inf=s; //{Заполнение поля информации}
          head->pSled=NULL;// {Заполнение поля ссылки}
          foot=head;
        }
       ProsmSp();
    }while (s!='*');

Тогда получите вывод списка элементов после каждого добавления нового элемента. Посмотрите, тот ли это список, который должен получаться. Для отладки лучше ограничиться небольшим числом элементов списка. Проблема может быть так же и в самой функции печати.


Если всё нормально, то подобным образом под микроскопом стОит рассмотреть функцию insertElAfter():
Цитата(pr0ze @  5.12.2012,  21:58 Найти цитируемый пост)
void insertElAfter(Tinf cmp){
  Tel* pt; //{Cсылка на текущий элемент}
  pt=head;
  while (pt!=NULL){
      cout << "insertElAfter(" << cmp << "): pt->inf = " << pt->inf << endl;
      if (pt->inf==cmp){
          cout << "insertElAfter(" << cmp << "): Found!!!" << endl;
          InSpP(cmp,pt);
          break; // или pt=pt->pSled; если требуется вставить новый элемент после каждого найденного
        }
      pt=pt->pSled;//{Установка ссылки на следующий элемент}
    }
}



И пожалуйста, поправьте следующее (а то меня постоянно нервирует  smile ):
Цитата(pr0ze @  5.12.2012,  21:58 Найти цитируемый пост)
void SozdSpN(){
  char s;
  foot=NULL;
  head=NULL;


Добавлено через 1 минуту и 27 секунд
Цитата(feodorv @  11.12.2012,  09:05 Найти цитируемый пост)
         break; // или pt=pt->pSled; если требуется вставить новый элемент после каждого найденного

Вот это точно нужно добавить безо всякого отношения к дебажению)))


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


Новичок



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

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



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

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

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

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

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


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

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


 




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


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

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