回 帖 发 新 帖 刷新版面

主题:大家把自己学数据结构时编写的源程序发上来,一起学习学习

RT。
以下是我的一些源程序:[em2][em2][em2]
(1)合并两个循环链表:
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct Lnode)
typedef struct Lnode{
    int data;
    struct Lnode *next;
}*linklist;
struct Lnode *creat(int n)//创建循环链表
{
    struct Lnode *p,*head;
    int i;
    printf("请输入链表的数值(按从大到小的顺序输入):\n");
    head=(struct Lnode * )malloc(LEN);
    head->next=head;
    for(i=n;i>0;i--)    
    {
        p=(struct Lnode * )malloc(LEN);
        scanf("%d",&p->data);
        p->next=head->next;head->next=p;
    }
    return(head);
}
struct Lnode *combine_list(Lnode *list1,Lnode *list2)//合并链表
{
    struct Lnode *p1,*p2,*p3,*L;
    p1=list1->next;
    p2=list2->next;
    L=p3=list1;
    while(p1!=list1&&p2!=list2)
    {
        if(p1->data<=p2->data)
        {
            p3->next=p1;p1=p1->next;
        }
        else
        {
            p3->next=p2;p2=p2->next;
        }
        p3=p3->next;
    }
    if(p1!=list1)
    {
        p3->next=p1;
        p3=p3->next;
        while(p3->next!=list1)p3=p3->next;
    }
    else if(p2!=list2)
    {
        p3->next=p2;
        p3=p3->next;
        while(p3->next!=list2)p3=p3->next;
    }
    p3->next=L;
    return(L);
}

void main()
{
    int i,j;
    struct Lnode *List1,*List2,*List3,*p;
    printf("请输入链表1的数值个数:\n");
    scanf("%d",&i);
    List1=creat(i);
    printf("请输入链表2的数值个数:\n");
    scanf("%d",&j);
    List2=creat(j);
    List3=combine_list(List1,List2);
    p=List3;
    printf("输出结果:\n");
    do
    {
        p=p->next;    
        printf("%d\n",p->data);
    }
    while(p->next!=List3);
}
(2)赫夫曼树的编码与译码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
    unsigned int weight;
    unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;

typedef char **HuffmanCode;

void Select(HuffmanTree HT,int n,int s[2])
{
    int i,j,t;
    for(i=1;i<=n;i++)if(HT[i].parent==0){s[0]=i;break;}
    for(j=i+1;j<=n;j++)if(HT[j].parent==0){s[1]=j;break;}
    for(i=1;i<=n;i++)if(HT[i].weight<HT[s[0]].weight&&HT[i].parent==0&&s[1]!=i)s[0]=i;
    for(j=1;j<=n;j++)if(HT[j].weight<HT[s[1]].weight&&HT[j].parent==0&&s[0]!=j)s[1]=j;
    if(s[0]>s[1])
    {
        t=s[0];
        s[0]=s[1];
        s[1]=t;
    }
}



void HuffmanDecoding(int n)//输入字符的权值,创建赫夫曼树,并编码,译码
{
    HuffmanTree HT;
    HuffmanCode HC;
    int m,s[2],i;
    m=2*n-1;
    int start;
    int f,c;
    char d='A';
    char ch='A';
    char ce;
    printf("输入从“空格”,“A”,“B”,“C”一直到“Z”的权值(按顺序输入):\n");             //输入字符的权值
    //创建赫夫曼树
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));                                              
    for(i=1;i<=n;i++)
    {
        scanf("%d",&HT[i].weight);HT[i].lchild=0;HT[i].parent=0;HT[i].rchild=0;
    }
    for(;i<=m;i++) {HT[i].lchild=0;HT[i].parent=0;HT[i].rchild=0;HT[i].weight=0;}
    for(i=n+1;i<=m;i++)
    {
        Select(HT,i-1,s);
        HT[s[0]].parent=i;HT[s[1]].parent=i;
        HT[i].lchild=s[0];HT[i].rchild=s[1];
        HT[i].weight=HT[s[0]].weight+HT[s[1]].weight;
    }
    printf("      i weight parent lchild rchild \n");
    for(i=1;i<=m;i++)
        printf("%7d%7d%7d%7d%7d\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);    
    //使用创建的赫夫曼树编码
    char *cd=(char *)malloc(n*sizeof(char));;                                                     
    HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
    cd[n-1]='\0';
    for(i=1;i<=n;i++)
    {
        start=n-1;
        c=i;
        f=HT[i].parent; 
        while(f!=0)
        {
            if(HT[f].lchild==c)cd[start-1]='0';
            else cd[start-1]='1';
            start--;
            c=f;
            f=HT[f].parent;
        }
        HC[i]=(char * )malloc((n-start)*sizeof(char));
        strcpy(HC[i],&cd[start]);
    }
    free(cd);
    //输出编码结果
    for(i=1;i<=n;i++)                                                                           
    {
        if(i==1)printf("空格:%s\n",HC[1]);
        else
        {
            printf("%c:",d+i-2);
            printf("%s\n",HC[i]);
        }
    }
    //输入码串并翻译
    printf("请输入你所要翻译的码串:\n");
    i=2*n-1;
    for(ce=getchar();ce!='\0';)
    {    
        if(HT[i].lchild!=0||HT[i].rchild!=0)
        {
            if(ce=='0')i=HT[i].lchild;
            else if(ce=='1') i=HT[i].rchild;
            ce=getchar();
        }
        else
        {
            if(i==1)printf(" ");
            else if(i>=2&&i<=27)printf("%c",ch+i-2);
            i=2*n-1;
        }
    }
}




void main()
{
    int n;
    printf("输入赫夫曼编码的字符数:\n");
    scanf("%d",&n);
    HuffmanDecoding(n);
}

回复列表 (共1个回复)

沙发

http://hi.baidu.com/%B3%CB%B7%E7%CC%A4%C0%CB2008/blog/category/%CA%FD%BE%DD%BD%E1%B9%B9%C9%E8%BC%C6
这上面的都是的!

我来回复

您尚未登录,请登录后再回复。点此登录或注册