Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2011, 17:23   #1
DiZbot
 
Регистрация: 29.05.2011
Сообщений: 6
По умолчанию Код Хаффмана (Huffman)

Пишу сабж для кодирования английского алфавита...
застрял... не могу присвоить данные в массив структур...

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct sym {
	char ch;
	float freq;     
	char code[255];
	struct sym *left;
	struct sym *right;
} sym;
 
sym *makeTree(sym *psym[],int k) {
		int i;
		sym *temp;
		temp=(sym*)malloc(sizeof(sym));
		temp->freq=psym[k-1]->freq+psym[k-2]->freq;
		temp->code[0]=0;
		temp->left=psym[k-1];
		temp->right=psym[k-2];
		if(k==2) { return temp;
        } else {
			for(i=0;i<k;i++)
				if (temp->freq>psym[i]->freq) { 
					int j;
					for(j=k-1;j>i;j--)
					psym[j]=psym[j-1];                                                                      
					psym[i]=temp;
					break;
				}               
        }
return makeTree(psym,k-1);
}
 
void makeCodes(sym *root) {
		if(root->left) {
			strcpy(root->left->code,root->code);
			strcat(root->left->code,"0");
			makeCodes(root->left);
		}
		if(root->right) {
			strcpy(root->right->code,root->code);
			strcat(root->right->code,"1");
			makeCodes(root->right);
        }
}


int main () {
        int k=26; //кол-во символов
	int i, j = 0;
        sym simbols[26]; //инициализируем массив записей
		simbols->ch = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };
		simbols->freq = {7.96,1.6,2.84,4.01,12.86,2.62,1.99,5.39,7.77,0.16,0.41,3.51,2.43,7.51,6.62,1.81,0.17,6.83,6.62,9.72,2.48,1.15,1.8,0.17,1.52,0.05};
        sym *psym[256]; //инициализируем массив указателей на записи
		sym **psum=(sym**)malloc(k*sizeof(sym*));
		for(i=0;i<k;i++) psym[i]=&simbols[i];
		sym temp;
		for(i=1;i<k;i++) {
			for(j=0;j<k-1;j++) {
				if(simbols[j].freq<simbols[j+1].freq) {
					temp=simbols[j];
					simbols[j]=simbols[j+1];
					simbols[j+1]=temp;
				}
			}
		}

for(i=0;i<k;i++) {      
        printf("Ch= %d\tFreq= %f\tPPP= %c\t\n",simbols[i].ch,simbols[i].freq,psym[i]->ch);
}
		sym *root=makeTree(psym,k);//вызов функции создания дерева Хофмана
		makeCodes(root);//вызов функции получения кода
        for(i=0;i<k;i++){
            printf("%s ",simbols[i].code);
}
return 0;
}
Компилятор ругается(error: expected expression before ‘{’ token) на это кусок:
Код:
simbols->ch = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };
simbols->freq = {7.96,1.6,2.84,4.01,12.86,2.62,1.99,5.39,7.77,0.16,0.41,3.51,2.43,7.51,6.62,1.81,0.17,6.83,6.62,9.72,2.48,1.15,1.8,0.17,1.52,0.05};
Подскажите как правильно это сделать?!
DiZbot вне форума Ответить с цитированием
Старый 02.06.2011, 17:50   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Попробуйте так:
Код:
sym symbols[26] =
{
   {'A', 7.96, {'\0'}, 0, 0},
   {'B', 1.6, {'\0'}, 0, 0},
   ...
};
То что вы пытались присвоить одному char'у называется выражение инициализации => его можно применять только при инициализации, а не присваивании.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 02.06.2011, 18:17   #3
DiZbot
 
Регистрация: 29.05.2011
Сообщений: 6
По умолчанию

Ух ты... интересный способ... Спасибо!)
... а я уже решил не ждать и создал отдельные массивы и через for присвоил их в структуры...

Теперь другая проблема...
Почему-то возникает ошибка сегментирования в этой функции(прошелся дебагером gdb, но он странный какой-то... подробностей не выдает, не могу найти в чем проблема):
Код:
void makeCodes(sym *root) {
		if(root->left) {
			strcpy(root->left->code,root->code);
			strcat(root->left->code,"0");
			makeCodes(root->left);
		}
		if(root->right) {
			strcpy(root->right->code,root->code);
			strcat(root->right->code,"1");
			makeCodes(root->right);
        }
}

