Консультация № 190194
30.11.2016, 11:29
0.00 руб.
0 2 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Написать программу для получения из односвязного, двусвязного и двусвязного списка с головой циклического списка уникальных элементов.
Oписаны структуры данных, для каждой написан метод поиска уникальных элементов, но работает он не правильно. В этом главная проблема. Не знаю правильно ли я поняла и описала двусвязный и двусвязный список с головой
Еще вызывает затруднения создания самого списка уникальных элементов.
Код местами корявый и запутанный, а может и не местами

Приложение:
#pragma once
#include <iostream>
#include "stdlib.h"

using namespace std;

struct One_List {//структура данных
int Data; //информационное поле
One_List *Next; //адресное поле
};

int GetElement(One_List *Head, int pos, int Count)
{
One_List *temp = Head;

// Позиция от 1 до Count?
if (pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return 0;
}

int i = 1;
// Ищем нужный нам элемент
while (i < pos && temp != 0)
{
temp = temp->Next;
i++;
}

if (temp == 0)
return 0;
else
return temp->Data;
}

void Creation_List(int n, One_List** Head)
{
if (n > 0)
{
(*Head) = new One_List(); //выделяем память под новый элемент
cout << "Введите значение ";
cin >> (*Head)->Data; //вводим значение информационного поля
(*Head)->Next = NULL; //обнуление адресного поля
Creation_List(n - 1, &((*Head)->Next));
}
}

void Print_List(One_List* Head)
{
if (Head != NULL)
{
cout << Head->Data << "\t";
Print_List(Head->Next);
//переход к следующему элементу
}
else cout << "\n";
}

void Delete_List(One_List* Head)
{
if (Head != NULL) {
Delete_List(Head->Next);
delete Head;
}
}

One_List* Insert_Item_List(One_List* Head, int Number, int DataItem)
{
Number--;
One_List *NewItem = new One_List();
NewItem->Data = DataItem;
NewItem->Next = NULL;
if (Head == NULL) //список пуст
{
Head = NewItem; //создаем первый элемент списка
}
else //список не пуст
{
One_List *Current = Head;
for (int i = 1; i < Number && Current->Next != NULL; i++)
Current = Current->Next;
if (Number == 0)
{
//вставляем новый элемент на первое место
NewItem->Next = Head;
Head = NewItem;
}
else //вставляем новый элемент на непервое место
{
if (Current->Next != NULL)
NewItem->Next = Current->Next;
Current->Next = NewItem;
}
}
return Head;
}

void Delete_Item_List(One_List** Head, int Number) {
One_List *ptr;//вспомогательный указатель
One_List *Current = (*Head);
for (int i = 1; i < Number && Current != NULL; i++)
Current = Current->Next;
if (Current != NULL) //проверка на корректность
{
if (Current == (*Head)) //удаляем первый элемент
{
(*Head) = (*Head)->Next;
delete(Current);
Current = (*Head);
}
else if (Current->Next == NULL)
{
ptr = (*Head);
while (ptr->Next != Current)
ptr = ptr->Next;
ptr->Next = NULL;
delete(Current);
Current = ptr;

}
else //удаляем непервый элемент
{
ptr = (*Head);
while (ptr->Next != Current)
ptr = ptr->Next;
ptr->Next = Current->Next;
delete(Current);
Current = ptr;
}
}
}

void Find_Item_List(One_List* Head)
{
One_List *t, *l, *q, *p, *i;
bool flag = false;
p = Head;
i = Head;
l = Head;
while (p != NULL)
{
flag = false;
for (t = i = p->Next; i != NULL; )
{
if (p->Data == i->Data)
{
flag = true;
q = i->Next;
if (t == i)
t = p->Next = i->Next;
else
t->Next = i->Next;

delete i;
i = q;
continue;
}
t = i;
i = i->Next;
}
if (flag) {
l = p->Next;
delete p;
p = l;
}
else
p = p->Next;
}
}








