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


Автор: qwee 13.10.2013, 15:12
здравствуйте,помогите исправить логическую ошибку в функции 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 ;

}


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


Цитата(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.


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

Автор: qwee 13.10.2013, 16:26
n нужно для того чтобы проверять симметрию if (c==(n/2))

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

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


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