public void addSortedToCopy(Node_SF nodeControl, LinkedList_SF list)
 {
     if (list.headAndRoot == null)
     {
         list.headAndRoot = nodeControl;
     }
     else if (list.headAndRoot.frequence.CompareTo(nodeControl.frequence) >= 0)
     {
         nodeControl.next = list.headAndRoot;
         list.headAndRoot = nodeControl;
     }
     else
     {
         Node_SF iterator = list.headAndRoot.next;
         Node_SF previous = list.headAndRoot;
         while (iterator != null)
         {
             if (iterator.frequence.CompareTo(nodeControl.frequence) >= 0)
             {
                 previous.next    = nodeControl;
                 nodeControl.next = iterator;
                 break;
             }
             previous = iterator;
             iterator = iterator.next;
         }
         if (iterator == null)
         {
             previous.next = nodeControl;
         }
     }
 }
        public LinkedList_SF copy()
        {
            LinkedList_SF newList  = new LinkedList_SF();
            Node_SF       iterator = headAndRoot;

            while (iterator != null)
            {
                newList.addToFront(iterator.Symbol, iterator.frequence);
                iterator = iterator.next;
            }
            return(newList);
        }
        private void makeTree()
        {
            Node_SF first, second;

            llSemFrqCode = new LinkedList_SF();
            llSemFrqCode = llTree.copy(); //sadece harflerin kodlarını bulmak icin listeyi bozulmadan once yedekliyoruz.

            while (llTree.Length() > 1)   // bu döngünün içinde ağaç oluşturuluyor.
            {                             //ilk iki eleman alıp, yeni bir nod olusturulup, olusturulan yeni node un yaprakları oluyor.
                first  = llTree.getAndRemoveFirstNode();
                second = llTree.getAndRemoveFirstNode();
                Node_SF addedNode = new Node_SF((first.Symbol + second.Symbol), (first.frequence + second.frequence));
                addedNode.Left  = first;
                addedNode.Right = second;
                //olusturulan yeni node listeye tekrar sirali bir sekiilde ekleniyor.
                llTree.addSorted(addedNode);
            }
        }
        private LinkedList_SF findCharFreq()
        {
            LinkedList_SF lList   = new LinkedList_SF();
            string        content = fileOpr.readFrom();        // belge icerigini aldik

            for (int i = 0; i < content.Length; i++)           // belgenin icinde teker teker dolasip karakterlere bakacagiz
            {
                if (lList.haveSameSym(content[i].ToString()))  // böyle bir karakter listede varsa
                {
                    lList.increaseFreq(content[i].ToString()); // var olan karakterin frekansını 1 arttırdık.
                }
                else
                {
                    lList.addToFront(content[i].ToString().ToString());         // listeye yeni karakteri ekledik(yeni eklediğimiz karakterin frq ı ) oluyor
                }
            }
            lList.sort();
            return(lList);
        }
        public void findCode(LinkedList_SF getTree) // harflerin kodunu bulup döndüren metod
        {
            LinkedList_SF tree = getTree;

            string code = "";

            if (headAndRoot != null)
            {
                Node_SF iteratorSingleSymbol = headAndRoot;                         // her bir sembolun kodunu bulmak için bütün elemanları dolasacak olan iterator.

                if (haveChar(tree.headAndRoot.Symbol, iteratorSingleSymbol.Symbol)) // eğer root un içinde o sembol yoksa boşuna arama yapmayacak
                {
                    while (iteratorSingleSymbol != null)
                    {
                        Node_SF iteratorTree = tree.headAndRoot;

                        while (iteratorTree != null)
                        {
                            while (iteratorTree.Left != null && iteratorTree.Right != null)
                            {
                                if (haveChar(iteratorTree.Left.Symbol, iteratorSingleSymbol.Symbol)) // eğer aradığı sembol soldaki parent ın içinde varsa
                                {
                                    iteratorTree = iteratorTree.Left;                                // sembolü bulamamışsa iteratörü bir alt node a taşıyacak...
                                    code        += 0;                                                //ve koda 0 ekleyece
                                }

                                else if (haveChar(iteratorTree.Right.Symbol, iteratorSingleSymbol.Symbol)) // aradığı sembol sağdaysa
                                {
                                    iteratorTree = iteratorTree.Right;                                     // sembolü bulamamışsa iteratörü bir alt node a taşıyacak...
                                    code        += 1;
                                }
                            }
                            iteratorSingleSymbol.code = code;             // eğer node un lefti ve right ı boşsa yapraga gelmistir ve kod hazırdır.
                            code = "";                                    // diğer semboller icin kodu bosalttik
                            break;                                        //kodu bulduktan sonra donguden cikip diger sembole gececek.
                        }
                        iteratorSingleSymbol = iteratorSingleSymbol.next; //sonraki sembolu atadik.
                    }
                }
            }
        }
 public void findSymFreqCode()      //find symbol frequence code
 {
     llTree = findCharFreq();       // once sembollerin frekanslarini buluyoruz.
     makeTree();                    // sonra bu frekanslara gore agac olusturuyoruz
     llSemFrqCode.findCode(llTree); // agac uzerinden sembollerin kodlarini buluyoruz.
 }