Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2013, 16:56   #1
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию симметрия списка на С++

Здравствуйте, помогите переделать задачку с Паскаля на С++:Дан список из n целых чисел a1,a2,...,an.Определить,является ли он симметричным.
Код:
Uses Crt;

type
  Plist = ^TList;
  TList = record
    info: integer;
    pred,next : PList;
  end;

Var
  Head : PList;
  n : integer;

{создание двусвязного списка со сторожем}
Procedure MakeList(Var head: PList; Var n:integer);
var
  p,q:PList;
  k:integer;

Begin {MakeList}

  new(head);
  head^.next:=nil;
  head^.pred:=nil;
  p:=head;
  writeln('введите элементы списка до 0');
  read(k);
  while k<>0 do
    begin
      new(q);
      q^.info:=k;
      q^.pred:=p;
      q^.next:=nil;
      p^.next:=q;
      p:=q;
      read(k);
    end;
  head^.pred:=p;
  writeln;
end;{MakeList}

{вывод списка на экран}
Procedure PrintList(head : PList);
Var
 p: PList;

Begin  {PrintList}
  writeln('данный список: ');
  p:=head^.next;
  while p<>nil do
  begin
    write(p^.info:4);
    p:=p^.next;
  end;
  writeln;
end;{PrintList}

{проверка симметрии списка*}
Procedure SimList(head: PList; n:integer);
Var
  p,q:PList;
  c:integer;

Begin {SimList}
 writeln;
 writeln('проверяем симметрию:');
 p:=head^.pred;
 q:=head^.next;
 c:=0;
 while (p<>q) and (p^.next <>q)  do
    begin
      write(p^.info:4);
      write(q^.info:4);

      p:=p^.pred;
      q:=q^.next;
      if p^.info=q^.info  then inc(c);
    end;
   writeln;

  if c=(n div 2) then
    writeln('список симметричен*')
  else
    writeln('список не симметричен*');
end;


Begin
  ClrScr;
  writeln('введите количество элементов');
  readln(n);
  MakeList(head,n);
  PrintList(head);
  SimList(head,n);
  readkey;
end.{SimList}
fkty вне форума Ответить с цитированием
Старый 07.10.2013, 18:41   #2
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

что то сделала,но исходный список выводит всегда с 0
Код:
#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;
};
typedef TList *PList;

//выделение памяти и заполнение полей нового элемента списка (возвращает указатель на него)
PList NewListNode(){
  PList Result = new TList;
  Result->Info = 0;
  Result->Next = NULL;
  Result->Pred = NULL;
  return Result;
}
//вывод списка на экран
void PrintList(PList List){
  cout << "список: ";
  while(List != NULL){
    cout << List->Info << " ";
    List = List->Next;
  }
  cout << "\n";
}
void MakeList(PList *Head, int n)
{
	 if(n > 0){
    srand(time(NULL));
    *Head = NewListNode();
	PList p=*Head;
	cout<<"введите элементы списка до 0"<<endl;
	int k;
	cin>>k;
	while (k!=0)
	{
		PList q;
		q=NewListNode();
		q->Info=k;
		q->Pred=p;
		q->Next=NULL;
		p->Next=q;
		p=q;
		cin>>k;
	}
	(*Head)->Pred=p;
	 }
}

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


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

}
fkty вне форума Ответить с цитированием
Старый 07.10.2013, 20:21   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

С указателями неверно работаешь.

Код копипастишь бездумно. почему makelist принимает количество элементов, которое надо ввести, а вводит "до нуля"? )

Код:
#include <iostream>
#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;
};
typedef TList *PList;

//выделение памяти и заполнение полей нового элемента списка (возвращает указатель на него)
PList NewListNode(){
  PList Result = new TList;
  Result->Info = 0;
  Result->Next = NULL;
  Result->Pred = NULL;
  return Result;
}
//вывод списка на экран
void PrintList(PList List){
  cout << "список: ";
  while(List != NULL){
    cout << List->Info << " ";
    List = List->Next;
  }
  cout << "\n";
}
void MakeList(PList *Head, int n)
{
   if(n > 0){
    *Head = NewListNode();
  PList p=*Head;
  int k;
  cin>>k;
  p->Info = k;
  while (--n)
  {
    cin>>k;
    PList q;
    q=NewListNode();
    q->Info=k;
    q->Pred=p;
    q->Next=NULL;
    p->Next=q;
    p=q;

  }

  (*Head)->Pred=p;
   }
}

PList p(PList head) {
  if (nullptr == head) throw "bad_arg";
  while (head->Next) head = head->Next;
  return head;
}