struct Double_List //структура данных
{
int Data; //информационное поле
Double_List *Next; //адресное поле
Double_List *Previous; //адресное поле
};

int GetDoubleElement(Double_List *Head, int pos, int Count)
{
Double_List *temp = Head;

// Позиция от 1 до Count?
if (pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return 0;
}

int i = 1;
// Ищем нужный нам элемент
while (i < pos && temp != 0)
{
temp = temp->Next;
i++;
}

if (temp == 0)
return 0;
else
return temp->Data;
}


//создание двунаправленного списка (добавления в конец)
void Creation_Double_List(int n, Double_List** Head, Double_List* Previous)
{
(*Head) = new Double_List();
if (n > 0) {

//выделяем память под новый элемент
cout << "Введите значение ";
cin >> (*Head)->Data;
//вводим значение информационного поля
(*Head)->Previous = Previous;
(*Head)->Next = NULL;//обнуление адресного поля
Creation_Double_List(n - 1, &((*Head)->Next), (*Head));
}
else (*Head) = NULL;
}

//печать двунаправленного списка
void Print_Double_List(Double_List* Head)
{
if (Head != NULL) {
cout << Head->Data << "\t";
Print_Double_List(Head->Next);
//переход к следующему элементу
}
else cout << "\n";
}

//освобождение памяти, выделенной под двунаправленный список
void Delete_Double_List(Double_List* Head)
{
if (Head != NULL) {
Delete_Double_List(Head->Next);
delete Head;
}
}


Double_List* Insert_To_Double_List(Double_List* Head, int Number, int Data)
{
Number--;
Double_List *NewItem = new Double_List;
NewItem->Data = Data;
NewItem->Previous = NULL;
NewItem->Next = NULL;

if (Head == NULL) {//список пуст
Head = NewItem;
}
else {//список не пуст
Double_List *Current = Head;
for (int i = 1; i < Number && Current->Next != NULL; i++)
Current = Current->Next;
if (Number == 0) {
//вставляем новый элемент на первое место
NewItem->Next = Head;
Head->Previous = NewItem;
Head = NewItem;
}
else {//вставляем новый элемент на непервое место
if (Current->Next != NULL) {
Current->Next->Previous = NewItem;
NewItem->Next = Current->Next;
Current->Next = NewItem;
NewItem->Previous = Current;
Current = NewItem;
}
}
}
return Head;
}

void Find_Item_Double_List(Double_List* Head)
{
Double_List *t, *l, *q, *p, *i;
bool flag = false;
p = Head;
i = Head;
l = Head;
while (p != NULL)
{
flag = false;
for (t = i = p->Next; i != NULL; )
{
if (p->Data == i->Data)
{
flag = true;
q = i->Next;
if (t == i)
t = p->Next = i->Next;
else
t->Next = i->Next;

delete i;
i = q;
continue;
}
t = i;
i = i->Next;
}
if (flag) {
l = p->Next;
delete p;
p = l;
}
else p = p->Next;
}
//(*Head) = p;
}






struct Elem
{
int Data; // данные
Elem * Next, *Prev;
};




class List
{
// Голова, хвост
Elem * Head, *Tail;
// Количество элементов
int Count;

public:

// Конструктор
List();
// Конструктор копирования
List(const List&);
// Деструктор
~List();

// Получить количество
int GetCount();
// Получить элемент списка
int GetElem(int);

// Удалить весь список
void DelAll();
// Удаление элемента, если параметр не указывается,
// то функция его запрашивает
void Del(int pos = 0);
// Вставка элемента, если параметр не указывается,
// то функция его запрашивает
void Insert(int pos = 0);

// Добавление в конец списка
void AddTail(int n);

// Добавление в начало списка
void AddHead(int n);

// Печать списка
void Print();
// Печать определенного элемента
void Print(int pos);
// Поиск уникальных элементов
void Find_Unic_Item_List();
};


