需打印出来的文档
- 格式:doc
- 大小:167.50 KB
- 文档页数:11
《数据结构》课程设计报告
班级:09计本(1)班 学号: 09011063 姓名: 张立东
学号:09011069 姓名:朱子涛
1. 问题名称:一元多项式运算
【问题描述】
计算任意两个一元多项式的加法、减法运算。由键盘输入二个多项式的每一项的指数、系数,输出这二个多项式的运算结果。
【存储结构】
链表结构
【主要算法】
void Creatlist(Lnode *L)//创建链表
{p=L;
L->next=NULL;
printf("请输入该表达式的项数\n");
scanf("%d",&m);
printf("请按升幂输入各项指数与系数\n");
for(k=1;k<=m;k++)
{q=(Lnode *)malloc(sizeof(Lnode));
scanf("%d%d",&(q->zhishu),&(q->xishu));
p->next=q;
p=q;
printf("请继续输入\n");}
p->next=NULL;
}
void Addlist(Lnode *LA,Lnode *LB,Lnode *LC)//加法运算
{p=LA->next;q=LB->next;
s=LC;
while(p!=NULL&&q!=NULL)
{if((*p).zhishu<(*q).zhishu)
{r=(Lnode *)malloc(sizeof(Lnode));
r->zhishu=(*p).zhishu;(*r).xishu=(*p).xishu;
p=p->next;s->next=r;s=r;
}
else if((*p).zhishu==(*q).zhishu)
{k=(*p).xishu+(*q).xishu;
if(k==0)
;
else
{r=(Lnode *)malloc(sizeof(Lnode));
(*r).zhishu=(*p).zhishu;
(*r).xishu=k;
s->next=r;s=r;
}
p=p->next;q=q->next;
}
else {r=(Lnode *)malloc(sizeof(Lnode));
(*r).zhishu=(*q).zhishu;(*r).xishu=(*q).xishu;
q=q->next; s->next=r;s=r;
}
}
while(p!=NULL)
{r=(Lnode *)malloc(sizeof(Lnode));
(*r).zhishu=(*p).zhishu;(*r).xishu=(*p).xishu;
p=p->next;s->next=r;s=r;
}
while(q!=NULL)
{r=(Lnode *)malloc(sizeof(Lnode));
(*r).zhishu=(*q).zhishu;(*r).xishu=(*q).xishu;
q=q->next;s->next=r;s=r;
}
s->next=NULL;
printf("相加后的结果(指数,系数)\n");
t=LC->next;
while(t!=NULL)
{printf("指数%d,系数%d\n",(*t).zhishu,(*t).xishu);
t=t->next;
}
}
void Abstractlist(Lnode *LA,Lnode *LB,Lnode *LC)//减法运算
{p=LA->next;q=LB->next;
s=LC;
while(p!=NULL&&q!=NULL)
{if((*p).zhishu<(*q).zhishu)
{r=(Lnode *)malloc(sizeof(Lnode));
r->zhishu=(*p).zhishu;(*r).xishu=(*p).xishu;
p=p->next;s->next=r;s=r;
}
else if((*p).zhishu==(*q).zhishu)
{k=(*p).xishu-(*q).xishu;
if(k==0)
;
else
{r=(Lnode *)malloc(sizeof(Lnode));
(*r).zhishu=(*p).zhishu;
(*r).xishu=k;
s->next=r;s=r;
}
p=p->next;q=q->next;
}
else {r=(Lnode *)malloc(sizeof(Lnode));
(*r).zhishu=(*q).zhishu;(*r).xishu=-(*q).xishu;
q=q->next; s->next=r;s=r;
}
}
while(p!=NULL)
{r=(Lnode *)malloc(sizeof(Lnode));
(*r).zhishu=(*p).zhishu;(*r).xishu=(*p).xishu;
p=p->next;s->next=r;s=r;
}
while(q!=NULL)
{r=(Lnode *)malloc(sizeof(Lnode));
(*r).zhishu=(*q).zhishu;(*r).xishu=-(*q).xishu;
q=q->next;s->next=r;s=r;
}
s->next=NULL;
printf("相减后的结果(指数,系数)\n");
t=LC->next;
while(t!=NULL)
{printf("指数%d,系数%d\n",(*t).zhishu,(*t).xishu);
t=t->next;
}
} 【测试和结果分析】经过测试运行结果正确。
2. 问题名称:算术表达式求值
【问题描述】
由键盘输入一表达式字符串,该表达式由数字、+、-、*、/、 (、)组成,输出这个表达式的值。
【存储结构】
顺序存储结构
【主要算法】
OperandYype EvaluateExpression()
{InitStack1(&OPTR);Push1('#',&OPTR);
InitStack2(&OPND);
c=getchar();
while(c!='#'||Gettop(OPTR)!='#'){
if((c-48)>=0&&(c-48)<=9)//不是运算符进栈
{a=0;
while((c-48)>=0&&(c-48)<=9)
{a=a*10+c-48;c=getchar();}
Push2(a,&OPND);
}
else
switch(Precede(Gettop(OPTR),c)){
case'<':Push1(c,&OPTR);//栈顶元素优先权低
c=getchar();
break;
case'=':OPTR.top--;//脱括号接受下一个字符
c=getchar();
break;
case'>':Push2(Operate(Poptop2(&OPND),Poptop2(&OPND),Poptop1(&OPTR)),&OPND);栈顶元素优先权高
break;
}
}
printf("\n表达式结果是:%d\n",Poptop2(&OPND));
}
【测试和结果分】
经过测试运行结果正确。
3. 问题名称:哈夫曼编码与译码的应用
【问题描述】
任意输入一串英文字符,针对各字符的出现频率值(可统计获得),给出给各字符哈夫曼编码。
【存储结构】
链式存储结构
【主要算法】
//--------构造赫夫曼树------//
void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int *w,int n)
{void Select(HuffmanTree HT,int n,int *s);
int i,m,f,start,s1,s2;char *cd;unsigned int c;
m=2*n-1;
for(i=1;i<=n;i++)
{HT[i].weight=w[i];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;}
for( ;i<=m;i++)
{HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;}
for(i=n+1;i<=m;i++)
{Select(HT,i-1,&s1);
HT[s1].parent=i;
Select(HT,i-1,&s2);
HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
//------求赫夫曼编码----//
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++){
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
{if(HT[f].lchild==c)
cd[--start]='0';
else cd[--start]='1';}
HC[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);}
free(cd);
}