С# Сортировка линейного списка
Прошу сильно не пинать и не бить :)
Задача такая: дан линейный односвязный список,значения которого заполняются из файла. (Допустим,в файле 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)
{
}
}
}
}
Код самой функции сортировки
{
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;// результат выводим на экран
}
}
пожалуйста, объясните чайнику ^^
Тип: System.Int32
32-разрядное знаковое целое число, выражающее лексическое отношение двух сравниваемых значений.
Значение
Условие
Меньше нуля
Значение параметра strA меньше значения параметра strB.
Нуль
Значения параметров strA и strB равны.
Больше нуля
Значение параметра strA больше значения параметра strB.
связи?а у меня их тут и нету:( про связи я вообще мало что понимаю на си шарпе. мне казалось,их тут и не надо.
судя по всему вам нужно сначала реализовать такую вещь: 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+, гугл в помощь.
а потом уже сортировать его методом пузырька.
{
public string value;
public Element [highlight]next[/highlight];
public Element [highlight]prev[/highlight];
public Element(string kValue)
{
value = kValue;
}
}
В самом первом посте топикстартера. Получается двусвязный список.
Что ещё надо?
{
public string value;
public Element [highlight]next[/highlight];
public Element [highlight]prev[/highlight];
public Element(string kValue)
{
value = kValue;
}
}
В самом первом посте топикстартера. Получается двусвязный список.
Что ещё надо?
В условии список односвязный, я бы так сделал:
{
public string value;
public Element [highlight]next[/highlight] = null;
public Element(string kValue, Element Next = null)
{
value = kValue;
next = Next;
}
}
справедливо правда только для последнего шарпа, иначе просто:
{
public string value;
public Element [highlight]next[/highlight]; // насчёт поля по умолчанию не уверен в каких именно версиях он есть
public Element(string kValue, Element Next)
{
value = kValue;
next = Next;
}
}
Мне чего выдумавать, в задании одно, а сортировка сделана массива(сам C# я не знаю, ну судя по сортировке, видно что массив). Где обработка исключений? Так как у тебя он врядли чего отсортирует, если это список.
Что ещё надо?
А в код и не надо вникать, списки сортируются во всех языках одинаково, а она сделала просто обмен указателей.
Для чего это? Я не понял :)
[CODE] for (i = 0; i < 20; i++ )
{
for (j = 20 - 1; j > i; j-- )
{
Saiko, у тебя ваще сортировка работает?Если нет, то специльно для тебя Связные списки и про сортировку, правда на си Сортировка(На сам алгоритм посмотри внимательно)
структура у меня реализована в виде линейного списка. обработку исключений я вообще не трогала пока.
Для чего это? Я не понял :)
{
for (j = 20 - 1; j > i; j-- )
{
это для случая когда в файле 20 элементов (да тупо сделано,но это была проба)
Saiko, у тебя ваще сортировка работает?
не работает.вопрос у меня как раз и стоит,как сделать сортировку именно Списка а не массива.
{
тут считываещь с него в список;
}
Для файла так делаецо, просто списки не должны содержать количество элементов,в этом то и дело. Они распалагаюцо не по индексам, а создаюцо связи которые указывают на элементы.(а если там данных на 1 миллион) Ну короче совет такой: разберись как у тебя создаецо список, нарисуй его на бумажке, разберись как связи сделаны(что на что указывает) и делай сортировку. Бог в помощь короче говоря :D