• 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

Object Storage Arubacloud
+2 głosów
2,304 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 1,093 wizyt
pytanie zadane 13 września 2017 w C i C++ przez John Doe Obywatel (1,720 p.)
0 głosów
0 odpowiedzi 584 wizyt
pytanie zadane 14 listopada 2016 w Systemy operacyjne, programy przez Emshya Nowicjusz (120 p.)
0 głosów
1 odpowiedź 489 wizyt
pytanie zadane 9 maja 2016 w C i C++ przez gsharp Początkujący (280 p.)

92,755 zapytań

141,677 odpowiedzi

320,423 komentarzy

62,101 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...