Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
1

Односвязный список на C#. Вставить первый элемент в конец

07.03.2014, 01:13. Показов 6908. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день всем! Заранее извиняюсь если вопрос нубский.
Стоит такая задача: есть односвязный список из произвольного количества элементов. Нужно написать метод, который в качестве параметра принимает этот список, ставит первый элемент вконец и возвращает ссылку на новый первый элемент.
Тоесть: дано A - > B - > C - > D - > нужно вернуть B - > C - > D - > A - > для произвольного кол-ва элементов списка.

Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ListNode
{
    public ListNode Next { get; set; }
    public string Name { get; set; }
    public ListNode(string n)
    {
        Name = n;
    }
 
    public override string ToString()
    {
        return String.Format("[Node: {0}]  ——>  {1}", this.Name, this.Next);
    }
}

И вот сама функция Sort():
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
class Program
{
    static void Main(string[] args)
    {
        ListNode list = new ListNode("A");
        list.Next = new ListNode("B");
        list.Next.Next = new ListNode("C");
        list.Next.Next.Next = new ListNode("D");
 
        Console.WriteLine(list);
        Console.WriteLine(Sort(list));
 
            
    }
        
    static ListNode Sort(ListNode node)
    {
        node = node.Next;
 
        // "B" с хвостом вначало втулил, но
        // дальше я хз как втулить в конец "А"
 
        return node;
    }
}
Ну и еще хотелось бы знать решения такой задачи в общем виде:
Задача 2: Инвертирвать;
Задача 3: Вставить новый элемент всередину;

Заранее всем спасибо за ответы!

Добавлено через 1 час 23 минуты
Помню задачу немного похожую решал еще в школе на алгебре:
Вичислить значение выражения:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{2+\sqrt{2+\sqrt{2+\sqrt{2+...}}}}

Так оно решалось составлением уравнения https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{2+x}  =  x

Может тут нечто похожее можно придумать
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2014, 01:13
Ответы с готовыми решениями:

Односвязный список: удалить k-й элемент и вставить m элементов в конец
Необходимо создать односвязный список с полями ФИО, дата рождения, ЗП удалить к-й элемент и...

Односвязный список. Подсчитать сумму N первых элементов. Удалить эти элементы и вставить в конец списка
Помогите, плиз доработать функцию summ - она должна подсчитать сумму N первых элементов. Удалить...

Односвязный список: удалить первый элемент
День добрый уважаемые знатоки, начал разбираться с реализацией односвязных списков, вроде бы все...

Вставить элемент в односвязный список
Есть у меня такой код: Node *pv = new Node; //Node *b; char symbol; pv = head;...

18
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
17.03.2014, 19:41  [ТС] 2
Господа гуру. Помогите пожалуйста
Это задание мне дали на собеседовании и сказали, что решается оно в 3 строки, после того как я в нем начал так тупить, после этого со мной не захотел никто даже общаться
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.03.2014, 19:54 3
Jan86, циклы нужно использовать. Например
C#
1
2
3
4
5
6
7
8
9
ListNode list = new ListNode("A");
list.Next = new ListNode("B");
list.Next.Next = new ListNode("C");
list.Next.Next.Next = new ListNode("D");
 
for(var node = list; node != null; node = node.Next)
{
   Console.WriteLine(node.Name);
}
1
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
17.03.2014, 20:16  [ТС] 4
В задаче было сказано не про вывод на консоль, а написать функцию, которая для "матрешки" произвольной глубины вложенности, вернет такую же матрешку по такому примеру:
["A", ["B", ["C", ["D", ["E", []]]]]] —> ["E", ["B", ["C", ["D", ["A", []]]]]]

Надеюсь правильно объяснил. Заранее спасибо!
А за совет по циклам спасибо, я немного уловил идею, буду думать как выкрутится
0
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
17.03.2014, 20:45 5
Лучший ответ Сообщение было отмечено Jan86 как решение

Решение

Перестановку первого эл-та в конец можно сделать так:
C#
1
2
3
4
5
6
7
8
9
10
static ListNode FirstToEnd(ListNode list)
{
    if (list.Next == null)
        return list;
    ListNode result = list.Next, node;
    list.Next = null;
    for (node = result; node.Next != null; node = node.Next) ;
    node.Next = list;
    return result;
}
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.03.2014, 20:54 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
using System;
using System.Collections;
using System.Collections.Generic;
 
namespace ConsoleApplication32
{
    class Program
    {
        static void Main()
        {
            var list = new SomeStructure<string>("A");
            var current = list;
            for (char c = 'B'; c <= 'E'; c++)
            {
                current.Next = new SomeStructure<string>(c.ToString());
                current = current.Next;
            }
            Console.WriteLine(list.ToString());
 
            var reverse = list.ReverseStruct();
            Console.WriteLine(reverse.ToString());
        }
    }
 
    internal class SomeStructure<T> : IEnumerable<T>
    {
        public T Item { get; set; }
        public SomeStructure<T> Next;
 