List::List()
{
// Изначально список пуст
Head = Tail = NULL;
Count = 0;
}

List::List(const List & L)
{
Head = Tail = NULL;
Count = 0;

// Голова списка, из которого копируем
Elem * temp = L.Head;
// Пока не конец списка
while (temp != 0)
{
// Передираем данные
AddTail(temp->Data);
temp = temp->Next;
}
}

List::~List()
{
// Удаляем все элементы
DelAll();
}

void List::AddHead(int n)
{
// новый элемент
Elem * temp = new Elem;

// Предыдущего нет
temp->Prev = 0;
// Заполняем данные
temp->Data = n;
// Следующий - бывшая голова
temp->Next = Head;

// Если элементы есть?
if (Head != 0)
Head->Prev = temp;

// Если элемент первый, то он одновременно и голова и хвост
if (Count == 0)
Head = Tail = temp;
else
// иначе новый элемент - головной
Head = temp;

Count++;
}

void List::AddTail(int n)
{
// Создаем новый элемент
Elem * temp = new Elem;
// Следующего нет
temp->Next = 0;
// Заполняем данные
temp->Data = n;
// Предыдущий - бывший хвост
temp->Prev = Tail;

// Если элементы есть?
if (Tail != 0)
Tail->Next = temp;

// Если элемент первый, то он одновременно и голова и хвост
if (Count == 0)
Head = Tail = temp;
else
// иначе новый элемент - хвостовой
Tail = temp;

Count++;
}

void List::Insert(int pos)
{
// если параметр отсутствует или равен 0, то запрашиваем его
if (pos == 0)
{
cout << "Input position: ";
cin >> pos;
}

// Позиция от 1 до Count?
if (pos < 1 || pos > Count + 1)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}

// Если вставка в конец списка
if (pos == Count + 1)
{
// Вставляемые данные
int data;
cout << "Input new number: ";
cin >> data;
// Добавление в конец списка
AddTail(data);
return;
}
else if (pos == 1)
{
// Вставляемые данные
int data;
cout << "Input new number: ";
cin >> data;
// Добавление в начало списка
AddHead(data);
return;
}

// Счетчик
int i = 1;

// Отсчитываем от головы n - 1 элементов
Elem * Ins = Head;

while (i < pos)
{
// Доходим до элемента,
// перед которым вставляемся
Ins = Ins->Next;
i++;
}

// Доходим до элемента,
// который предшествует
Elem * PrevIns = Ins->Prev;

// Создаем новый элемент
Elem * temp = new Elem;

// Вводим данные
cout << "Input new number: ";
cin >> temp->Data;

// настройка связей
if (PrevIns != 0 && Count != 1)
PrevIns->Next = temp;

temp->Next = Ins;
temp->Prev = PrevIns;
Ins->Prev = temp;

Count++;
}

void List::Del(int pos)
{
// если параметр отсутствует или равен 0, то запрашиваем его
if (pos == 0)
{
cout << "Input position: ";
cin >> pos;
}
// Позиция от 1 до Count?
if (pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}

// Счетчик
int i = 1;

Elem * Del = Head;

while (i < pos)
{
// Доходим до элемента,
// который удаляется
Del = Del->Next;
i++;
}

// Доходим до элемента,
// который предшествует удаляемому
Elem * PrevDel = Del->Prev;
// Доходим до элемента, который следует за удаляемым
Elem * AfterDel = Del->Next;

// Если удаляем не голову
if (PrevDel != 0 && Count != 1)
PrevDel->Next = AfterDel;
// Если удаляем не хвост
if (AfterDel != 0 && Count != 1)
AfterDel->Prev = PrevDel;

// Удаляются крайние?
if (pos == 1)
Head = AfterDel;
if (pos == Count)
Tail = PrevDel;

// Удаление элемента
delete Del;

Count--;
}

