while(!fopen(fp)) {
cjs=0; //一个字符的编码是否读结束 for(i=0;i cd[i]=’ ’; cd[i+1]=’\\0’; //初始化cd串 cd[i]=fgetc(fp); for(j=1;j<=num;j++) if(strcmp(HC[j].bits,cd)==0) { str[k]=HC[j].ch; k++; cjs=1; break; } } } str[k]=’\\0’; p=str; return p; } 主程序存放在(实验6_2_1.c) #include #include “shiyan6_2_1.h” #include “shiyan 6_2_2.h” void main() { char st[254],*s,str[27]; int cn[27]; HuffmanTree HT; HuffmanCode HC printf(“输入电文(均为大写字母):\\n”); gets(st); num=jsp(st,cn,str); 21 ChuffmanTree(HT,HC,cn,str); HuffmanEncoding(HT,hc); coding(HC,st); s=decode(HC); printf(“译码后的字符串:\\n”); printf(“%s\\n”,s); } 6.5思考题: (1)若以中序序列该如何建立一棵二叉树?(实验1) (2)如何实现二叉树中序遍历的非递归形式? (实验2) 中序遍历非递归算法之一 Status InOrderTraverse(BiTree T, Status (* Visit)(TElemType e)) { InitStack(S); Push(S,T); //根指针进栈 While (!StackEmpty(S)) { While (GetTop(S,p) && p) Push(S,p->lchild); //向左走到尽头 Pop(S,p); //空指针退栈 If (!StackEmpty(S)) { //访问结点,向右一步 Pop(S,p); If (!Visit(p->data)) return ERROR; Push(S,p->rchild); }//if }//while return OK; }//InOrderTraverse 中序遍历非递归算法之二 Status InOrderTraverse(BiTree T, Status (* Visit)(TElemType e)) { //采用二叉链表存储结构,Visit是对数据元素操作的应用函数。 //中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit。 InitStack(S); p=T; While (p‖!StackEmpty(S)) {if (p) {Push(S,p); p=p->lchild;} //根指针进栈,遍历左子树 else { //根指针退栈,访问根结点,遍历右子树 Pop(S,p); if (!Visit(p->data)) return ERROR; p=p->rchild}; }//else }//while return OK; }//InOrderTraverse (3)如何统计一棵二叉树的结点的个数?(实验3) 22 (4)如何求一棵二叉树的宽度?(实验4) (5)在主程序中编写一个简单的菜单,将上述实验整合成一个实验,通过键盘读入数字选择完成不同的内容。(实验5) (6)考虑不采用递归算法如何进行二叉树的线索化。(实验6) 23