#2
daxiadedage2010-05-31 19:14
|
作业贴6:Huffman 编码
例程:
程序代码:
#include <iostream>
#include <string.h>
#define MAXSIZE 15
using namespace std;
typedef struct
{
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char **HuffmanCode;
void Select(HuffmanTree &HT, int n, int &s1, int &s2);
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n);
int main()
{
HuffmanTree HT;
HuffmanCode HC; //typedef char **HuffmanCode
int w[MAXSIZE]={5,29,7,8,14,23,3,11}, n=8;
/* cout << "请输入字符数目\n";
cin >> n;
cout << "请输入各字符的权值\n";
for (int i = 0; i < n; i++)
cin >> w[i];
*/
HuffmanCoding(HT, HC, w, n);
return 0;
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{
//建立哈夫曼树,求哈夫曼编码
HuffmanTree p;
char *cd;
int i, s1, s2, start;
unsigned int c, f;
if (n <= 1)
return;
int m = 2 * n - 1;
HT = (HuffmanTree) malloc((m + 1) * sizeof(HTNode));
p=HT;
for (++p, i = 1; i <= n; ++i, ++p, ++w)
{
p->weight = *w;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (; i <= m; ++i, ++p)
{
p->weight = 0;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (i = n + 1; i <= m; ++i)
{
Select(HT, i-1, s1, s2);
HT[s1].parent = i;
HT[s2].parent = i;
if(s1<s2)
{
HT[i].lchild = s1;
HT[i].rchild = s2;
}
else
{
HT[i].lchild = s2;
HT[i].rchild = s1;
}
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = (HuffmanCode) malloc((n+1) * sizeof(char *));
cd = (char *) malloc(n * sizeof(char));
cd[n-1] = '\0';
for (i = 1; i <= n; ++i)
{
start = n - 1;
for (c = i, f = HT[c].parent; f != 0; c = f, f = HT[f].parent)
if (HT[f].lchild == c)
cd[--start] = '0';
else
cd[--start] = '1';
HC[i] = (char *) malloc((n - start) * sizeof(char));
strcpy(HC[i], &cd[start]);
printf("%s\n", HC[i]);
}
free(cd);
}
void Select(HuffmanTree &HT, int n, int &s1, int &s2)
{
//选择HT[1..n]中 parent为0且weight最小的两个结点
//序号分别赋值给 s1,s2
for (int i = 1; i <= n; i++)
{
if (HT[i].parent == 0)
{
s1 = i;
break;
}
}
for (; i <= n; i++)
{
if (HT[i].weight < HT[s1].weight && HT[i].parent == 0)
s1 = i;
}
for (i=1; i <= n; i++)
{
if (HT[i].parent == 0 && i != s1)
{
s2 = i;
break;
}
}
for (; i <= n; i++)
{
if (HT[i].weight < HT[s2].weight && HT[i].parent == 0 && i != s1)
s2 = i;
}
}
#include <string.h>
#define MAXSIZE 15
using namespace std;
typedef struct
{
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char **HuffmanCode;
void Select(HuffmanTree &HT, int n, int &s1, int &s2);
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n);
int main()
{
HuffmanTree HT;
HuffmanCode HC; //typedef char **HuffmanCode
int w[MAXSIZE]={5,29,7,8,14,23,3,11}, n=8;
/* cout << "请输入字符数目\n";
cin >> n;
cout << "请输入各字符的权值\n";
for (int i = 0; i < n; i++)
cin >> w[i];
*/
HuffmanCoding(HT, HC, w, n);
return 0;
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{
//建立哈夫曼树,求哈夫曼编码
HuffmanTree p;
char *cd;
int i, s1, s2, start;
unsigned int c, f;
if (n <= 1)
return;
int m = 2 * n - 1;
HT = (HuffmanTree) malloc((m + 1) * sizeof(HTNode));
p=HT;
for (++p, i = 1; i <= n; ++i, ++p, ++w)
{
p->weight = *w;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (; i <= m; ++i, ++p)
{
p->weight = 0;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (i = n + 1; i <= m; ++i)
{
Select(HT, i-1, s1, s2);
HT[s1].parent = i;
HT[s2].parent = i;
if(s1<s2)
{
HT[i].lchild = s1;
HT[i].rchild = s2;
}
else
{
HT[i].lchild = s2;
HT[i].rchild = s1;
}
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = (HuffmanCode) malloc((n+1) * sizeof(char *));
cd = (char *) malloc(n * sizeof(char));
cd[n-1] = '\0';
for (i = 1; i <= n; ++i)
{
start = n - 1;
for (c = i, f = HT[c].parent; f != 0; c = f, f = HT[f].parent)
if (HT[f].lchild == c)
cd[--start] = '0';
else
cd[--start] = '1';
HC[i] = (char *) malloc((n - start) * sizeof(char));
strcpy(HC[i], &cd[start]);
printf("%s\n", HC[i]);
}
free(cd);
}
void Select(HuffmanTree &HT, int n, int &s1, int &s2)
{
//选择HT[1..n]中 parent为0且weight最小的两个结点
//序号分别赋值给 s1,s2
for (int i = 1; i <= n; i++)
{
if (HT[i].parent == 0)
{
s1 = i;
break;
}
}
for (; i <= n; i++)
{
if (HT[i].weight < HT[s1].weight && HT[i].parent == 0)
s1 = i;
}
for (i=1; i <= n; i++)
{
if (HT[i].parent == 0 && i != s1)
{
s2 = i;
break;
}
}
for (; i <= n; i++)
{
if (HT[i].weight < HT[s2].weight && HT[i].parent == 0 && i != s1)
s2 = i;
}
}
作业贴7:二叉树的操作,创建、各种遍历
例程:
程序代码:
/*测试用例:A B C # # D E # G # # F # # #*/
#include <iostream>
#include<string>
using namespace std;
template <class T>
struct BiNode
{
T data;
BiNode<T> *lchild, *rchild;
};
template <class T>
class BiTree
{
public:
BiTree(){ } // 构造函数 重载后,就取消默认构造函数
BiTree(BiNode<T>*root);
~BiTree();
BiNode<T>* Getroot();
void PreOrder(BiNode<T>*root);
void NpreOrder(BiNode<T>*root);
void InOrder(BiNode<T>*root);
void PostOrder(BiNode<T>*root);
void LevelOrder(BiNode<T>*root);
private:
BiNode<T> *root;
BiNode<T>* Creat(BiNode<T>*root);
void Release(BiNode<T>*root);
};
template<class T> //构造树
BiTree<T>::BiTree(BiNode<T>*root)
{
cout<<"请输入创建一棵二叉树的结点数据"<<endl;
this->root=Creat(root);
}
template <class T>
BiNode<T>* BiTree<T>::Creat(BiNode<T>*root)
{
T ch;
cin>>ch;
if(ch=="#")
root=NULL;
else{
root=new BiNode<T>;
root->data=ch;
root->lchild=Creat(root->lchild);
root->rchild=Creat(root->rchild);
}
return root;
}
template<class T>
void BiTree<T>::Release(BiNode<T>*root)
{
if(root!=NULL){
Release(root->lchild);
Release(root->rchild);
delete root;
}
}
template <class T> //析构树
BiTree<T>::~BiTree()
{
Release(root);
}
template<class T> //得到树顶
BiNode<T>* BiTree<T>::Getroot( )
{
return root;
}
//树的遍历算法
template <class T> //前序递归算法
void BiTree<T>::PreOrder(BiNode<T>*root)
{
if(root==NULL) return;
else{
cout<<root->data;
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
/*
template <class T> //前序非递归算法 程序有语法错误,自己改正吧
void BiTree<T>::NpreOrder(BiNode<T>*root)
{
top=-1;
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{
cout<<root->data;
s[++top]=root;
root=root->lchild;
}
if(top!=-1){
root=s[top--];
root=root->rchild;
}
}
}
*/
template<class T> //中序递归算法
void BiTree<T>::InOrder(BiNode<T>*root)
{
if(root==NULL) return;
else{
InOrder(root->lchild);
cout<<root->data;
InOrder(root->rchild);
}
}
template <class T> //后序递归算法
void BiTree<T>::PostOrder(BiNode<T>*root)
{
if(root==NULL) return;
else{
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data;
}
}
template<class T> //层序遍历算法
void BiTree<T>::LevelOrder(BiNode<T>*root)
{
const int MaxSize = 100;
int front;
int rear;
BiNode<T> *q;
BiNode<T> *Q[MaxSize];
front=rear=0;
if(root==NULL) return;
Q[++rear]=root;
while(front!=rear)
{
q=Q[++front];
cout<<q->data;
if(q->lchild!=NULL) Q[++rear]=q->lchild;
if(q->rchild!=NULL) Q[++rear]=q->rchild;
}
}
int main()
{
BiTree<string> tree(NULL);
BiNode<string>* root = tree.Getroot( );
cout<<"------前序遍历------ "<<endl;
tree.PreOrder(root);
cout<<endl;
cout<<"------前序非递归遍历------ "<<endl;
// tree.NpreOrder(root);
cout<<"------中序遍历------ "<<endl;
tree.InOrder(root);
cout<<endl;
cout<<"------后序遍历------ "<<endl;
tree.PostOrder(root);
cout<<endl;
cout<<"------层序遍历------ "<<endl;
tree.LevelOrder(root);
cout<<endl;
return 0;
}
#include <iostream>
#include<string>
using namespace std;
template <class T>
struct BiNode
{
T data;
BiNode<T> *lchild, *rchild;
};
template <class T>
class BiTree
{
public:
BiTree(){ } // 构造函数 重载后,就取消默认构造函数
BiTree(BiNode<T>*root);
~BiTree();
BiNode<T>* Getroot();
void PreOrder(BiNode<T>*root);
void NpreOrder(BiNode<T>*root);
void InOrder(BiNode<T>*root);
void PostOrder(BiNode<T>*root);
void LevelOrder(BiNode<T>*root);
private:
BiNode<T> *root;
BiNode<T>* Creat(BiNode<T>*root);
void Release(BiNode<T>*root);
};
template<class T> //构造树
BiTree<T>::BiTree(BiNode<T>*root)
{
cout<<"请输入创建一棵二叉树的结点数据"<<endl;
this->root=Creat(root);
}
template <class T>
BiNode<T>* BiTree<T>::Creat(BiNode<T>*root)
{
T ch;
cin>>ch;
if(ch=="#")
root=NULL;
else{
root=new BiNode<T>;
root->data=ch;
root->lchild=Creat(root->lchild);
root->rchild=Creat(root->rchild);
}
return root;
}
template<class T>
void BiTree<T>::Release(BiNode<T>*root)
{
if(root!=NULL){
Release(root->lchild);
Release(root->rchild);
delete root;
}
}
template <class T> //析构树
BiTree<T>::~BiTree()
{
Release(root);
}
template<class T> //得到树顶
BiNode<T>* BiTree<T>::Getroot( )
{
return root;
}
//树的遍历算法
template <class T> //前序递归算法
void BiTree<T>::PreOrder(BiNode<T>*root)
{
if(root==NULL) return;
else{
cout<<root->data;
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
/*
template <class T> //前序非递归算法 程序有语法错误,自己改正吧
void BiTree<T>::NpreOrder(BiNode<T>*root)
{
top=-1;
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{
cout<<root->data;
s[++top]=root;
root=root->lchild;
}
if(top!=-1){
root=s[top--];
root=root->rchild;
}
}
}
*/
template<class T> //中序递归算法
void BiTree<T>::InOrder(BiNode<T>*root)
{
if(root==NULL) return;
else{
InOrder(root->lchild);
cout<<root->data;
InOrder(root->rchild);
}
}
template <class T> //后序递归算法
void BiTree<T>::PostOrder(BiNode<T>*root)
{
if(root==NULL) return;
else{
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data;
}
}
template<class T> //层序遍历算法
void BiTree<T>::LevelOrder(BiNode<T>*root)
{
const int MaxSize = 100;
int front;
int rear;
BiNode<T> *q;
BiNode<T> *Q[MaxSize];
front=rear=0;
if(root==NULL) return;
Q[++rear]=root;
while(front!=rear)
{
q=Q[++front];
cout<<q->data;
if(q->lchild!=NULL) Q[++rear]=q->lchild;
if(q->rchild!=NULL) Q[++rear]=q->rchild;
}
}
int main()
{
BiTree<string> tree(NULL);
BiNode<string>* root = tree.Getroot( );
cout<<"------前序遍历------ "<<endl;
tree.PreOrder(root);
cout<<endl;
cout<<"------前序非递归遍历------ "<<endl;
// tree.NpreOrder(root);
cout<<"------中序遍历------ "<<endl;
tree.InOrder(root);
cout<<endl;
cout<<"------后序遍历------ "<<endl;
tree.PostOrder(root);
cout<<endl;
cout<<"------层序遍历------ "<<endl;
tree.LevelOrder(root);
cout<<endl;
return 0;
}
作业贴8:[问题描述]设有n个人围坐一圈,现从某个人开始报数,数到m的人出列,接着从下一个人开始重新开始报数, 数到m的人又出列,如次下去,直到所有的人都出列为止。试设计确定他们出列的顺序的程序
1)在顺序存储结构上实现以上过程。
2)在循环链表上实现以上过程。
例程:
程序代码:
#include <stdio.h>
int main(void)
{
int n, m, i, s=0;
printf ("N M = "); scanf("%d%d", &n, &m);
for (i=2; i<=n; i++) s=(s+m)%i;
printf ("The winner is %d\n", s+1);
}
//方法二 循环链表
#include <stdio.h>
#include <stdlib.h>
typedef struct list
{
int num ;
struct list *next ;
}LIST ;
int main(void)
{
LIST *head=NULL,*pre=NULL,*post=NULL, *start=NULL, *temp=NULL;
long i, m, n, x;
printf("n=");
scanf("%ld",&n);
printf("\nm=");
scanf("%ld",&m) ;
printf("\n");
if( n <= 1)
{
printf("1 ");
return 0;
}
/**//*建立循环链表*/
pre = (LIST *)malloc(sizeof(LIST));
pre->num = 1 ;
pre->next = NULL ;
head = pre ;
post = pre ;
for(i=2 ; i<= n; i++)
{
pre = (LIST *)malloc(sizeof(LIST));
pre->num = i;
pre->next= NULL ;
post->next=pre ;
post = pre ;
}
post -> next = head ; /**//*将最后一个结点的指向头,这样就构成了循不链表*/
pre= head ;
i--;
while(i>0)
{
printf(" %d ",pre->num);
pre=pre->next;
i--;
}
printf("\n");
printf("\n从第几个人开始:");
scanf("%d",&x);
int count=n;
while(count>0)
{
if(head->num==x)
{
pre=post;
start=head;
break;
}
if(pre->next->num==x)
{
start=pre->next;
break;
}
pre=pre->next;
count--;
}
if(count==0)
{
printf("\n 开始人错误\n");
system("pause");
exit(1);
}
while (start->next != start)
{
for(i=1; i < m ; i++)
{
pre = start ;
start = start->next;
}
temp=start;
start=start->next;
pre->next=start;
delete temp;
}
printf("last=%d \n",pre->num);
return 0 ;
}
int main(void)
{
int n, m, i, s=0;
printf ("N M = "); scanf("%d%d", &n, &m);
for (i=2; i<=n; i++) s=(s+m)%i;
printf ("The winner is %d\n", s+1);
}
//方法二 循环链表
#include <stdio.h>
#include <stdlib.h>
typedef struct list
{
int num ;
struct list *next ;
}LIST ;
int main(void)
{
LIST *head=NULL,*pre=NULL,*post=NULL, *start=NULL, *temp=NULL;
long i, m, n, x;
printf("n=");
scanf("%ld",&n);
printf("\nm=");
scanf("%ld",&m) ;
printf("\n");
if( n <= 1)
{
printf("1 ");
return 0;
}
/**//*建立循环链表*/
pre = (LIST *)malloc(sizeof(LIST));
pre->num = 1 ;
pre->next = NULL ;
head = pre ;
post = pre ;
for(i=2 ; i<= n; i++)
{
pre = (LIST *)malloc(sizeof(LIST));
pre->num = i;
pre->next= NULL ;
post->next=pre ;
post = pre ;
}
post -> next = head ; /**//*将最后一个结点的指向头,这样就构成了循不链表*/
pre= head ;
i--;
while(i>0)
{
printf(" %d ",pre->num);
pre=pre->next;
i--;
}
printf("\n");
printf("\n从第几个人开始:");
scanf("%d",&x);
int count=n;
while(count>0)
{
if(head->num==x)
{
pre=post;
start=head;
break;
}
if(pre->next->num==x)
{
start=pre->next;
break;
}
pre=pre->next;
count--;
}
if(count==0)
{
printf("\n 开始人错误\n");
system("pause");
exit(1);
}
while (start->next != start)
{
for(i=1; i < m ; i++)
{
pre = start ;
start = start->next;
}
temp=start;
start=start->next;
pre->next=start;
delete temp;
}
printf("last=%d \n",pre->num);
return 0 ;
}
作业贴9:链表的插入排序
例程:
程序代码:
#include <iostream>
using namespace std;
struct list
{
int coef; //ϵÊý
int exp; //Ö¸Êý
list *next;
};
int main()
{
struct list *head=new struct list;
head->coef = 0;
head->exp=0;
head->next=NULL;
struct list *p=new struct list;
p->coef=5;
p->exp=2;
p->next=NULL;
head->next=p;
p=new struct list;
p->coef=2;
p->exp=1;
p->next=NULL;
head->next->next=p;
p=new struct list;
p->coef=3;
p->exp=3;
p->next=NULL;
head->next->next->next=p;
struct list *temp, *cur, *pre, *preindex, *curindex;
for(pre=head->next, cur=head->next->next; cur !=NULL; pre=cur, cur=cur->next)
{
preindex=head;
curindex=head->next;
while (curindex != cur )
{
if (curindex->exp > cur->exp)
{
temp=cur;
cur=cur->next;
pre->next=cur;
temp->next=curindex;
preindex->next=temp;
break;
}
preindex=curindex;
curindex=curindex->next;
}
}
return 0;
}
using namespace std;
struct list
{
int coef; //ϵÊý
int exp; //Ö¸Êý
list *next;
};
int main()
{
struct list *head=new struct list;
head->coef = 0;
head->exp=0;
head->next=NULL;
struct list *p=new struct list;
p->coef=5;
p->exp=2;
p->next=NULL;
head->next=p;
p=new struct list;
p->coef=2;
p->exp=1;
p->next=NULL;
head->next->next=p;
p=new struct list;
p->coef=3;
p->exp=3;
p->next=NULL;
head->next->next->next=p;
struct list *temp, *cur, *pre, *preindex, *curindex;
for(pre=head->next, cur=head->next->next; cur !=NULL; pre=cur, cur=cur->next)
{
preindex=head;
curindex=head->next;
while (curindex != cur )
{
if (curindex->exp > cur->exp)
{
temp=cur;
cur=cur->next;
pre->next=cur;
temp->next=curindex;
preindex->next=temp;
break;
}
preindex=curindex;
curindex=curindex->next;
}
}
return 0;
}
[ 本帖最后由 hzh512 于 2010-5-25 13:37 编辑 ]