void List::Print(int pos)
{
// Позиция от 1 до Count?
if (pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}

Elem * temp;

// Определяем с какой стороны
// быстрее двигаться
if (pos <= Count / 2)
{
// Отсчет с головы
temp = Head;
int i = 1;

while (i < pos)
{
// Двигаемся до нужного элемента
temp = temp->Next;
i++;
}
}
else
{
// Отсчет с хвоста
temp = Tail;
int i = 1;

while (i <= Count - pos)
{
// Двигаемся до нужного элемента
temp = temp->Prev;
i++;
}
}
// Вывод элемента
cout << pos << " element: ";
cout << temp->Data << endl;
}

void List::Print()
{
// Если в списке присутствуют элементы, то пробегаем по нему
// и печатаем элементы, начиная с головного
if (Count != 0)
{
Elem * temp = Head;
cout << "( ";
while (temp->Next != 0)
{
cout << temp->Data << ", ";
temp = temp->Next;
}

cout << temp->Data << " )\n";
}
}

void List::DelAll()
{
// Пока остаются элементы, удаляем по одному с головы
while (Count != 0)
Del(1);
}

int List::GetCount()
{
return Count;
}

int List::GetElem(int pos)
{
Elem *temp = Head;

// Позиция от 1 до Count?
if (pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return 0;
}

int i = 1;
// Ищем нужный нам элемент
while (i < pos && temp != 0)
{
temp = temp->Next;
i++;
}

if (temp == 0)
return 0;
else
return temp->Data;
}

/*
// сложение двух списков
List List::operator + (const List& L)
{
// Заносим во временный список элементы первого списка
List Result(*this);
// List Result = *this;

Elem * temp = L.Head;

// Добавляем во временный список элементы второго списка
while (temp != 0)
{
Result.AddTail(temp->data);
temp = temp->next;
}

return Result;
}*/

void List::Find_Unic_Item_List()
{
Elem *t, *l, *q, *p, *i;
bool flag = false;
p = Head;
i = Head;
l = Head;
while (p != NULL)
{
flag = false;
for (t = i = p->Next; i != NULL; )
{
if (p->Data == i->Data)
{
flag = true;
q = i->Next;
if (t == i)
t = p->Next = i->Next;
else
t->Next = i->Next;

delete i;
i = q;
continue;
}
t = i;
i = i->Next;
}
if (flag) {
l = p->Next;
delete p;
p = l;
}
else p = p->Next;
}
Head = p;
}





struct Circle_Double_List //структура данных
{
int Data; //информационное поле
Circle_Double_List *Next; //адресное поле
Circle_Double_List *Prior; //адресное поле
};

//создание циклического двунаправленного списка
Circle_Double_List* Make_Circle_Double_List(int n, Circle_Double_List** Head, Circle_Double_List* Loop) {
Circle_Double_List* ptr;//вспомогательный указатель
if (n > 0) {
(*Head) = new Circle_Double_List();
//выделяем память под новый элемент
if (Loop == NULL) Loop = (*Head);
cout << "Введите значение ";
cin >> (*Head)->Data;
//вводим значение информационного поля
(*Head)->Next = NULL;//обнуление адресного поля
ptr = Make_Circle_Double_List(n - 1, &((*Head)->Next), Loop);
if ((*Head)->Next != NULL)
(*Head)->Next->Prior = (*Head);
if ((*Head)->Prior == NULL)
(*Head)->Prior = ptr;
if (ptr == NULL)
return *Head;
else return ptr;
}
else {
(*Head) = Loop;
return NULL;
}
}

//печать циклического двунаправленного списка
void Print_Circle_Double_List(Circle_Double_List* Head)
{
Circle_Double_List* ptr = Head;
//вспомогательный указатель
do {
cout << ptr->Data << "\t";
ptr = ptr->Next;
} while (ptr != Head);
cout << "\n";
}

