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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2016, 18:43   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию Отсортировать список

Проблема такая, могу сортировать уже готовый односвязный список, а как сделать чтобы сортировать при добавлении элемента в список, вставлять его всегда на нужное место при добавлении, дабы в итоге в конце уже был он отсортирован после заполнения? Привел свои функции.

Код:
first - начало
current  - конец
size - количество элементов
next - следующий
value - значение
Сортирую

Код:
        public void Sort()
        {
            Node tmp = new Node();
            Node tmp0 = new Node();
            bool flag = false;
            do
            {
                tmp0 = first;
                flag = false;
                while (tmp0.next != null)
                {
                    if (tmp0.value > tmp0.next.value)
                    {
                        if (tmp0 == first)
                        {
                            tmp = tmp0;
                            tmp0 = tmp.next;
                            tmp.next = tmp0.next;
                            tmp0.next = tmp;
                            first = tmp0;
                            flag = true;
                        }
                        else
                        {
                            tmp = tmp0;
                            tmp0 = tmp.next;
                            tmp.next = tmp0.next;
                            tmp0.next = tmp;
                            current.next = tmp0;
                            flag = true;
                        }
                    }
                    current = tmp0;
                    tmp0 = tmp0.next;
                }
            } while (flag);
        }
Добавляю

Код:
        public void add(int Value)
        {
            if (size == 0)
            {
                current = new Node();
                current.value = Value;
                current.next = null;
                first = current;
                size++;
            }
            else
            {
                Node tmp = new Node();
                tmp.value = Value;
                tmp.next = null;
                current.next = tmp;
                current = current.next;
                size++;
            }
        }

Последний раз редактировалось a.n.o.n.i.m; 11.10.2016 в 18:47.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 11.10.2016, 18:51   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

при добавлении вам надо найти поддходящее место для вставки.
принцип тот же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.10.2016, 10:53   #3
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Может понадобиться кому, сделал.

Код:
        public void add(int Value)
        {
            int k = 1;
            if (size == 0)
            {
                current = new Node();
                current.value = Value;
                current.next = null;
                first = current;
                size++;
            }
            else
            {
                Node tmp = new Node();
                Node temp = new Node();
                Node newElement = new Node();
                tmp = first;
                while (tmp.value < Value)//Позиция для вставки
                {
                    k++;
                    if (tmp.next != null)
                    {
                        tmp = tmp.next;
                    }
                    else
                    {
                        break;
                    }
                }
                int currentNumber = 1;
                if (k == 1)
                {
                    temp.value = Value;
                    temp.next = first;
                    first = temp;
                    size++;
                    return;
                }
                temp = first;
                while (currentNumber < k - 1)
                {
                    currentNumber++;
                    temp = temp.next;
                }
                newElement.value = Value;
                newElement.next = temp.next;
                temp.next = newElement;
                size++;
            }
        }
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.10.2016, 11:12   #4
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Вопрос теперь такой, я хочу объединить два списка. Все бы хорошо, но поэлементно копировать не хочу.

Я хочу сделать так, скопировать первый список в третий и потом уже поэлементно со второго списка дописывать элементы в третий список то есть сделать вместо
Код:
                for (i = one.first; i != null; i = i.next)
                {
                    three.add(i.value);
                }
вот так

Код:
three = one;
а потом уже

Код:
                    for (i = two.first; i != null; i = i.next)
                    {
                        three.add(i.value);
                    }
, Но почему в one потом при каждом вызове метода элементы дублируются, в чем косяк?

Код:
        public void Merger(SortedLinkedList one, SortedLinkedList two, SortedLinkedList three)
        {
            SortedLinkedList i = new SortedLinkedList();
            if (three.first != null)
            {
                DeleteList();
            }
            if (one.first != null)
            {

                //three = one;

                for (i = one.first; i != null; i = i.next)
                {
                    three.add(i.value);
                }
            }
            if (two.first != null)
            {
                    for (i = two.first; i != null; i = i.next)
                    {
                        three.add(i.value);
                    }
                
            }
            three.show();
        }
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.10.2016, 12:22   #5
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Тоесть даже вопрос будет таким, как сделать копию экземляра класса, тоесть

Есть Class_test а, и есть Class_test b, как сделать так чтобы я в b положил копию a и дальше в b работал с ним, не внося изменений в a.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.10.2016, 12:34   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Я хочу сделать так, скопировать первый список в третий
с помощью оператора =
Цитата:
three = one;
Переоределение оператора (=) Вам в помощь. В котором и будет тот самый код поэлементного копирования.
А еще можно будет переопределить и + (как добавление списка).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.10.2016, 12:55   #7
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Поэлементно я и циклом могу из первого поста скопировать.

Код:
        public static SortedLinkedList Clone(SortedLinkedList obj)
        {
            SortedLinkedList myClass = new SortedLinkedList();
            myClass.value = obj.value;
            myClass.next = obj.next;
            myClass.size = obj.size;
            myClass.first = obj.first;
            myClass.current = obj.current;
            return myClass;
        }
а потом в нужном месте сделать

Код:
three = SortedLinkedList.Clone(one);
тоже не помогает. Вообще даже не знаю как сделать копию класса, он работает по ссылкам и все, то есть меняет в данном случае one что мне не надо.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.10.2016, 13:12   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
с помощью оператора =

Переоределение оператора (=) Вам в помощь. В котором и будет тот самый код поэлементного копирования.
А еще можно будет переопределить и + (как добавление списка).
вы язык не перепутали?
в C# нельзя переопределить =.
Цитата:
Вообще даже не знаю как сделать копию класса, он работает по ссылкам и все, то есть меняет в данном случае one что мне не надо.
руками создать, объекты не копируются.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.10.2016, 13:37   #9
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Всеравно придется копировать поэлментно, так ведь? никак не избежать этого? единственное что придумал, сделать 2 одинаковые функции почти, только одна просто копирует , а вторая копирует и сортирует. Дак вот,первые пару списков я создаю и сортирую сразу. а В третий я первый(если создан был) копирую поэлементно, без сортировки,а второй поэлементно с сортировкой, хз много ли я от это выйграл в производительности, так как мне кажется что не очень.

p.s ничего не перепутал)) столкнулся впервые просто , и спросил, чтоб разжували.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.10.2016, 13:57   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну еще можно впомнить про разницу между struct и class.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
лабораторная работа на тему Список спортсменов. задание отсортировать список Гуменчук_Дарья Помощь студентам 3 15.03.2016 12:05
создать список л3 из элементов входящих и в список л1 и в список л2 goosha_gio C++ Builder 1 27.06.2013 22:22
Обработка матрицы. Первую и вторую строки отсортировать выбором по убыванию, пятый и шестой столбец отсортировать (С++) Sasha316 Помощь студентам 0 23.11.2012 00:48
Помогите отсортировать список ret83 Microsoft Office Excel 8 29.12.2007 13:41