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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2020, 12:41   #1
kitkat1000
 
Регистрация: 29.01.2020
Сообщений: 8
По умолчанию Пузырьковая сортировка двух соседних элементов

Дорогие форумчане обращаюсь к вам за помощью. Дело в том, что код получился, но необходимо сделать пузырьковую сортировку двух соседних элементов. Уже около месяца мучаюсь, ничего не выходит.
Код:
#include<iostream>
#include<cstdlib>
#include<ctime>

using namespace std;

struct Node
{   
    Node() : ptr(NULL) {}
    int   field;
    Node * ptr;
};
    
bool isEmpty(Node *p)
{   
     return p->ptr == NULL;
}
 
Node* Next(Node *p, Node* node)
{   
    if (isEmpty(p)) 
        return NULL;
        
    return node->ptr;
}
 
Node* Prev(Node *p, Node* node)
{   if (isEmpty(p))
        return NULL;
    if (node == p->ptr)
        return NULL;
        
    Node *cp = p->ptr;
    while (cp->ptr != node)
        cp = cp->ptr;
    return cp;
}
 
Node* Add(Node *p, int num, Node* node = NULL)
{   
    Node *elem = new Node();
    elem->field = num;
    if (node == NULL)
    {
        {   
            elem->ptr = p->ptr;
            p->ptr = elem;
        }
        return elem;
    }
    elem->ptr = node->ptr;
    node->ptr = elem;
    return elem;
}
 
Node* Delete(Node *p, Node* node)
{   
    if (node == NULL)
    {   
        return NULL;
    }
    if (node == p->ptr)
    {   
        p->ptr = node->ptr;
        delete node;
        return p->ptr;
    }
    Node* prev = Prev(p, node);
    prev->ptr = node->ptr;
    delete node;
    return prev;
}
 
Node* getLast(Node *p)
{   Node* cp = p->ptr;
    while (Next(p, cp) != NULL)
        cp = Next(p, cp);
    return cp;
}
 
void Clear(Node *p)
{   
    Node *cp = p->ptr;
    if (cp == NULL)
        return;
    do
    {   
        Node *d = cp;
        cp = Next(p, cp);
        delete d;
    }
    while (cp != NULL);
    p->ptr = NULL;
}
 
void Print(Node *p)
{   
    if (isEmpty(p))
    {   
        cout << "The list is empty" << endl;
        return;
    }
    Node *cp = p->ptr;
    while (cp != NULL)
    {   
        cout << cp->field << " ";
        cp = Next(p, cp);
    }
    cout << endl;
}
 
int delete_value(Node *p, const int measure)
{   
    for(Node* cp = p->ptr; cp; )
    {   
        if (cp->field % 10 == measure)
        {
            Node* cp2 = cp;
            cp = Next(p, cp);
            Delete(p, cp2);
        }
        else
            cp = Next(p, cp);
    }
    return 0;
}
 
int main()
{
    cout << "Create a list\n";
    
    Node list;
    
    Print(&list);
 
    int N;
    cout <<"Enter the number of items: ";
    cin>>N;
    int randomDigits[N];
 	srand(time(NULL));
 	for (int i = 0; i < N; i++)
 		{
 			int z = 100-rand()%200;
        	cout << "\nNumber "<< i+1 <<": " << z;
 			
        	Add(&list, z);
    	}
    cout << '\n';
    
    Print(&list);
 
    delete_value(&list, 5);
    delete_value(&list, -5);
 
    cout << "\nResult: \n";
    Print(&list);
    Clear(&list);
}
kitkat1000 вне форума Ответить с цитированием
Старый 19.06.2020, 13:04   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

итак есть такая "цепочка"
... -> x -> a -> b -> y -> ...
x.next =a
a.next =b
b.next =y
y.next =...
"внезапно" оказывается надо поменять местами a и b (два соседних), т.е. получить
... -> x -> b -> a -> y -> ...
надо сделать
x.next =b (было x.next =a)
b.next =a (было b.next =y)
a.next =y (было a.next =b)
y.next =... (было и осталось)

P.S. плюс отработка случаев начала/конца списка
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.06.2020 в 13:06.
evg_m на форуме Ответить с цитированием
Старый 19.06.2020, 13:20   #3
kitkat1000
 
Регистрация: 29.01.2020
Сообщений: 8
По умолчанию

evg_m, по моему так не получится для моего кода
kitkat1000 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать массив Y из тех элементов массива Х, которые больше суммы двух соседних предыдущих Vladkp Помощь студентам 9 17.03.2017 22:28
К значению каждого элемента из массива in прибавить значения двух соседних элементов, результат записать в out. numberonee Помощь студентам 1 21.06.2016 15:44
Пузырьковая сортировка. Виктор27 Общие вопросы C/C++ 3 18.04.2014 21:11
Разработка программы поиска двух соседних элементов массива, сумма которых максимальна Esterlen Помощь студентам 13 27.05.2012 18:58
Пузырьковая сортировка ts-alan Общие вопросы C/C++ 9 20.08.2010 21:15