Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С# Сортировка линейного списка

39K
27 октября 2010 года
Saiko
23 / / 09.01.2009
язык С# ,делается в Visual Studio 2008
Прошу сильно не пинать и не бить :)
Задача такая: дан линейный односвязный список,значения которого заполняются из файла. (Допустим,в файле 20 элементов.) Мне нужно отсортировать значения линейного списка. Сортирую методом пузырька. Сам метод вроде прост как валенок и понятен.
Не понятно - значения элементов списка получаются типа string и поэтому для сортировки необходимо использовать метод int sor = string.Compare(L.current.value, L.current.next.value);Я не понимаю как использовать результат этого метода в самой сортировке (

Вот что есть:
Код:
{
    public partial class Form1 : Form
    {
        Listik L = new Listik(); // сoздаем первый список
        Listik LS = new Listik(); //создаем второй список для сортировки
       
        public Form1()
        {
            InitializeComponent();
        }
        // button Open File //открываем файл ,считываем
        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog(this);
            L.readformfile(openFileDialog1.FileName);
            L.current = L.first;
            string str = "";
            while (L.current != null)
            {
                str = str + " " + L.current.value;
                L.current = L.current.next;
            }
            textBox1.Text = str;
        }
       
        // button Sorting //собственно сортировка
           {}            
                         
       
   
    }// the end "public partial class Form1 : Form "

    class Element
    {
        public string value;
        public Element next;
        public Element prev;
        public Element(string kValue)
        {
            value = kValue;
        }
    }


    class Listik
    {
        public Element first, last, current;
        int Count;
        public Listik()
        {
            first = null;
            last = null;
            Count = 0;
            current = null;
        }
        public void Add(Element el)
        {
            if (last != null)
            {
                last.next = el;
                el.prev = last;
            }
            last = el;
            if (first == null) first = current = el;
        }
// функция открытия файла и заполнения списка значениями из файла
        public void readformfile(string filename)
        {
            StreamReader sr = File.OpenText(filename);
           string s;
           try
            {
                while ((s = sr.ReadLine()) != null)
                {
                    Element ellis;
                    ellis = new Element(s);
                    this.Add(ellis);
                }

            }
            catch (IOException)
            {
            }
        }

    }
}

Код самой функции сортировки
Код:
private void button2_Click(object sender, EventArgs e)
        {
            string str2 = "";
            int i;
            int j;
     
            L.current = L.first;

            while (L.current != null)//пока список не пуст
            {
                bool sorted = true;
//сортировка
                for (i = 0; i < 20; i++ )
                {
                    for (j = 20 - 1; j > i; j-- )
                    {
// сравниваем один элемент со следующим
                        int sor = string.Compare(L.current.value, L.current.next.value);
                             // ????
                        {  LS.current.value = L.current.value;
                              L.current.value = L.current.next.value;
                              L.current.next.value = LS.current.value;
                              sorted = false;
                             }
                        i += 1;
                        L.current = L.current.next;
                    }
                    if (sorted)
                    { break; }
                    while (LS.current != null)
                    str2 = str2 + " " + LS.current.value;
                    LS.current = LS.current.next;

                }
                textBox2.Text = str2;// результат выводим на экран

            }
        }

пожалуйста, объясните чайнику ^^
2.1K
27 октября 2010 года
Norgat
452 / / 12.08.2009
http://msdn.microsoft.com/ru-ru/library/hyxc48dt.aspx

Цитата:
Возвращаемое значение

Тип: System.Int32
32-разрядное знаковое целое число, выражающее лексическое отношение двух сравниваемых значений.
Значение

Условие

Меньше нуля

Значение параметра strA меньше значения параметра strB.

Нуль

Значения параметров strA и strB равны.

Больше нуля

Значение параметра strA больше значения параметра strB.

