Struktura Drzewa w C, jak stworzyć ?

0

Problem jest dosyć prosty. Muszę zaimplementować drzewo do którego wpiszę wartość i znak. Całość ma być elementem programu kodującego tekst huffmanem. Pytanie brzmi jak zbudowac takie drzewko od 'dołu'. Póki co buduje osobne drzewka dla każdego przypadku, chciałbym je połączyć w jedną spójną całość. Bardzo proszę o pomoc i z góry dziękuje.


struct data{

	char sign=NULL;

	int count=0;

	struct data*next=NULL;

};

struct tree{

	struct tree * left=NULL;

	struct tree * right=NULL;

	struct tree * dad = NULL;

	char sign_tree=NULL;

	int value=NULL;

};




void data1(data*head, tree*root) {

	data*wsk;   // wskaznik do struktury przechowującej znak i ilość jego powtórzeń
	wsk = head;

	tree*tmp;   // wskaznik do struktury drzewa
	tmp=root;

	int bufer;
	int bufer1;

	char sign=NULL;
	char sign1=NULL;

	int count_str=0;

	while (wsk != NULL)    // funkcja zliczająca ilosć stuktur data
	{
		count_str++;
		wsk = wsk -> next;
	}

       sort(head);  // funkcja sortujaca elemnty lsity od najmniejszej do najwiekszej

	wsk = head;

	for (int i = 0; i < count_str; i++)
	{
		while (wsk->count == 0)      // jezeli pierwszy element listy wystepuje 0 razy ( w przypadku pustej listy i kolejnych ktore zostana wyzerowane ) omiń go
		{
			wsk = wsk->next;
		}

		if (wsk->next != NULL)  // jezeli pozostaly jeszcze 2 elementy listy wykonaj dzialanie
		{

			bufer = wsk->count;                //wpisz obecneą i kolejną wartosć z listy w bufor i bufor1
			sign = wsk->sign;
			bufer1 = wsk->next->count;
			sign1 = wsk->next->sign;

			wsk->count=0;                            //wyzeruj wartosci tak aby zostaly pominiete przy nastepnym przpisywaniu 
			wsk->next->count=0;
			while (wsk->next != NULL)           przejdz na koniec listy
				{
					wsk = wsk->next;
				}

			wsk->next = new data;                              //dodaj nowy element listy, jego wartosc to suma dwoch poprzednich
			wsk->next->count = bufer + bufer1;
			wsk->next->sign = '$';

			sort(head);                                         //posortuj

			printf("\n bufer ;%d    bufer1; %d\n", bufer, bufer1);

				tmp = new tree;                                           // skoro program pobral 1 i 2 liczbe z posortowanej listy, to pobral najmniejsza i druga po niej
				tmp->value = bufer + bufer1;                        // zatem warunek kodowania hffmana zostal spelniony, bufer to lewy lisc bufer1 to prawy lisc 
				tmp->sign_tree = '!';                                    // a ich suma bedzie wartoscia ojca
			
				tmp->left = new tree;
				tmp->left->value = bufer;
				tmp->left->sign_tree = sign;

			
				tmp->right = new tree;
				tmp->right->value = bufer1;
				tmp->right->sign_tree = sign1;
	

				sort(head);                                    //posortuj liste

			printf("\n lewo %d - %c \n ", tmp->left->value, tmp->left->sign_tree);
	
			printf("\n ojciec %d - %c \n ", tmp->value, tmp->sign_tree);

			printf("\n prawo  %d - %c \n ", tmp->right->value, tmp->right->sign_tree);
				
		}

	}

} 
0
  1. inkrementacja: http://4programmers.net/Forum/1101404
  2. Zrób od razu tablicę takich struktur, od razu w tablicę zliczasz wystąpienia, a później łączysz.
0

Hej, mam pytanie. Czy w poniższym kodzie udało mi się stworzyć działające drzewo? Jeśli tak jak się po nim poruszać ?

 // Kodowanie Huffmana
// Antczak Kamil 2016-01-25
//POLSL AEiI
//---------------------------

#include "stdafx.h"
#include "string.h"
#include <stdio.h>


struct data{

	char sign=NULL;

	int count=0;

	struct data*next=NULL;

};

struct tree{

	struct tree * left=NULL;

	struct tree * right=NULL;

	struct tree * dad = NULL;

	char sign_tree=NULL;

	int value=NULL;

};


void zlicz(data* head)
{
	data*wsk;
	wsk = head;

	FILE * plik;

	plik = fopen("plik.txt", "r");

	int total = 0;
	int number_letter= NULL;
	char letter;
 	while (number_letter != EOF)
	{
		letter = getc(plik);
		total++;
		printf("znak nr %d -  %c\n", number_letter, letter);

		wsk = head;
		while(wsk != NULL)
		{ 
			if (letter == wsk->sign)
			{
				puts("znalazlem litere");
				wsk->count += 1;
				printf("%d\n\n", wsk->count);
				break;
			}

			else if (wsk->sign == NULL )
			{
				wsk->next = new data;
				wsk->count += 1;
				wsk->sign = letter;
				puts("nowa litera, dodaje wezel");		
				break;
			}
			//else { puts("szukam dalej"); }

			wsk = wsk->next;

			number_letter = letter;
				
		}
		//puts("koniec wezlow");
	}

	printf("tekst ma %d znakow \n", total);

	wsk = head;
	while (wsk != NULL)
	{

		printf("znak %c  wystepuje %d razy \n", wsk->sign, wsk->count);
		wsk = wsk->next;

	}
	
	fclose(plik);

}
	