Последний раз редактировалось DiZbot; 02.06.2011 в 18:19.
DiZbot вне форума Ответить с цитированием
Старый 02.06.2011, 18:21   #4
DiZbot
 
Регистрация: 29.05.2011
Сообщений: 6
По умолчанию

Вот весь код, чтобы нагляднее было)
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct sym {
	char ch;
	float freq;     
	char code[255];
	struct sym *left;
	struct sym *right;
} sym;
 
sym *makeTree(sym *psym[],int k) {
		int i;
		sym *temp;
		temp=(sym*)malloc(sizeof(sym));
		temp->freq=psym[k-1]->freq+psym[k-2]->freq;
		temp->code[0]=0;
		temp->left=psym[k-1];
		temp->right=psym[k-2];
		if(k==2) { return temp;
        } else {
			for(i=0;i<k;i++)
				if (temp->freq>psym[i]->freq) { 
					int j;
					for(j=k-1;j>i;j--)
					psym[j]=psym[j-1];                                                                      
					psym[i]=temp;
					break;
				}               
        }
return makeTree(psym,k-1);
}
 
void makeCodes(sym *root) {
		if(root->left) {
			strcpy(root->left->code,root->code);
			strcat(root->left->code,"0");
			makeCodes(root->left);
		}
		if(root->right) {
			strcpy(root->right->code,root->code);
			strcat(root->right->code,"1");
			makeCodes(root->right);
        }
}


int main () {
        int k=26; //кол-во символов
	int i, j = 0;
        sym simbols[26]; //инициализируем массив записей
		char ch[] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };
		float freq[] = {7.96,1.6,2.84,4.01,12.86,2.62,1.99,5.39,7.77,0.16,0.41,3.51,2.43,7.51,6.62,1.81,0.17,6.83,6.62,9.72,2.48,1.15,1.8,0.17,1.52,0.05};
	for (i=0;i<k;i++){
		simbols[i].ch=ch[i];
		simbols[i].freq=freq[i];
	}
        sym *psym[256]; //инициализируем массив указателей на записи
		sym **psum=(sym**)malloc(k*sizeof(sym*));
		for(i=0;i<k;i++) psym[i]=&simbols[i];
		sym temp;
		for(i=1;i<k;i++) {
			for(j=0;j<k-1;j++) {
				if(simbols[j].freq<simbols[j+1].freq) {
					temp=simbols[j];
					simbols[j]=simbols[j+1];
					simbols[j+1]=temp;
				}
			}
		}

for(i=0;i<k;i++) {      
        printf("Ch= %c\tFreq= %f\t\n",simbols[i].ch,simbols[i].freq);
}
		sym *root=makeTree(psym,k);//вызов функции создания дерева Хофмана
		makeCodes(root);//вызов функции получения кода
        for(i=0;i<k;i++){
            printf("%s ",simbols[i].code);
}
return 0;
}
DiZbot вне форума Ответить с цитированием
Старый 02.06.2011, 18:33   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
... а я уже решил не ждать и создал отдельные массивы и через for присвоил их в структуры...
И наделали в этом несчастном цикле ошибок.
Код:
for (i=0;i<k;i++){
		simbols[i].ch=ch[i];
		simbols[i].freq=freq[i];
		simbols[i].code[0] = '\0';
		simbols[i].left = simbols[i].right = 0;
	}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 02.06.2011, 18:53   #6
DiZbot
 
Регистрация: 29.05.2011
Сообщений: 6
По умолчанию

Syuf, точно))
Спасибо вам огромное!!!
DiZbot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код Хаффмана Evgeny139 Помощь студентам 4 11.12.2010 09:33
Код Хаффмана boomeer Помощь студентам 1 04.11.2010 11:28
Шифрование Хаффмана ZET78 Общие вопросы C/C++ 2 23.10.2010 20:02
Huffman Encoded/Compressed anel1101 Свободное общение 0 22.02.2008 07:49