zoukankan      html  css  js  c++  java
  • 北邮机试——huffman权值问题

    我的Online Judge账号还没有这道题的访问权限(1172),这让我情何以堪,好在还是找到了题目,题目想做的比较好还是需要一些功底的。

    做一下,马上就复试了,注释也没时间写,代码能看清楚:

      1 /*
      2  * author: xuangong
      3  * time: 2013-4-9 21:42
      4  */
      5 #include <stdio.h>
      6 #include <stdlib.h>
      7 
      8 typedef struct _huffmannode
      9 {
     10     int data;
     11     struct _huffmannode *lchild;
     12     struct _huffmannode *rchild;
     13 }huffmannode, *phuffmannode;
     14 
     15 typedef struct _list
     16 {
     17     phuffmannode node;
     18     struct _list * next;
     19 }list, *plist;
     20 
     21 plist init_list()
     22 {
     23     plist head = (plist)malloc(sizeof(struct _list));
     24     head->next = head->node = NULL;
     25     return head;
     26 }
     27 
     28 void add_list(plist head, phuffmannode node)
     29 {
     30     plist insert = (plist)malloc(sizeof(struct _list));
     31     insert->node = node;
     32     insert->next = NULL;
     33     if(head==NULL)
     34         printf("head is null\n");
     35     if(head!=NULL)
     36     {
     37         plist pre = head;
     38         head = head->next;
     39         while(head!=NULL && node->data > head->node->data)
     40         {
     41             pre = head;
     42             head = head->next;
     43         }
     44         insert->next = pre->next;
     45         pre->next = insert;
     46     }
     47 }
     48 
     49 void display(plist head)
     50 {
     51     head = head->next;
     52     while(head!=NULL)
     53     {
     54         printf("%d ", head->node->data);
     55         head = head->next;
     56     }
     57     printf("\n");
     58 }
     59 
     60 phuffmannode get_list(plist head)
     61 {
     62     plist temp = head->next;
     63     phuffmannode top = head->next->node;
     64     head->next = head->next->next;
     65     free(temp);
     66     return top;
     67 }
     68 
     69 phuffmannode create_huffmannode(plist li)
     70 {
     71     phuffmannode lchild, rchild, node;
     72     if(li->next!=NULL && li->next->next == NULL)
     73         return get_list(li);
     74     while(li->next!=NULL && li->next->next!=NULL)
     75     {
     76         lchild = get_list(li);
     77         rchild = get_list(li);
     78         node = (phuffmannode)malloc(sizeof(struct _huffmannode));
     79         node->data = lchild->data + rchild->data;
     80         node->lchild  = lchild;
     81         node->rchild = rchild;
     82         add_list(li, node);
     83     }
     84     return get_list(li);
     85 }
     86 
     87 int traversetree(phuffmannode root, int level)
     88 {
     89     if(root==NULL)
     90         return 0;
     91     if(root->lchild==NULL && root->rchild==NULL)
     92         return root->data*level;
     93     return traversetree(root->lchild ,level+1) + traversetree(root->rchild, level+1);
     94 }
     95 
     96 void destorytree(phuffmannode root)
     97 {
     98     if(root==NULL)
     99         return;
    100     if(root->lchild==NULL && root->rchild==NULL)
    101     {
    102         free(root);
    103         root = NULL;
    104         return;
    105     }
    106     destorytree(root->lchild);
    107     destorytree(root->rchild);
    108 }
    109 
    110 int main()
    111 {
    112     int count, i, data, level;
    113     phuffmannode node;
    114     level = 0;
    115     plist head = init_list();
    116     while(scanf("%d", &count)!=EOF)
    117     {
    118         for(i=0;i<count;i++)
    119         {
    120             scanf("%d", &data);
    121             node = (phuffmannode)malloc(sizeof(struct _huffmannode));
    122             node->data = data;
    123             node->lchild = node->rchild = NULL;
    124             add_list(head, node);
    125         }
    126         phuffmannode root = create_huffmannode(head);
    127         printf("This huffman tree is value is:%d\n", traversetree(root, level));
    128         destorytree(root);
    129     }
    130     return 0;
    131 }

     上面是链表建树的办法,如果不建树,不用链表,仅仅为了完成这道题,今天看的方法真是帅呆了!

    View Code
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int val[1001];
     5 
     6 int cmp(const void * a,const void * b) //when the result is true "a>b" , a is after b
     7 {
     8     return *(int *)a - *(int *)b;
     9 }
    10 
    11 int main()
    12 {
    13     int n;
    14     int i;
    15     int ans;
    16     while(scanf("%d",&n) != EOF)
    17     {
    18         ans = 0;
    19         for(i = 0;i < n;i++) 
    20             scanf("%d",&val[i]);
    21         for(i = 1;i < n;i++)
    22         {
    23             qsort(&val[i - 1], n - i + 1, sizeof(val[0]), cmp);
    24             ans += val[i - 1] + val[i];
    25             val[i] += val[i - 1];
    26         }
    27         printf("%d\n",ans);
    28     }
    29     return 0;
    30 }
  • 相关阅读:
    Atitit. C#.net clr 2.0 4.0 4.5新特性 v2 s22 1. CLR内部结构 1 2. CLR 版本发展史 3 3. CLR 2.0新特性 4 4. CLR 4 新特性
    Hbase基本命令 悟寰轩
    mvn常用命令 悟寰轩
    linux添加tomcat服务 悟寰轩
    hadoop基本命令 悟寰轩
    Tomcat启动 悟寰轩
    Eclipse自动部署项目到Tomcat的webapps下的有效方法 悟寰轩
    MySQL改变默认编码为utf8 悟寰轩
    myeclipse关闭自动更新 悟寰轩
    Linux命令大全 悟寰轩
  • 原文地址:https://www.cnblogs.com/xuangong/p/3011205.html
Copyright © 2011-2022 走看看