public void SetList(SingleLinkedList list) { SuspendLayout(); this.list = list; Node p = list.First; while(p!=null){ TextBox tb = new TextBox(); tb.Text = p.Info.ToString(); tb.Width = 30; this.itemsTlp.Controls.Add(tb); p = p.Link; } ResumeLayout(); }
public SingleLinkedList GetList() { SingleLinkedList list = new SingleLinkedList(); try { foreach(TextBox c in itemsTlp.Controls) { list.InsertAfterLast(int.Parse(c.Text)); } } catch {} // TODO: обновление поля list при добавлении нового элемента в список, а не при вызове GetList this.list = list; return list; }
void Button1Click(object sender, EventArgs e) { this.ouput.Clear(); try { SingleLinkedList sl1; SingleLinkedList sl2; SingleLinkedList sl3; sl1 = listView1.GetList(); sl2 = listView2.GetList(); sl3 = listView3.GetList(); if (sl1.isEmpty && sl2.isEmpty && sl3.isEmpty) { if (textBox1.Text.Length!=0 && textBox2.Text.Length!=0 && textBox3.Text.Length!=0){ sl1 = new SingleLinkedList(textBox1.Text.Trim()); sl2 = new SingleLinkedList(textBox2.Text.Trim()); sl3 = new SingleLinkedList(textBox3.Text.Trim()); } } else { sl1 = new SingleLinkedList("1 1 1 1 2 1 1 2 3"); sl2 = new SingleLinkedList("1 1 2"); sl3 = new SingleLinkedList("0"); } SuspendLayout(); ouput.Text += sl1.ToString(); sl1.First = ListManager.Replace(sl1,sl2,sl3); ouput.Text += "\r\n"; ouput.Text += sl1.ToString(); rl.SetList(sl1); ResumeLayout(); } catch (Exception ex) { MessageBox.Show(ex.Message+ ex.StackTrace); } }
/// <summary> /// Заменяет ? все вхождения одного списка в другой третьим списком /// /// 1, 2, 3 , 4, 5, 1, 2, 3, 6 /// 1, 2, 3 /// 10, 20. /// /// 10, 20, 4, 5, 10, 20, 6. /// </summary> public static Node Replace(SingleLinkedList L1, SingleLinkedList L2, SingleLinkedList L3) { Node F1 = L1.First; Node F2 = L2.First; Node F3 = L3.First; SingleLinkedList l1 = L1; SingleLinkedList l2 = L2; SingleLinkedList l3 = L3; if (F1!=null && F2!=null && F3!=null){ Node p = F1; Node pp = null; Node q = null; Node prep = F1; bool matched = false; //FIXME: работает, вроде if (F1.Info == F2.Info){ #region если вхождение в самом начале Debug.WriteLine("предположительно есть совпадение в начале"); p = F1; pp = F2; //Node t = p; matched = false; while (pp!=null && p!=null){ matched = true; if (p.Info != pp.Info) { matched = false; break; } //else{ //matched = true; p=p.Link; pp=pp.Link; //} Debug.WriteLine("!!! p ="+p); } // bp if (matched) { // нашли вхождение Debug.WriteLine("и правда, есть вхождение в начале, меняем"); q = (Node)F3.Clone(); F1 = q; while (q.Link!=null){ q=q.Link; } q.Link = p; prep = q; p = q.Link; //Debug.WriteLine("prep ="+prep.Info+" p="+p.Info); } else { Debug.WriteLine("встретилась "+p.Info+"ложная тревога, переходим в "+F1.Link.Info); prep = F1; p = F1.Link; } #endregion } /* else { prep = F1; p = F1.Link; } */ #region середина и конец while (p!=null){ Debug.WriteLine(p.Info+""); if (p.Info == F2.Info){ Debug.WriteLine("преположительно вхождение"); Debug.WriteLine(p+""); // запомнили начало Node s = p; pp = F2; matched = false; while (pp!=null && p!=null){ //if (){ matched = true; if (pp.Info!=p.Info) { Debug.WriteLine(pp.Info + "!="+p.Info); matched = false; break; } matched = true; //else { // matched = true; pp = pp.Link; p = p.Link; if (pp == null && matched){ matched = true; break; } if (p == null) { matched = false; break; } //} //matched = true; //} /* else { matched = false; break; } */ } if (matched) { Debug.WriteLine("и правда, меняем"); q = (Node)F3.Clone(); prep.Link = q; while (q.Link!=null){ q=q.Link; } q.Link = p; //prep.Link = q; prep = q; //p = p.Link; Debug.WriteLine("prep = "+prep + " p = "+p); } else { prep = s; p = s.Link; } } else { prep = p; p = p.Link; } } #endregion } return F1; }