adydan napisał(a)
podstawa do wyjścia:
Dzięki za odpowiedź!
Jednak wole w miarę samemu pisać tego typu rzeczy, przynajmniej coś się nauczę :).
Btw. Mam już najważniejsze rzeczy do Huffmana, tylko wystąpił mały problem....
Wszystko byłoby cacy, gdyby działała mi funkcja (właściwie, nie wiem czy to ona jest winna) odpowiedzialna za sortowanie. Gdy ją usunę wszystko działa ok, gdy zostawię, program się wywala. Wiem, że kod pozostawia wiele do życzenia. Wydaje mi się, że przyczyną tego problemu może być złe budowanie listy.
Czy mógłby mi ktoś podpowiedzieć jak to popoprawiać?
#include <iostream>
using namespace std;
int counter = 0;
struct Tree
{
Tree* left;
Tree* right;
//char c;
int value;
};
struct List
{
int value;
List* prev;
List* next;
Tree* t;
List()
{
t = new Tree;
t->left = 0;
t->right = 0;
t->value = 0;
}
};
List* head = 0;
List* tail = 0;
void addTree(Tree* t, int val)
{
List* newitem;
newitem = new List;
newitem->value = val;
newitem->t = t;
newitem->t->value = val;
if(head==0)
{
newitem->next = 0;
newitem->prev = 0;
head = newitem;
tail = newitem;
}
else
{
newitem->next = 0;
newitem->prev = tail;
tail->next = newitem;
tail = newitem;
}
counter++;
}
void add(int val)
{
List* newitem;
newitem = new List;
newitem->value = val;
if(head==0)
{
newitem->next = 0;
newitem->prev = 0;
head = newitem;
tail = newitem;
}
else
{
newitem->next = 0;
newitem->prev = tail;
tail->next = newitem;
tail = newitem;
}
counter++;
}
void remove()
{
cout << "Usuwam: " << head->value << endl;
List* temp;
if(head)
{
temp = head;
head = temp->next;
if(!head) tail = 0;
else head->prev = 0;
delete temp;
}
counter--;
}
void print()
{
List* temp;
temp = head;
while(temp)
{
cout << temp->value << endl;
temp = temp->next;
}
}
void sort_wstaw()
{ List *tmp, *pom;
List *nowypierwszy = NULL;
while (head)
{ tmp = head;
head = tmp->next;
if (nowypierwszy==NULL)
{ tmp->next=nowypierwszy;
nowypierwszy = tmp;
}
else if (nowypierwszy->value>= tmp->value)
{ tmp->next = nowypierwszy;
nowypierwszy = tmp;
}
else
{ pom = nowypierwszy;
while (pom->next)
{ if (pom->next->value>tmp->value) break;
pom = pom->next;
}
tmp->next = pom->next;
pom->next = tmp;
}
}
head = nowypierwszy;
}
void inOrder(Tree* tw)
{
if(tw->left)
inOrder(tw->left);
cout << tw->value << " ";
if(tw->right)
inOrder(tw->right);
}
int main()
{
Tree* tw = new Tree;
tw->right =0;
tw->left = 0;
tw->value =0;
addTree(tw,1);
addTree(tw,2);
addTree(tw,3);
addTree(tw,4);
while(head->next)
{
Tree* tt = new Tree;
tt->left = head->t;
tt->right = head->next->t;
addTree(tt, head->value + head->next->value);
remove();
remove();
//sort_wstaw();
}
print();
cout << "#INORDER#" << endl;
inOrder(head->t);
delete tw;
system("PAUSE");
return 0;
}
Pozdrawiam, Ziem!