主题:大家把自己学数据结构时编写的源程序发上来,一起学习学习
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);
}
以下是我的一些源程序:[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);
}