/*вставка элемента после заданного номера в циклический двунаправленный список*/
void Insert_List_Circle_Double_List(Circle_Double_List** Head, int Number, int DataItem) {
Circle_Double_List *Current = (*Head);
//встали на первый элемент
Circle_Double_List *NewItem = new(Circle_Double_List);
//создали новый элемент
NewItem->Data = DataItem;
if ((*Head) == NULL) {//список пуст
NewItem->Next = NewItem;
NewItem->Prior = NewItem;
(*Head) = NewItem;
}
else {//список не пуст
for (int i = 1; i < Number; i++)
Current = Current->Next;
NewItem->Next = Current->Next;
Current->Next = NewItem;
NewItem->Prior = Current;
NewItem->Next->Prior = NewItem;
}
}

/*удаление элемента с заданным номером из циклического двунаправленного списка*/
Circle_Double_List* Delete_Item_Circle_Double_List(Circle_Double_List* Head, int Number) {
if (Head != NULL) {
Circle_Double_List *Current = Head;
if (Head->Next != Head) {
for (int i = 1; i < Number; i++)
Current = Current->Next;
Circle_Double_List *ptr = Current->Next;
Current->Prior->Next = Current->Next;
Current->Next->Prior = Current->Prior;
if (Head = Current) //удаляем первый
Head = Current->Next;
delete(Current);
}
else {
Head = NULL;
delete(Current);
}
}
return Head;
}

//поиск элемента в циклическом двунаправленном списке
bool Find_Item_Circle_Double_List(Circle_Double_List* Head, int DataItem) {
Circle_Double_List *ptr = Head;
//вспомогательный указатель
do {
if (DataItem == ptr->Data)
return true;
else ptr = ptr->Next;
} while (ptr != Head);
return false;
}

//проверка пустоты циклического двунаправленного списка
bool Empty_Circle_Double_List(Circle_Double_List* Head) {
return (Head != NULL ? false : true);
}

//удаление циклического двунаправленного списка
void Delete_Circle_Double_List(Circle_Double_List* Head) {
if (Head != NULL) {
Head = Delete_Item_Circle_Double_List(Head, 1);
Delete_Circle_Double_List(Head);
}
}


void Creation_Circle_List(One_List **Head, Double_List **Head2, List Head3, Circle_Double_List** Head4, int Count)
{
int p = 0;
Circle_Double_List *ptr = (*Head4);

for (int i = 0; i < Count; i++) {
for (int j = 0; j < Count; j++) {
for (int k = 0; k < Count; k++)
Insert_List_Circle_Double_List(&ptr, p++, GetElement(*Head, k, Count));
Insert_List_Circle_Double_List(&ptr, p++, GetDoubleElement(*Head2, j, Count));
}
Insert_List_Circle_Double_List(&ptr, p++, Head3.GetElem(i));
}
}

Обсуждение

давно
Посетитель
7438
7205
03.12.2016, 15:03
общий
Адресаты:
Давайте уточним постановку задачи:
Есть три вида списка - односвязный, двусвязный и двусвязный циклический с головой
Требуется создать каждый из этих списков из вводимых с консоли значений.
Затем требуется найти в каждом из этих списков уникальные элементы, т.е. такие, которые в единственном числе.
Что потом делаем с этими элементами? Просто выводим на экран? Или делаем из них новый список?
Я понял, что надо просто их найти и вывести на экран
Далее, в Ваших набросках смешалось все, "кони, люди"
Пишите или на С, или на С++. Одни куски процедурами, другие классами. При этом напрочь отсутствует main
Отсюда вопрос: так на С или на С++ должна быть программа?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
05.12.2016, 14:56
общий
это ответ
Здравствуйте, ksenya241!
Посмотрите, как я сделал
[code h=200]
#include <stdlib.h>
#include <iostream.h>

struct Node1 //Узел однонаправленного списка
{
int x;
Node1 *Next; //Указатель на адрес следующего элемента списка
};

