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. }