static void ProhodPrvniPosledni(Seznam s) // h) Napište funkci, která ve spojovém seznamu prohodí (pomocí odkazů, nikoliv výměnou hodot) první prvek a poslední prvek. { Seznam pracovni = s; Seznam pracovni2 = s; int prvni = pracovni.data; int posledni = -1; while (pracovni != null) { if (pracovni.next == null) { posledni = pracovni.data; } pracovni = pracovni.next; } Console.Write("Prohození posledního a prvního prvku spojového seznamu: "); pracovni2.data = posledni; while (pracovni2 != null) { if (pracovni2.next == null) { pracovni2.data = prvni; } Console.Write(pracovni2.data + ", "); pracovni2 = pracovni2.next; } Console.WriteLine(); }
static void ObratPoradi(Seznam s) // f) Napište funkci, která obrátí pořadí prvků ve spojovém seznamu (za použití jednoho průchodu spojovým seznamem) { Seznam pracovni = s; Seznam pracovni2 = s; int pocetPrvkuSeznamu = 0; while (pracovni != null) { pocetPrvkuSeznamu++; pracovni = pracovni.next; } int[] novy = new int[pocetPrvkuSeznamu]; int i = pocetPrvkuSeznamu - 1; while (pracovni2 != null) { novy[i] = pracovni2.data; i--; pracovni2 = pracovni2.next; } Seznam noveS = ConvertArray(novy); Console.Write("Obrácené pořadí prvků ve spojovém seznamu: "); while (noveS != null) { Console.Write(noveS.data + ", "); noveS = noveS.next; } Console.WriteLine(); }
} // static Seznam Create(int n) // { // Seznam vys = new Seznam(); // vys.data = n; // vys.next = null; // return(vys); // } //
static Seznam Zacatek(Seznam s, int n) { Seznam tmp = Novy(n); tmp.next = s; s.prev = tmp; return(tmp); }
static Seznam Novy(int n) { Seznam vys = new Seznam(); vys.data = n; vys.next = null; vys.prev = null; return(vys); }
static void Zobraz(Seznam s) { while (s != null) { Console.Write(s.data + " "); s = s.next; } Console.WriteLine(); }
static Seznam PridejPred(Seznam s, Seznam kam, int n) { Seznam tmp = Novy(n); if ((kam == null) || (kam.prev == null)) { return(Zacatek(s, n)); } tmp.prev = kam.prev; kam.prev.next = tmp; kam.prev = tmp; tmp.next = kam; return(s); }
} ///////////////////////////////////////////////// static void UlozDoTxT(Seznam s) // a) Napište funkci, která uloží spojový seznam do textového souboru { FileStream novyDokument = new FileStream("..\\..\\..\\spojovySeznam_doTxt.txt", FileMode.Create); StreamWriter zapisDoDokumentu = new StreamWriter(novyDokument); Seznam akt = s; while (akt != null) { zapisDoDokumentu.Write(akt.data + ", "); akt = akt.next; } zapisDoDokumentu.WriteLine(); zapisDoDokumentu.Close(); }
static Seznam Cykl(Seznam s) { Seznam akt = s; while (akt != null) { if (akt.next == null) { akt.next = s; s.prev = akt; return(s); } akt = akt.next; } return(s); }
static void OdstranNejvyssiH(Seznam odkud) // e) Napište funkci, která ze spojového seznamu odstraní prvek s nejvyšší hodnotou. Pokud má více prvků stejnou hodnotu, odstraní první z nich. { Seznam pracovni = odkud; int nejvyssiHodnota = -1; while (pracovni != null) { if (pracovni.data > nejvyssiHodnota) { nejvyssiHodnota = pracovni.data; } pracovni = pracovni.next; } Console.WriteLine("Prvek spojového seznamu s nejvyšší hodnotou: {0}", nejvyssiHodnota); }
static void PocetVyskytuPrvku(Seznam kde, int co) // c) Napište funkci, která vrátí počet výskytů zadaného prvku ve spojovém seznamu. { Seznam pracovni = kde; int pocetVyskytu = 0; while (pracovni != null) { if (pracovni.data == co) { pocetVyskytu++; } pracovni = pracovni.next; } Console.WriteLine("Hledaná hodnota {0} se ve spojovém seznamu vyskytuje {1}x.", co, pocetVyskytu); }
static void Main(string[] args) { int[] pole = { 2, 13, 48, 97, 2, 11, 2, 61, 235, 154, 452, 875 }; Seznam x = ConvertArray(pole); int hledanyP = 2; // <-- patří k příkladu c) UlozDoTxT(x); // a) NactiZTxt(); // b) PocetVyskytuPrvku(x, hledanyP); // c) OdstranPosledni(x, hledanyP); // d) - dodělat, chybí vymazání prvku (zatím umí jen najít index posledního hledaného prvku) OdstranNejvyssiH(x); // e) - dodělat, chybí vymazání prvku (zatím umí jen vyhledat prvek s nejvyšší hodnotou) ObratPoradi(x); // f) //SeradSestupne(x); // g) - zcela chybí ProhodPrvniPosledni(x); // h) ProhodDruhyPredposledni(x); // i) Console.ReadLine(); }
static Seznam PridejPo(Seznam s, int kam, int co) { Seznam tmp = Novy(co); Seznam akt = s; while (akt != null) { if (akt.data == kam) { tmp.prev = akt; tmp.next = akt.next; akt.next = tmp; return(s); } akt = akt.next; } return(null); }
static void OdstranPosledni(Seznam odkud, int co) // d) Napište funkci, která ze spojového seznamu odstraní poslední z prvků, jejichž hodnota je shodná se zadanou hodnotou. { Seznam pracovni = odkud; int indexAktualni = -1; int indexPosledni = -1; while (pracovni != null) { indexAktualni++; if (pracovni.data == co) { indexPosledni = indexAktualni; } //Console.Write(pracovni.data + ", "); pracovni = pracovni.next; } Console.WriteLine("Index posledního výskytu hledaného prvku je: {0}", indexPosledni); }
static void ZobrazCykl(Seznam s) { Seznam akt = s; if (akt == null) { return; } { while (akt.next != s) { Console.WriteLine("Cyklický seznam" + akt.data); akt = akt.next; } Console.WriteLine(); } }
static void ProhodDruhyPredposledni(Seznam s) // i) Napište funkci, která ve spojovém seznamu prohodí druhý a předposlední prvek. { Seznam pracovni2 = s; Seznam pracovni = s; int prvni = pracovni.data; int druhy = pracovni.next.data; int predPosledni = -1; int posledni = -1; while (pracovni != null) { if (pracovni.next.next == null) { predPosledni = pracovni.data; pracovni = pracovni.next; if (pracovni.next == null) { posledni = pracovni.data; } break; } pracovni = pracovni.next; } Console.Write("Prohození předposledního a druhého prvku spojového seznamu: "); pracovni2.next.data = predPosledni; pracovni2.data = posledni; while (pracovni2 != null) { if (pracovni2.next.next == null) { pracovni2.data = druhy; pracovni2.next.data = prvni; Console.Write(pracovni2.data + ", " + pracovni2.next.data); break; } Console.Write(pracovni2.data + ", "); pracovni2 = pracovni2.next; } Console.WriteLine(); }
static Seznam Konec(Seznam s, int n) { Seznam akt = s, tmp = Novy(n); if (akt == null) { return(tmp); } while (akt != null) { if (akt.next == null) { tmp.prev = akt; akt.next = tmp; return(s); } akt = akt.next; } return(s); }
static int[] SeznamPole(Seznam s) { Seznam akt = s; int i = 0; while (akt != null) { i++; akt = akt.next; } int[] pole = new int[i]; for (int k = 0; k < i; k++) { pole[k] = s.data; s = s.next; } return(pole); }
static Seznam Smaz(Seznam s, int co) { Seznam akt = s; Seznam tmp2 = Novy(co); Seznam tmp3; tmp2 = new Seznam(); tmp3 = null; while (akt != null) { if (akt.data == co) { tmp2 = akt.next; tmp3.next = tmp2; tmp2.prev = akt.prev; return(s); } tmp3 = akt; akt = akt.next; } return(s); }
static void SeradSestupne(Seznam s) // g) Napište funkci, která prvky spojového seznamu uspořádá sestupně. { }
static void Main(string[] args) { Console.WriteLine("Kolik chcete zadat čísel do seznamu? Minimální počet je 7"); int cisla = Convert.ToInt32(Console.ReadLine()); int[] pole = new int[cisla]; for (int i = 1; i < cisla && cisla > 7; i++) { Console.Write("Zadejte {0} cislo: ", i); pole[i] = Convert.ToInt32(Console.ReadLine()); } Seznam s1 = PoleSeznam(pole); Zobraz(s1); Seznam s2 = new Seznam(); Console.WriteLine("Chcete nějakou hodnotu do seznamu přidat, smazat nebo pokračovat? "); Console.WriteLine("1. - Přidej"); Console.WriteLine("2. - Smaž"); Console.WriteLine("3. - Nic"); string menu = Console.ReadLine(); if (menu == "1") { Console.WriteLine("Kam chcete vkládat?"); int kam = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Co chcete vkládat?"); int co = Convert.ToInt32(Console.ReadLine()); PridejPo(s1, kam, co); Zobraz(s1); } else if (menu == "2") { Console.WriteLine("Co chcete mazat?"); int co = Convert.ToInt32(Console.ReadLine()); Smaz(s1, co); Zobraz(s1); } else { Console.WriteLine("Ok, nedělám nic, pokračuji"); Console.ReadLine(); } Console.WriteLine("Původní pole Quicksort : "); foreach (var item in pole) { Console.Write(" " + item); } Console.WriteLine(); Quick_Sort(pole, 0, pole.Length - 1); Console.WriteLine(); Console.WriteLine("Setřídené pole QuickSort : "); foreach (var item in pole) { Console.Write(" " + item); } Console.WriteLine(); Seznam s4 = Cykl(s1); ZobrazCykl(s4); Console.ReadLine(); }