struct Node2 //Узел двунаправленного и двунаправленного циклического списка
{
int x;
Node2 *Next,*Prev; //Указатели на адреса следующего и предыдущего элементов списка
};

//Однонаправленный список
class List1
{
Node1 *Head; //Указатель на началь списка
public:
List1():Head(NULL){}; //Инициализируем адрес как пустой
~List1(); //Деструктор
void Show(); //Функция отображения списка на экране
void Add(int x); //Функция добавления элементов в список
void Unique(); //Функция поиска и вывода уникальных элементов
};

List1::~List1() //Деструктор
{
Node1 *temp;
while (Head) //Пока по адресу на начало списка что-то есть
{
temp=Head->Next;//Резервная копия адреса следующего узла списка
delete Head; //Очистка памяти от узла, адресуемого Head
Head=temp; //Смена адреса на следующий элемент
}
}

void List1::Add(int x) //добавление элемента в конец однонаправленного списка
{
Node1 *temp;
Node1 *newnode=new Node1; //Выделение памяти под новый узел
newnode->Next=NULL; //Указываем, что изначально по следующему адресу пусто
newnode->x=x; //Записываем значение в структуру

if (Head!=NULL) //Если список не пуст
{ //найдем последний узел списка
for(temp=Head;temp->Next;temp=temp->Next); //пока не найдем такой, у которого адрес Next == NULL
temp->Next=newnode; //Указываем, что новый становится за найденным
}
else //Если список пустой
Head=newnode; //новый становится первым
}

void List1::Show() //вывод всех узлов списка
{
Node1 *temp;

temp=Head; //начинаем с адреса первого элемента
while (temp!=NULL) //Пока не встретим пустое значение
{
cout<<temp->x<<" "; //Выводим поле х на экран
temp=temp->Next; //Смена адреса на адрес следующего узла
}
cout<<"\n"; //перевод строки в конце вывода
}

void List1::Unique() //поиск и вывод уникальных элементов
{
Node1 *temp1, *temp2;

for(temp1=Head; temp1; temp1=temp1->Next) //по всем узлам списка
{
for(temp2=Head; temp2; temp2=temp2->Next) //и опять по всем узлам списка
{
if ((temp1 != temp2) && (temp1->x == temp2->x)) //если у разных узлов одинаковые поля х
break; //то прерываем поиск
}
if (temp2 == NULL) //если temp2=NULL, то просмотрели весь список и равных temp1->x не нашли
cout << temp1->x << " "; //значит, значение temp1->x - уникальное, выведем его!
}
cout << endl;
}

//двунаправленный поиск
class List2
{
Node2 *Head,*Tail; //Указатели на адреса начала списка и его конца
public:
List2():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
~List2(); //Деструктор
void Show(); //Функция отображения списка на экране
void Add(int x);//Функция добавления узлов в конец списка
void Unique(); //поиск и вывод уникальных элементов
};

List2::~List2() //Деструктор
{
while (Head) //Пока по адресу на начало списка что-то есть
{
Tail=Head->Next;
delete Head;
Head=Tail;
}
}

void List2::Add(int x) //добавление элемента в конец двунаправленного списка
{
Node2 *temp=new Node2; //Выделение памяти под новый узел списка
temp->Next=NULL; //Указываем, что изначально по следующему адресу пусто
temp->x=x; //Записываем значение в структуру

if (Head!=NULL) //Если список не пуст
{
temp->Prev=Tail; //предыдущий нового будет равен хвосту
Tail->Next=temp; //следующий хвоста будет равен новому
Tail=temp; //новый будет новым хвостом
}
else //Если список пустой
{
temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
}
}

void List2::Show() //выводим на экран
{
Node2 *temp;

temp=Head; //начинаем с адреса первого элемента
while (temp!=NULL) //Пока не встретим пустое значение
{
cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
temp=temp->Next; //Смена адреса на адрес следующего элемента
}
cout<<"\n";
}