392
29 октября 2010 года
cronya
421 / / 03.01.2009
Насколько я помню списки имееют связи. При обмене элементов местами надо налаживать связи между элементами. Тока я чего то тут связей не заметил:(
39K
29 октября 2010 года
Saiko
23 / / 09.01.2009
Цитата: cronya
Насколько я помню списки имееют связи. При обмене элементов местами надо налаживать связи между элементами. Тока я чего то тут связей не заметил:(


связи?а у меня их тут и нету:( про связи я вообще мало что понимаю на си шарпе. мне казалось,их тут и не надо.

2.1K
29 октября 2010 года
Norgat
452 / / 12.08.2009
Цитата: Saiko
связи?а у меня их тут и нету:( про связи я вообще мало что понимаю на си шарпе. мне казалось,их тут и не надо.



судя по всему вам нужно сначала реализовать такую вещь: http://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA
см. Односвязный список (Однонаправленный связный список)
реализаций его в инете 10500+, гугл в помощь.

а потом уже сортировать его методом пузырька.

297
29 октября 2010 года
koodeer
1.2K / / 02.05.2009
В код не вникал, но "связи" ясно вижу:
 
Код:
class Element
{
    public string value;
    public Element [highlight]next[/highlight];
    public Element [highlight]prev[/highlight];
    public Element(string kValue)
    {
        value = kValue;
    }
}

В самом первом посте топикстартера. Получается двусвязный список.
Что ещё надо?
2.1K
29 октября 2010 года
Norgat
452 / / 12.08.2009
Цитата: koodeer
В код не вникал, но "связи" ясно вижу:
 
Код:
class Element
{
    public string value;
    public Element [highlight]next[/highlight];
    public Element [highlight]prev[/highlight];
    public Element(string kValue)
    {
        value = kValue;
    }
}

В самом первом посте топикстартера. Получается двусвязный список.
Что ещё надо?



В условии список односвязный, я бы так сделал:

 
Код:
class Element
{
    public string value;
    public Element [highlight]next[/highlight] = null;
    public Element(string kValue, Element Next = null)
    {
        value = kValue;
        next = Next;
    }
}


справедливо правда только для последнего шарпа, иначе просто:

 
Код:
class Element
{
    public string value;
    public Element [highlight]next[/highlight]; // насчёт поля по умолчанию не уверен в каких именно версиях он есть
    public Element(string kValue, Element Next)
    {
        value = kValue;
        next = Next;
    }
}
39K
29 октября 2010 года
Saiko
23 / / 09.01.2009
я так понимаю,что связи надо и в самой сортировке использовать,а не так тупо применять сортировку пузырьком,как делала я:)
392
30 октября 2010 года
cronya
421 / / 03.01.2009
Цитата: Saiko
[COLOR="Red"]Дан линейный односвязный список...[/COLOR]

Мне чего выдумавать, в задании одно, а сортировка сделана массива(сам C# я не знаю, ну судя по сортировке, видно что массив). Где обработка исключений? Так как у тебя он врядли чего отсортирует, если это список.

Цитата: koodeer
В код не вникал, но "связи" ясно вижу:
 
Код:
В самом первом посте топикстартера. Получается двусвязный список.
Что ещё надо?
А в код и не надо вникать, списки сортируются во всех языках одинаково, а она сделала просто обмен указателей.

Для чего это? Я не понял :)
[CODE]  for (i = 0; i < 20; i++ )
                {
                    for (j = 20 - 1; j > i; j-- )
                    {


Saiko, у тебя ваще сортировка работает?Если нет, то специльно для тебя Связные списки и про сортировку, правда на си Сортировка(На сам алгоритм посмотри внимательно)
39K
30 октября 2010 года
Saiko
23 / / 09.01.2009
Цитата: cronya
Мне чего выдумавать, в задании одно, а сортировка сделана массива(сам C# я не знаю, ну судя по сортировке, видно что массив). Где обработка исключений? Так как у тебя он врядли чего отсортирует, если это список.


структура у меня реализована в виде линейного списка. обработку исключений я вообще не трогала пока.

Цитата:

Для чего это? Я не понял :)
 
Код:
for (i = 0; i < 20; i++ )
                {
                    for (j = 20 - 1; j > i; j-- )
                    {


это для случая когда в файле 20 элементов (да тупо сделано,но это была проба)

Цитата:

Saiko, у тебя ваще сортировка работает?

не работает.вопрос у меня как раз и стоит,как сделать сортировку именно Списка а не массива.

392
30 октября 2010 года
cronya
421 / / 03.01.2009
 
Код:
while(!endof(имя_файла))
{
    тут считываещь с него в список;
}

Для файла так делаецо, просто списки не должны содержать количество элементов,в этом то и дело. Они распалагаюцо не по индексам, а создаюцо связи которые указывают на элементы.(а если там данных на 1 миллион) Ну короче совет такой: разберись как у тебя создаецо список, нарисуй его на бумажке, разберись как связи сделаны(что на что указывает) и делай сортировку. Бог в помощь короче говоря :D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог