软件技术基础实验课代码
二.哈夫曼编码以及二叉树的遍历
哈夫曼编码
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# define n 6
# define m 2*n-1
# define Maxval 1
typedef char datatype;
typedef struct
{
float weight;
datatype data;
int lchild, rchild, parent;
} hufmtree;
hufmtree tree[m];
typedef struct
{
char bits[n];
int start;
datatype data;
} codetype;
codetype code[n];
HUFFMAN(hufmtree tree[])
{
int i, j, p1, p2;
char ch;
float small1, small2, f;
for (i = 0; i < m; i++)
{
tree[i].parent = 0;
tree[i].lchild = 0;
tree[i].rchild = 0;
tree[i].weight = 0.0;
tree[i].data = '0';
}
for (i = 0; i < n; i++)
{
// scanf("%f ",&f);
scanf("%f",&f);
getchar();
tree[i].weight = f;
scanf("%c",&ch);
tree[i].data = ch;
}
for (i = n; i < m; i++)
{
p1 = p2 = 0;
small1 = small2 = Maxval;
for (j = 0; j <=i - 1; j++)
if (tree[j].parent == 0)
if (tree[j].weight < small1)
{
small2 = small1;
small1 = tree[j].weight;
p2 = p1;
p1 = j;
}
else if (tree[j].weight < small2)
{
small2 = tree[j].weight;
p2 = j;
}
tree[p1].parent = i;
tree[p2].parent = i;
tree[i].lchild = p1;
tree[i].rchild = p2;
tree[i].weight = tree[p1].weight + tree[p2].weight;
}
}
HUFFMANCODE(codetype code[], hufmtree tree[])
{
int i, c, p, k;
codetype cd;
for (i = 0; i < n; i++)
{
cd.start = n;
c = i;
p = tree[c].parent;
cd.data = tree[c].data;
while (p != 0)
{
cd.start--;
if (tree[p].lchild == c)
cd.bits[cd.start] = '0';
else cd.bits[cd.start] = '1';
c = p;
p = tree[c].parent;
}
code[i] = cd;
printf("%c:", cd.data);
for (k = cd.start; k < n; k++)
printf("%c", cd.bits[k]);
printf("\n");
}
}
HUFFMANDECODE(codetype code[ ], hufmtree tree[ ])
{
int i, c, p, b;
int endflag = 2;
i = m - 1;
scanf("%1d", &b);
while (b != endflag)
{
if (b == 0)i = tree[i].lchild;
else i = tree[i].rchild;
if (tree[i].rchild == 0)
{
putchar(code[i].data);
i = m - 1;
}
scanf("%1d", &b);
}
if ((tree[i].lchild != 0) && (i != m - 1))
printf("\nERROR\n");
}
void main()
{
printf("输出结点的权值和结点字母,用空格隔开;\n");
HUFFMAN(tree);
printf("\n编码结果\n");
HUFFMANCODE(code, tree);
printf("\n开始译码,请输入密码;\n");
HUFFMANDECODE(code, tree);
printf("\n");
}
二叉树的遍历
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxsize 1024
typedef char datatype;
typedef struct node
{
datatype data;
struct node *lchild, *rchild;
} bitree;
bitree *CREATTREE()
{
char ch;
bitree *Q[maxsize];
int front, rear;
bitree *root, *s;
root = NULL;
front = 1, rear = 0;
printf("请输入二叉树的各节点,@表示虚结点,#表示结束:\n");
scanf("%c",&ch);
while(ch != '#')
{
putchar(ch);
s = NULL;
if( ch != '@')
{
s = (bitree* )malloc(sizeof(bitree));
s->data = ch;
s->lchild = NULL;
s->rchild = NULL;
}
rear++;
Q[rear] = s;
if(rear == 1)
root = s;
else
{
if(s && Q[front])
if(rear % 2 == 0)
Q[front]->lchild = s;
else
Q[front]->rchild = s;
if(rear %2 == 1)
front++;
}
scanf("%c",&ch);
}
return root;
}
void preorder(bitree *p)
{
if(p!=NULL)
{
printf("%c ",p->data);
preorder(p->lchild);
preorder(p->rchild);
}
return ;
}
void inorder(bitree *p)
{
if(p!=NULL)
{
inorder(p->lchild);
printf("%c ",p->data);
inorder(p->rchild);
}
return ;
}
void postorder(bitree *p)
{
if(p != NULL)
{
postorder(p->lchild);
postorder(p->rchild);
printf("%c ",p->data);
}
return ;
}
int main()
{
bitree *root;
root = CREATTREE();
printf("\n先序遍历如下:\n");
preorder(root);
printf("\n中序遍历如下:\n");
inorder(root);
printf("\n后序遍历如下:\n");
postorder(root);
return 0;
}