Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 14
1

Двусвязный циклический список

13.06.2016, 12:58. Показов 931. Ответов 5
Метки нет (Все метки)

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//Удаляет отрицательные элементы, возвращает ссылку на первый отрицательный элемент
        public DoubleNode DeleteNegative()
        {
            DoubleNode n;
            DoubleNode h;
            n = head.Next;
            while ((n!=head)&&(n.Next.Number>0))
            {
                n = n.Next;
            }
            h = n.Next;
            head.Prev=n;
            n.Next = head;                      
            return h;
        }
        
        public void GetSecondList(DoubleNode n, DoubleNode q)
        {           
            head.Next = n;
            n.Prev=head;
            q.Next = head;
            head.Prev = q;                    
        }
//класс формы
        private void разделитьToolStripMenuItem_Click(object sender, EventArgs e)
        {         
            DoubleNode n = Data.L.DeleteNegative();
            DoubleNode q = Data.L.FindEnd;
            Data.L2.GetSecondList(n,q);
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2016, 12:58
Ответы с готовыми решениями:

Двусвязный циклический список
Скажите как сделать список в моей программе циклическим? Как прописать файловые указатели на...

Циклический двусвязный список
Доброго времени суток! Собственно вот в чем вопрос: имеется двусвязный циклический список и нужно...

Двусвязный список
Вот задание: 1. Считать из текстового файла исходные данные и на их основе создать необходимые...

Двусвязный список
Приветствую всех. Искал информацию про двусвязный список нашел вот это ТЫК, кое что доже понял:)...

__________________

