1. 程式人生 > >用連結串列的方式構建哈夫曼樹

用連結串列的方式構建哈夫曼樹

#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define MAXSIZE 30

typedef struct node {     int data;     struct node *lchild, *rchild;     struct node *next; }*TreeLink,Link;

TreeLink CreateTree(int n) {     TreeLink link = NULL, p = NULL, q = NULL, s = NULL;     int i;     link = (TreeLink)malloc(sizeof(Link));     link->lchild = link->lchild = link->next = NULL;     s= (TreeLink)malloc(sizeof(Link));     cout << "請輸入葉子的權值" << endl;     cin >> s->data;     s->lchild = s->rchild = s->next = NULL;     link->next = s;     for (i = 2; i <= n; i++)     {         s= (TreeLink)malloc(sizeof(Link));         cout << "請輸入葉子的權值" << endl;         cin >> s->data;         s->lchild = s->rchild = s->next = NULL;         q = link;         p = q->next;         while (p != NULL)         {             if (s->data < p->data)             {                 s->next = p;                 q->next = s;                 break;             }             else             {                 q = p;                 p = p->next;             }         }         if (p == NULL)         {             q->next = s;

        }     }     return link; }

void Print(TreeLink h) {     TreeLink p = h->next;     while (p != NULL)     {         cout << "權值為:" <<p->data<<endl;         p = p->next;     }     printf("\n"); }

TreeLink HuffTree(TreeLink link) {     TreeLink p = NULL, q = NULL, s = NULL;     while (link->next != NULL)     {         p = link->next;         q = p->next;         if (q->next != NULL)             link->next = q->next;         else         {             link->next = NULL;         }         s= (TreeLink)malloc(sizeof(Link));         s->data = p->data + q->data;         cout << "s->data" << s->data << endl;         s->next = NULL;         s->lchild = p;         s->rchild = q;         q = link;         p = q->next;         while (p != NULL)         {             if (s->data <= p->data)             {                 q->next = s;                 s->next = p;                 break;             }             else             {                 q = p;                 p = p->next;

            }             if (q != NULL && s->data > q->data)             {                 q->next = s;                 s->next = p;             }         }              }     return s; }

void PreOrder(TreeLink head) {     if (head)     {         cout << head->data << endl;         PreOrder(head->lchild);         PreOrder(head->rchild);     } }

int main() {     int n;     cout << "請輸入結點的個數" << endl;     cin >> n;     TreeLink head = CreateTree(n),s=NULL;     Print(head);     cout << "HuffmanTree" << endl;     s = HuffTree(head);     PreOrder(s);     return 0; }