        public SomeStructure(T item, SomeStructure<T> next)
        {
            Next = next;
            Item = item;
        }
 
        public SomeStructure(T item) : this(item, null)
        {
        }
 
        public IEnumerator<T> GetEnumerator()
        {
            for (var current = this; current != null; current = current.Next)
                yield return current.Item;
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
 
        public SomeStructure<T> ReverseStruct()
        {
            var stack = new Stack<T>();
            foreach (T t in this)
                stack.Push(t);
            var result = new SomeStructure<T>(stack.Pop());
            for (var current = result; stack.Count > 0; current = current.Next)
                current.Next = new SomeStructure<T>(stack.Pop());
            return result;
        }
 
        public override string ToString()
        {
            return string.Format(@"[""{0}"",{1}]", Item, Next != null ? Next.ToString() : "[]");
        }
    }
}
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
17.03.2014, 21:20  [ТС] 7
Kruds, спасибо,это работает!
Но не сочтите за труд, можете пожалуйста разъяснить ньюбу эту строку:
C#
1
ListNode result = list.Next, node;
= list.Next, node; - такой формы записи я ни разу не встречал - это что-то типа замыкания?
Как оно, ну и собственно функция работают?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.03.2014, 21:23 8
Kruds лучше пустые циклы с {} указывать, а то точка с запятой любят прятаться, потом всякие баги интересные происходят...
1
rattrapper
17.03.2014, 21:27
  #9

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
точка с запятой любят прятаться
это как? =-O

0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
17.03.2014, 21:28  [ТС] 10
И да, что делает пустой цикл, заранее сенкс
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.03.2014, 21:30 11
rattrapper, её плохо заметно.

Jan86, мы сохраняем первый элемент, потом гоним пустой цикл, чтобы в конце этого цикла элемент node указывал на последний элемент, после этого заставляем его указывать на сохраненный в начале элемент. Готово.
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
17.03.2014, 23:32  [ТС] 12
Господа, чтобы вас не задалбывать, скажите пожалуйста, где можно доходчиво и на пальцах и с примерами почитать про передачу внутренней переменной функции внешнему коду, замыкание, или как это называется? (Простите, если туплю в терминологии.)
C#
1
2
3
    ListNode result = list.Next, node;
    list.Next = null;
    for (node = result; node.Next != null; node = node.Next) ;
Особенно не понятна мне вот такая форма записи присваивания. = list.Next, node; //(через запятую)
Я новичок, но у Троелсена, например, таких фокусов не встречал.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.03.2014, 00:43 13
Jan86,
C#
1
2
ListNode result = list.Next;
ListNode node;
так лучше?
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
18.03.2014, 01:08  [ТС] 14
Да, так понятнее..

Где про
передачу внутренней переменной функции внешнему коду
почитать?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.03.2014, 10:13 15
Jan86, так она ничем не отличается от глобальной. Это вас не С, где нужны танцы с. Malloc, тут память сразу в куче выделяется. А значит, можно спокойно передавать что угодно куда угодно. При необходимости среда сама складирует что ей нужно чтобы обеспечить валидость куска памяти

Добавлено через 9 часов 2 минуты
склонирует*, а не складирует

Не по теме:

Некоторые замены тупого айфона ржачные конечно... Возвращают во времена Т9 :)

1
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
18.03.2014, 11:43  [ТС] 16
Я имел в виду, что в цикле for переменная "node" выступает его итератором, и, на сколько я понимаю, должна быть видна только данному циклу (и внутри его). А здесь получается, что в пустом цикле мы ее изменяем и передаем "наружу"? Поправьте, пожалуйста, если не прав.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.03.2014, 11:58 17
Миниатюры
Односвязный список на C#. Вставить первый элемент в конец  
1
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 10
18.03.2014, 16:21  [ТС] 18
Большое спасибо, буду сам вникать. Мне еще не до конца все понятно, но не буду уже надоедать уважаемым форумчанам.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.03.2014, 16:26 19
Jan86, поправьте пост, у нас так не ругаются, даже завуалированно.

Добавлено через 3 минуты
спасибо.
0
18.03.2014, 16:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2014, 16:26
Помогаю со студенческими работами здесь

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

Сформировать список L и перенести в конец списка его первый элемент
Сформировать список L: - перенести в конец списка его первый элемент; - в списке из каждой группы...

Односвязный список с добавлением нового элемента в конец.
Здраствуйте. Мне нужна ваша помощь. Есть программа которая строит список из k элементов выводит его...

Односвязный список: добавление элемента в конец списка
Здравствуйте, учу списки, стояла задача - добавить в готовый список элементы в...

Односвязный список: добавление элементов в начало и в конец
добавление элементов в начало функции и в конце с помошью функции прошу помоч. program Project1;...

Вставить первый столбец после столбца, в котором находится первый встреченный элемент А
Подскажите как Вставить первый столбец после столбца, в котором находится первый встреченный...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru