gpt4 book ai didi

c - 使用树在C中进行霍夫曼解码

转载 作者:行者123 更新时间:2023-11-30 17:33:17 24 4
gpt4 key购买 nike

我必须解压缩一个用霍夫曼树编码的字符串,但代码的长度是可变的,并且并非所有输入都在前缀中,在这种情况下,我应该打印“invalid”并完成执行。输入包括:不同字符的数量;字符及其代码;编码消息的长度;编码消息。

如果可以的话,我会问一个更具体的问题,但我真的不知道出了什么问题,因为我觉得一切都错了。

示例输入为: 6 电子11 米101 × 100 升011 第 010 页 Ø 00 18 111001110101001100

它的输出将是: “范例”

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct node_t
{
struct node_t *left, *right;
char* codigo;
unsigned char c;
} *node;

void decode(const char *s, node t)
{
node q = t;
while (*s)
{
if (*s++ == '0') q = q->left;
else q = q->right;

if (q->c) putchar(q->c), q = t;
}
putchar('\n');
}

struct node_t *insere(struct node_t *root, char x, char* h, int a)
{
if(!root)
{
root=(struct node_t*)malloc(sizeof(struct node_t));
root->c = x;
root->codigo=h;
root->left = NULL;
root->right = NULL;
return(root);
}
else
{
if(h[a]=='0')
{
if(root->left!=NULL)
{
printf("invalid\n");
exit(0);
}
root->left = insere(root->left,x, h, a+1);
}
else
{
if(h[a]=='1')
{
if(root->left!=NULL)
{
printf("invalid\n");
exit(0);
}
root->right = insere(root->right,x, h, a+1);
}
}
}
return(root);
}

void inorder(struct node_t *root)

{
if(root != NULL)
{
inorder(root->left);
free(root);
inorder(root->right);
}
return;
}

int main(void)
{
struct node_t *root;
root = NULL;
int i, N, M, k;
scanf("%d", &N);
char item, num[2*N];
for (i = 0; i < N; i++)
{
scanf("%c %s\n", &item, num);
root= insere(root, item, num, 0);
}
scanf("%d\n", &M);
char buf[M];
for (k=0; k<M; k++)
scanf ("%c", &buf[k]);
decode (buf, root);
inorder(root);
return 0;
}

最佳答案

#include <stdio.h>
#include <stdlib.h>

typedef struct node_t {
struct node_t *left, *right;
char codigo;
char ch;
} *node;

char decode_aux(const char **s, node np){
if(!np){
fprintf(stderr, "invalid\n");
exit(0);
}
if(np->ch)
return np->ch;
if(**s=='\0')
return '\0';

if(*(*s)++ =='0')
return decode_aux(s, np->left);
else //if(**s=='1')
return decode_aux(s, np->right);
}

void decode(char *out, const char *s, node root){
const char *p = s;
while(*out++ = decode_aux(&p, root))
;
}

void insere(node *np, char ch, char *code){
if(!*np){
*np = malloc(sizeof(**np));
(*np)->left = (*np)->right = NULL;
(*np)->codigo = *code;
(*np)->ch = 0;
}
if(*++code == '\0')
(*np)->ch = ch;
else if(*code == '0')
insere(&(*np)->left, ch, code);
else // if(*code == '1')
insere(&(*np)->right, ch, code);
}

void inorder(node root){
if(root != NULL){
inorder(root->left);
inorder(root->right);
free(root);
}
return;
}

int main(void){
node root = calloc(1, sizeof(*root));
int i, N, M;
scanf("%d", &N);
char item, num[2*N+1];
num[0] = ' ';//dummy for root
for (i = 0; i < N; i++){
scanf(" %c %s", &item, num+1);
insere(&root, item, num);
}
scanf("%d", &M);
char buf[M+1], out[M];
scanf("%s", buf);
decode(out, buf, root);
printf("%s\n", out);
inorder(root);
return 0;
}

#if 0
root (root is special node)
/ \
0 1
/ \ / \
0 1 0 1
(o) / \ / \ (e)
0 1 0 1
(p) (l) (x) (m)
#endif

关于c - 使用树在C中进行霍夫曼解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com