bool SimList(PList head, int n) {
  if (nullptr == head) throw "bad_arg";
  auto t = p(head);
  while (head) {
    if (head->Info != t->Info)
      return false;
    head = head->Next;
    t = t->Pred;
  }
  return true;
}


int main ()
{ setlocale(LC_ALL,"RUS");
  PList List;
  cout<<"введите количество элементов"<<endl;
  int n;
  cin>>n;
  MakeList(&List, n);
    PrintList(List);
    std::cout << SimList(List, n) << std::endl;
}
Работает ИНОГДА, но тут много ошибок )

Последний раз редактировалось rrrFer; 07.10.2013 в 20:32.
rrrFer вне форума Ответить с цитированием
Старый 08.10.2013, 18:15   #4
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

и в правду было лишнее n,но все же почему список выводится с 0?
Код:
#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;
};
typedef TList *PList;

//выделение памяти и заполнение полей нового элемента списка (возвращает указатель на него)
PList NewListNode(){
  PList Result = new TList;
  Result->Info = 0;
  Result->Next = NULL;
  Result->Pred = NULL;
  return Result;
}
//вывод списка на экран
void PrintList(PList List){
  cout << "список: ";
  while(List != NULL){
    cout << List->Info << " ";
    List = List->Next;
  }
  cout << "\n";
}
void MakeList(PList *Head)
{
	
    srand(time(NULL));
    *Head = NewListNode();
	PList p=*Head;
	cout<<"введите элементы списка до 0"<<endl;
	int k;
	cin>>k;
	while (k!=0)
	{
		PList q;
		q=NewListNode();
		q->Info=k;
		q->Pred=p;
		q->Next=NULL;
		p->Next=q;
		p=q;
		cin>>k;
	}
	(*Head)->Pred=p;
	 
}

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


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

}
fkty вне форума Ответить с цитированием
Старый 08.10.2013, 20:52   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
и в правду было лишнее n,но все же почему список выводится с 0?
потому что тут:
Цитата:
Код:
srand(time(NULL));
    *Head = NewListNode();
	PList p=*Head;
при создании списка ты ставишь ноль на первое место.
NewListNode() записывает в info ноль ведь:
Цитата:
Код:
PList NewListNode(){
  PList Result = new TList;
  Result->Info = 0; // !! тут
  Result->Next = NULL;
  Result->Pred = NULL;
  return Result;
}
и потом ты это значение не меняешь.

Однако, если не особо думать, а взять мой код - то там это исправлено. Но как как был ужасным, так и остался.ИМХО стоит все удалить и написать заново )
rrrFer вне форума Ответить с цитированием
Старый 08.10.2013, 22:09   #6
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

почему я не должна думать и брать чужой код программы не понятный мне,я пытаюсь исправить ошибку в своем коде и видимо здесь мне помочь не могут....
fkty вне форума Ответить с цитированием
Старый 09.10.2013, 01:44   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
почему я не должна думать и брать чужой код программы не понятный мне,я пытаюсь исправить ошибку в своем коде и видимо здесь мне помочь не могут....
где именно мне поставить за вас вопросительный знак в ваше предложение?
как еще вам помочь? - выше ответ разжеван и дважды проглочен. - еще раз?
Цитата:
и в правду было лишнее n,но все же почему список выводится с 0?
Цитата:
Код:
*Head = NewListNode();
Цитата:
Код:
PList NewListNode(){
  PList Result = new TList;
  Result->Info = 0; // !! тут
  Result->Next = NULL;
  Result->Pred = NULL;
  return Result;
}
Выделил цветом - так понятно должно быть уже в подготовительной группе. Могу снять видео, надо?
rrrFer вне форума Ответить с цитированием
Старый 09.10.2013, 13:35   #8
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

rrrFer,почему такая агрессия в мою сторону?не хотите помогать,не надо.я поняла где эта ошибка,я пытаюсь ее исправить.думаю Вы не сразу с яслей программировали так,чтобы Вам в подготовительной группе было все понятно.все в чем-то новички.
fkty вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица и симметрия! VooDoo-KiD JavaScript, Ajax 0 26.10.2012 08:43
как по вводу первых букв слова из списка подхватывать возможные вариации из списка 7EBEP Microsoft Office Excel 2 05.03.2012 11:11
Симметрия Донат Общие вопросы C/C++ 1 19.12.2011 19:11
Как сделать блокирование на определенном сайте из списка запрещенных IP и из определенного списка рефералов ? DeDoK PHP 7 05.12.2011 03:46
Составить программу, которая формирует 2 списка, и написать процедуру присоединения 2го списка к 1му Neitrosha Помощь студентам 7 25.02.2011 21:18