#include<iostream>
#include<algorithm>
#define N 100
using namespace std;
typedef struct LNode
{
int data;
LNode* next;
}LNode, * LinkList;
LinkList InitList(LinkList& L, int n,int *a)
{
int x;
int i = 0;
L = (LinkList)malloc(sizeof(LNode));
LNode* s, * r = L;
while (i<n)
{
x = a[i];
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
i++;
}
r->next = NULL;
return L;
}
void showLink(LinkList L)
{
LNode* p = L->next;
while (p)
{
cout << p->data << ' ';
p = p->next;
}
}
void Huffman(LinkList &l)
{
LNode* p, * q;
while (l->next->next)
{
p = l->next;
q = l->next->next;
q->data = p->data + q->data;
l->next = q;
free(p);
p = q;
if (p->next)
{
if (p->data > p->next->data)
{
/*l = p->next;
p->next = NULL;*/
while (q->next)
{
if (q->next->data <= p->data)
q = q->next;
else
{
l->next = p->next;
p->next = q->next;
q->next = p;
break;
}
}
if (q->next == NULL && q->data < p->data)
{
l->next = p->next;
p->next = NULL;
q->next = p;
}
}
}
showLink(l);
cout << endl;
}
}
int main()
{
cout << "请输入权值个数:" << endl;
int n;//权值个数
cin >> n;
cout << "请输入权值:" << endl;
int a[N] = {0};//存储权值
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a+n);
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
cout << endl;
LinkList l;
InitList(l, n, a);
Huffman(l);
return 0;
}
/*
10
1 4 6 9 3 8 17 13 15 7
*/
【离散数学】实现哈夫曼树
最新推荐文章于 2023-12-07 00:22:17 发布