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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> симметрия списка 
:(
    Опции темы
qwee
Дата 13.10.2013, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



здравствуйте,помогите исправить логическую ошибку в функции SimList (дан список из целых чисел,нужно проверить является ли он симметричным)
Код

#include <iostream>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <locale.h>
#include <iomanip>

using namespace std;

struct TList {
  int Info;
  TList *Next,*Pred;
};


//вывод списка на экран
void PrintList(TList *Head,TList *Tail){
  cout << "список: ";
  TList *p=Head->Next;
  while(p != Tail){
    cout <<setw(4)<< p->Info;
    p = p->Next;
  }
  cout << "\n";
}
void MakeList(TList *&Head,TList *&Tail)
{
    Head = new TList;
    Tail=new TList;
    Head->Next=Tail;
    Tail->Pred=Head;
    cout<<"введите элементы списка до 0"<<endl;
    int k;
    cin>>k;
    while (k!=0)
    {
        TList *p;
        p=new TList;
        p->Info=k;
        p->Next=Tail;
        p->Pred=Tail->Pred;
        Tail->Pred=p;
        p->Pred->Next=p;
        cin>>k;
    }
    return;
     
}

void SimList(TList *Head,TList *Tail, int n)
{
    TList *p,*q;
cout<<"проверяем симметрию:"<<endl;
p=Head->Next;
q=Tail->Pred;
int c=0;
while((p!=q)&(p->Next!=q))
{
    cout<<setw(4)<<p->Info;
    cout<<setw(4)<<q->Info;
    cout<<endl;
    p=p->Next;
    q=q->Pred;
    if (p->Info==q->Info)
         c++;
}
    if (c==(n/2)){
        cout<<"список симметричен"<<endl;
    }else
    {cout<<"список не симметричен"<<endl;
    }
}


void main ()
{ setlocale(LC_ALL,"RUS");
  TList *Head;TList *Tail;
    cout<<"введите количество элементов"<<endl;
    int n;
    cin>>n;
    MakeList(Head,Tail);
    PrintList(Head,Tail);
    SimList(Head,Tail, n);
    getch();
    return ;

}


PM MAIL   Вверх
feodorv
Дата 13.10.2013, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А зачем Вам не функциональные первый и последний элементы списка?


Цитата(qwee @  13.10.2013,  16:12 Найти цитируемый пост)
p=Head->Next;
q=Tail->Pred;

Что будет, если список - пустой? p != q не сработает...


Цитата(qwee @  13.10.2013,  16:12 Найти цитируемый пост)
while((p!=q)&&(p->Next!=q))

Если в списке 2 значения, то сработает второе условие, и никакого сравнения не произойдёт (даже если значения равны). Да и при любом чётном числе значений всё будет не так, как задумано...


Цитата(qwee @  13.10.2013,  16:12 Найти цитируемый пост)
    if (p->Info==q->Info)
         c++;

Если значения не равны, то можно сразу писать, что список не симметричен и возвращаться из функции.


И наблюдается какое-то раздвоение личности: с одной стороны
Цитата(qwee @  13.10.2013,  16:12 Найти цитируемый пост)
    cout<<"введите элементы списка до 0"<<endl;
    int k;
    cin>>k;
    while (k!=0)

С другой стороны:
Цитата(qwee @  13.10.2013,  16:12 Найти цитируемый пост)
    cout<<"введите количество элементов"<<endl;
    int n;
    cin>>n;

А затем это n (хотя количество элементов списка может быть совсем другим - k) передаётся в функцию SimList.


И вообще говоря, число элементов списка для задачи не важно, можно обойтись и без него.

Это сообщение отредактировал(а) feodorv - 13.10.2013, 16:15


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


Новичок



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

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



n нужно для того чтобы проверять симметрию if (c==(n/2))
PM MAIL   Вверх
feodorv
Дата 13.10.2013, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(qwee @  13.10.2013,  17:26 Найти цитируемый пост)
n нужно для того чтобы проверять симметрию if (c==(n/2)) 

Цитата(feodorv @  13.10.2013,  17:09 Найти цитируемый пост)
Если значения не равны, то можно сразу писать, что список не симметричен и возвращаться из функции.




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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