void List2::Unique() //поиск уникальных
{ //аналогично
Node2 *temp1, *temp2;

for(temp1=Head; temp1; temp1=temp1->Next)
{
for(temp2=Head; temp2; temp2=temp2->Next)
{
if ((temp1 != temp2) && (temp1->x == temp2->x))
break;
}
if (temp2 == NULL)
cout << temp1->x << " ";
}
cout << endl;
}

//двунаправленный циклический список с головой
class List3
{
Node2 *Head; //Указатель на адреса начала списка
public:
List3():Head(NULL){}; //Инициализируем адреса как пустые
~List3(); //Деструктор
void Show(); //Функция отображения списка на экране
void Add(int x); //Функция добавления элементов в список
void Unique(); //поиск и вывод уникальных
};

List3::~List3() //Деструктор
{
Node2 *temp1, *temp2;
if (Head != NULL) //есть ли вообще?
{
temp1=Head; //адрес, кого будем удалять
do
{
temp2=temp1->Next; //адрес следующего
delete temp1; //удаляем
temp1=temp2; //на адрес следующего
}while (temp1!=Head); //пока не получим адрес бывшего первого
}
}

void List3::Add(int x) //добавление в конец списка
{
Node2 *temp=new Node2; //Выделение памяти под новый узел списка
temp->x=x; //Записываем значение в структуру

if (Head!=NULL) //Если список не пуст
{
temp->Prev=Head->Prev; //адрес предыдущего нового будет равен адресу последнего
temp->Next=Head; //адрес следующего за новым будет равен голове
Head->Prev->Next=temp; //следующий за последнеим будет равет адресу нового
Head->Prev=temp; //предыдущий головы будет равен адресу нового
}
else //Если список пустой
{
temp->Prev=temp; //предыдущий и следующий нового будут ссылаться на себя
temp->Next=temp;
Head=temp; //новый будет головой
}
}

void List3::Show() //вывод на экран
{
Node2 *temp;

if (Head) //есть ли вообще?
{
temp=Head; //начинаем с адреса первого элемента
do
{
cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
temp=temp->Next; //Смена адреса на адрес следующего элемента
}while (temp!=Head);
cout<<"\n";
}
}

void List3::Unique() //поиск уникальных
{
Node2 *temp1, *temp2;

if (Head) //есть ли вообще?
{
temp1=Head; //начинаем с первого
do
{
temp2=Head; //для каждого просмотрим еще раз весь список
do
{
if (temp1 != temp2) //смотрим только на разные
{
if (temp1->x == temp2->x) //для одинаковых значений
break; //прерываем поиск
}
temp2=temp2->Next; //на следующий
}while (temp2!=Head); //пока не встретим первого
if (temp2==Head) //просмотрели до конца?
cout << temp1->x << " "; //да - уникальный - выводим
temp1=temp1->Next; //ищем следующий
}while (temp1!=Head); //по всем
cout << endl;
}
}

int main ()
{
cout << "List1" << endl;
List1 lst1; //Однонаправленный список
lst1.Add(100); //Добавляем в список элементы
lst1.Add(200);
lst1.Add(900);
lst1.Add(888);
lst1.Add(200);

lst1.Show(); //Отображаем список на экране
cout << "Unique: ";
lst1.Unique(); //выводим уникальные

cout << "List2" << endl;
List2 lst2; //двунаправленный список
lst2.Add(100);
lst2.Add(200);
lst2.Add(900);
lst2.Add(888);
lst2.Add(200);

lst2.Show();
cout << "Unique: ";
lst2.Unique();

cout << "List3" << endl;
List3 lst3; //двунаправленный циклический список
lst3.Add(100);
lst3.Add(200);
lst3.Add(900);
lst3.Add(888);
lst3.Add(200);

lst3.Show();
cout << "Unique: ";
lst3.Unique();

return 0;
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа