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

92,556 zapytań

141,404 odpowiedzi

319,562 komentarzy

61,942 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...