void sort(data*head)
{
	data*wsk;
	wsk = head;
	int count_str = 0;
	
	while (wsk != NULL)
	{
		count_str++;
		wsk = wsk->next;
	}

	printf("%d\n\n", count_str);

	int bufor = 0;
	char buf=NULL;

	wsk = head;

	 for (int i = 0; i < count_str; i++)
	{
		wsk = head;
		while (wsk != NULL)
		{	
			if (wsk -> next != NULL)
			{
				if (wsk->count > wsk->next->count)
				{
					//puts("zamiana");
					bufor = wsk->count;
					wsk->count = wsk->next->count;
					wsk->next->count = bufor;

					buf = wsk->sign;
					wsk->sign = wsk->next->sign;
					wsk->next->sign = buf;

				}

			}
			
			//puts("if sie zgadza");
			wsk = wsk->next;
				
		}

		//puts("wyszeldem z while");

	}


	//printf("%d\n\n", count_str);
}

void display(data*head)
{	
	data*wsk;
	wsk = head;

	int count_str=0;

	while (wsk != NULL)
	{
		printf("%c %d\n",wsk->sign, wsk->count);
		count_str++;
		wsk = wsk->next;

	}

	printf("struktur  :  %d\n\n", count_str);
	
	
}

void data1(data*head, tree*root) {

	data*wsk;
	wsk = head;
	tree*tmp;
	tmp=root;

	int bufer;
	int bufer1;
	char sign=NULL;
	char sign1=NULL;
	int count_str=0;

	while (wsk != NULL)
	{count_str++;
	 wsk = wsk -> next;}

	sort(head);

	wsk = head;

	tmp->dad = new tree;

	for (int i = 0; i < count_str; i++)
	{
		wsk = head;
		sort(head);


		while (wsk->count == 0)
		{

			wsk = wsk->next;

		}
		

		if (wsk->next != NULL)
		{

			bufer = wsk->count;
			sign = wsk->sign;
			bufer1 = wsk->next->count;
			sign1 = wsk->next->sign;

			wsk->count=0;
			wsk->next->count=0;
			while (wsk->next != NULL)
				{
					wsk = wsk->next;
				}

			wsk->next = new data;
			wsk->next->count = bufer + bufer1;
			wsk->next->sign = '$';

			printf("\n bufer ;%d    bufer1; %d\n", bufer, bufer1);

			if (tmp->dad->value == bufer && tmp->dad->sign_tree == sign)
				{
					
					tmp->dad = new tree;
					tmp->dad->value = bufer + bufer1;
					tmp->dad->sign_tree = '$';
					
					tmp->right = new tree;
					tmp->right->value = bufer1;
					tmp->right->sign_tree = sign1;

					tmp->left->value = bufer;
					tmp->left->sign_tree = sign;

					puts("poprzedni ojciec to lewy wezel");

				}

			if (tmp->dad->value == bufer1 && tmp->dad->sign_tree == sign1)
			{

				tmp->dad = new tree;
				tmp->dad->value = bufer + bufer1;
				tmp->dad->sign_tree = '$';

				tmp->left = new tree;
				tmp->left->value = bufer;
				tmp->left->sign_tree = sign;

				tmp->right->value = bufer1;
				tmp->right->sign_tree = sign1;

				puts("poprzedni ojciec to prawy wezel");
			}
			else {

				tmp->dad = new tree;
				tmp->dad->value = bufer + bufer1;
				tmp->dad->sign_tree = '$';


				tmp->left = new tree;
				tmp->left->value = bufer;
				tmp->left->sign_tree = sign;


				tmp->right = new tree;
				tmp->right->value = bufer1;
				tmp->right->sign_tree = sign1;
				puts("osobne drzewko");

			}
			


			printf("\n lewo %d - %c \n ", tmp->left->value, tmp->left->sign_tree);
	
			printf("\n ojciec %d - %c \n ", tmp->dad->value, tmp->dad->sign_tree);

			printf("\n prawo  %d - %c \n ", tmp->right->value, tmp->right->sign_tree);
				
		}
		
	}

	printf("%d\n\n\n\n", tmp->right->value);

}


int main()
{

	struct data *head = new data;

	struct tree *root = new tree;

	head->next = head; 

	//root->left = root;
	//root->right = root;

	zlicz(head);

	sort(head);

	display(head);

	data1(head,root);

	display(head);

	int x=NULL;

	scanf("%d", x);


	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1