Записывайтесь на профессиональные курсы С#-разработчиков‌
5
42 / 39 / 44
Регистрация: 08.05.2016
Сообщений: 119
13.06.2016, 14:28 2
Кликните здесь для просмотра всего текста
C#
1
List<double> myList = new List<double>();
C#
1
2
3
4
5
6
7
void listAddValue(double value)
{
    if (value >= 0)
        myList.Insert(0, value);
    else
        myList.Add(value);
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void listSplit(out List<double> pos, out List<double> neg)
{
    int firstNeg = myList.FindIndex(x => x < 0);
    if (firstNeg == -1)
    {
        pos = new List<double>(myList);
        neg = new List<double>();
    }
    else
    {
        pos = myList.GetRange(0, firstNeg).ToList();
        neg = myList.GetRange(firstNeg, myList.Count - firstNeg).ToList();
    }
}
1
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.06.2016, 15:19 3
nvdfx, предположу, что у вас всё же есть клссс MyLinkedList, где ноды связаны (иначе это очень плохой код), тогда это будет выглядеть примерно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public DoubleNode DeleteNegative(MyLinkedList source)
        { 
            MyLinkedList negList = new MyLinkedList();
            while (source.Head < 0)
            {
               negList.Add(source.Head);
               source.Delete(source.Head);
            }
            for(var node = head.Next; node != head; node = node.Next)
            {
               if (node < 0)
               {
                  negList.Add(node);
                  source.Delete(node);
               }
            }
            return negList.Head;
        }
1
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 14
13.06.2016, 17:09  [ТС] 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class DoubleNode
    {
        private DoubleNode next;
        private DoubleNode prev;
        private int number;
        public int Number
 
        {
            get { return number; }
            set { number = value; }
        }
 
        public DoubleNode Next
        {
            get { return next; }
            set { next = value; }
        }
 
        public DoubleNode Prev
        {
            get { return prev; }
            set { prev = value; }
        }
 
        public DoubleNode() { }
 
 
 
        public DoubleNode(int number)
        {
            Number = number;
 
        }
        public DoubleNode(int number, DoubleNode next, DoubleNode prev)
        {
            Number = number;
            Next = next;
            Prev = prev;
        }
    }
0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.06.2016, 20:23 5
nvdfx, нода не должна быть сама по себе списком Ибо любой желающий в таком случае сможет как угодно его менять.

Вот вам пример, как это должно выглядеть. Добавьте удаление из списка, а с добавлением/удалением и foreach-ем вы можете легко реализовать оставшиеся методы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    class Program
    {
        static void Main(string[] args)
        {
            var deq = new DEQ<int> {1, 2, 3, 4, 5};
            foreach (int i in deq)
            {
                Console.WriteLine(i);
            }
        }
    }
 
    class DEQ<T> : IEnumerable<T>
    {
        private Node Head;
        private Node Tail;
        private class Node
        {
            public T Value { get; set; }
            public Node Prev { get; set; }
            public Node Next { get; set; }
 
            public Node(T value)
            {
                Value = value;
            }
 
            public Node(T value, Node prev, Node next) : this(value)
            {
                Prev = prev;
                Next = next;
            }
        }
 
        public void Add(T value)
        {
            if (Head == null)
            {
                Head = Tail = new Node(value);
                Head.Next = Head.Prev = Head;
            }
            else
            {
                Tail.Next = new Node(value, Tail, Tail.Next);
                Tail = Tail.Next;
            }
        }
        
        public IEnumerator<T> GetEnumerator()
        {
            if (Head == null)
            {
                yield break;
            }
            yield return Head.Value;
            for (var node = Head.Next; node != Head; node = node.Next)
            {
                yield return node.Value;
            }
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
0
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 14
13.06.2016, 21:36  [ТС] 6
Все методы есть
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
class CycleDoubleLinkedList
    {
        private DoubleNode head;     
 
        public DoubleNode Head
        {
            get { return head; }
            set { head = value; }
        }
 
        public CycleDoubleLinkedList()
        {
            head = new DoubleNode();
            head.Next = head;
            head.Prev = head;
        }
//вставка в начало
        public void InsertAfter(DoubleNode p, int number)
        {
            if (p != null)
            {
                DoubleNode q = new DoubleNode(number);
                q.Next = p.Next;
                p.Next = q;
                q.Prev = p;
                q.Next.Prev = q;
            }
        }
//вставка в конец
        public void InsertBefore(int number)
        {
            InsertAfter(head, number);
        }
 
        public int Length()
        {
            int i = 0;
            DoubleNode p = head.Next;
            while (p != head) { i++; p = p.Next; }       
            return i;
 
        }
 
         public DoubleNode Return1()
        {
            DoubleNode p = head.Next;
            return p;
        }
 
        public DoubleNode ReturnHead()
        {
            DoubleNode p = head;
            return p;
        }
 
        public DoubleNode find1(int pos)
        {
            DoubleNode p = head.Next;
            int i = 0;
            while ((i < pos) && (p != null))
            {
                p = p.Next;
                i++;
            }
            if (i != pos) throw new Exception();
            return p;
        }
 
        public string get(int i)
        {
            DoubleNode temp = find1(i);
            string s;
            s = temp.Number + "  ";
            return s;
        }
 
        public DoubleNode FindEnd
        {
            get
            {
                DoubleNode p;
                p = head;
                while ((p != null) && (p.Next != head))
                {
                    p = p.Next;
                }
                return p;
            }
        }
 
        public void Delete(DoubleNode p)
        {
            if (p != null)
            {
                p.Prev.Next = p.Next;
                p.Next.Prev = p.Prev;
                p = null;
            }
        }
 
        public void remove1(int pos)
        {
            Delete(find1(pos));
        }
 
        public string printnumber(int i)
        {
            DoubleNode temp = find1(i);
            string s;
 
            s = temp.Number + "  ";
            return s;
        }      
        //Удаляет отрицательные элементы, возвращает ссылку на первый отрицательный элемент
        public DoubleNode DeleteNegative()
        {
            DoubleNode n;
            DoubleNode h;
            n = head.Next;
            while ((n!=head)&&(n.Next.Number>0))
            {
                n = n.Next;
            }
            h = n.Next.Next;
            head.Prev=n;
            n.Next = head;                      
            return h;
        }
        
        public void GetSecondList(DoubleNode n, DoubleNode q)
        {           
            head.Next = n;
            n.Prev=head;
            q.Next = head;
            head.Prev = q;                    
        }
 
    }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2016, 21:36

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Реализовать двусвязный список
Ребята, помогите, пожалуйста, реализовать простейший двусвязный список. Никак не могу понять, как...

Двусвязный список на языке C#
В программе должны быть реализованы два типа: открытый (public) тип списка – List; внутренний...

Двусвязный линейный список?
Всем доброго дня! Помогите пожалуйста. Есть задача: Дан двусвязный линейный список с целыми...

Стек, Очередь, Двусвязный список
сначала нужно сформировать и заполнить элементами три структуры – «стек», «очередь», «двусвязный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.