• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zliczanie ilości wystąpień pojedynczych znaków w tekście. Struktura drzewa, docelowo kodowanie huffmana

Konferencja JOIN! 2018
+2 głosów
782 wizyt
pytanie zadane 26 stycznia 2016 w C i C++ przez magnusik22 Nowicjusz (200 p.)

Witam.

Od kilku godzin siedzę i nie potrafię znaleźć błędu. Próbuję napisać funkcję (chyba niezbędną do utworzenia programu kodującego huffmanem) zliczającą ilość wystąpień poszczególnych znaków i bezpośrednie wpisanie tej ilości w strukturę.

Funkcja ma kolejno pobierać pojedyncze znaki z ciągu zdanie[]; a następnie sprawdzenie czy taki znak już wcześniej występował.
Jeżeli tak : wskaźnik wskazujący na zmienną "int ile" zwiększa się o 1.
Jeśli nie : litera jest zapisywana w kolejnej, nowo utworzonej strukturze.

Docelowo chciałbym aby funkcja wyświetliła mi częstotliwość występowania znaków. Dodałem kilka komend tekstowych w celu ułatwienia znalezienia problemu.

Finalnie program ma kodować metodą huffmana. Listy i drzewa są dla mnie nowością, więc kod może być lekko (albo nawet bardzo) nieoptymalny. Z góry dziękuje za wszystkie podpowiedzi. Pozdrawiam.
 


#include "stdafx.h"
#include "string.h"
 
 
 
// zmienne testowe
 
char zdanie[] = "misisipi";
 
 
struct tree{
 
    struct tree *lewo;
 
    struct tree *prawo;
 
    struct tree *dad;
 
    char znak;
 
    int ile=0;
 
    struct tree *next = NULL;
 
 
 
};
 
void zlicz(tree* head)
{
    tree*wsk;
    wsk = head;
 
    char c;
 
    int x = strlen(zdanie);
 
    printf("%d", x);
 
    for (int z = 0; z < x; z++)
    {
        c = zdanie[z];
        puts("pobieram litere");
 
        printf("%c\n", c);
 
 
            if (wsk->next != 0)
            {
                puts("kolejny element istnieje");
 
                while (wsk != NULL)
                {
                    puts("petla szukajaca znaku");
 
                    if (c == wsk->znak)
                    {
                    wsk->ile = (wsk->ile + 1);
                    puts(" dodaje do znaku");
                    wsk = wsk->next;
                    break;
                    }
                    else break;
 
                }
 
                puts("tworze nowy lisc");
                wsk = new tree;
                wsk->znak = c;
 
 
 
            } else puts("--");
 
 
 
 
    }
 
    puts("koneic petli for");
 
 
        wsk = head;
 
        while (wsk != NULL)
        {
 
            printf("%d\n", wsk->ile);
            wsk = wsk->next;
 
        }
 
}
 
 
 
int main(int argc, char * argv[])
{
 
    struct tree *head = new tree;
 
    head -> next = head;
 
    zlicz(head);
 
    puts("sialala");
 
    return 0;
} 

1 odpowiedź

+1 głos
odpowiedź 27 stycznia 2016 przez magnusik22 Nowicjusz (200 p.)

Hej, powalczyłem trochę i  napisałem funckję pobierającą i zliczającą znaki z pliku txt. 

Teraz muszę posortować struktury względem czestotliwośći występowania liter.

 

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

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





struct tree{

	struct tree *left;

	struct tree *right;

	struct tree *dad;

	char sign=NULL;

	int count=0;

	struct tree *next=NULL;

};


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

	FILE * plik;

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

	int number_letter= NULL;
	char letter;
	int total=0;
 	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 tree;
				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);

}
	



int main()
{

	struct tree *head = new tree;

	head -> next = head;

	zlicz(head);

	int xe;

	scanf("%d", &xe);
	

	return 0;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 226 wizyt
pytanie zadane 13 września 2017 w C i C++ przez John Doe Obywatel (1,680 p.)
0 głosów
0 odpowiedzi 107 wizyt
pytanie zadane 14 listopada 2016 w Systemy operacyjne, programy przez Emshya Nowicjusz (120 p.)
0 głosów
1 odpowiedź 180 wizyt
pytanie zadane 9 maja 2016 w C i C++ przez gsharp Początkujący (280 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

55,143 zapytań

99,367 odpowiedzi

204,372 komentarzy

27,139 pasjonatów

Przeglądających: 387
Pasjonatów: 19 Gości: 368

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...