实验三链表及其多项式相加(答案)(DOC)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三、链表及其多项式相加
、程序流程图
1. 主过程
2. 建立多项式链表流程
参考程序
/* 链表及其多项式相加 */
typedef struct linkline
{
int coef;
int exp;
struct linkline *next;
}
line;
line *creat()
{ /*建立多项式列表*/
int n;
line *head;
line *p1,*p2;
n=0;
printf("(输入的数必须是整数,指数须从小到大依次输入,系数为零表示多项式结束)\n");
p1=p2=(line *)malloc(sizeof(line)); /*开辟一个新单元*/
scanf("%d%d",&p1->coef,&p1->exp); /*录入多项式*/
if (p1->coef==0) head=0;
else
{
while(p1->coef!=0)
{ n++;
if (n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(line *)malloc(sizeof(line));
scanf("%d%d",&p1->coef,&p1->exp);
}
p2->next=0;
}
return(head);
}
/* 以下是输出多项式的函数 */
void print(line *p)
{
line *p0;
p0=p;
printf(" ");
if(p0!=0)
do
{
printf("%dx的%d次幂",p0->coef,p0->exp);
p0=p0->next;
if(p0!=0) printf("+");
}
while(p0!=0);
else printf(" 空多项式!!");
printf("\n");
}
int compare(int m,int n) /*比较两个整数的大小的函数*/ {
int j;
if (m if (m==n) j=0; if (m>n) j=1; return(j); } void freeNode(line *w1) /* 释放一个表中的所有结点 */ { line *w2; w2=w1->next; while(w1) { free(w1); w1=w2; w2=w2->next; } } line *AddLine(line *ha,line *hb) /*两个非空多项式相加*/ { line *la,*lb,*lc; int a,b,sum; lc=ha; la=ha; lb=hb; if ((ha==0)&&(hb!=0)) return(hb); while ((la!=0)&&(lb!=0)) { a=la->exp; b=lb->exp; switch( compare(a,b) ) /*比较当前结点指数的大小 */ { case -1: { ha=la; /*只修改la的指针*/ la=la->next; break; } case 0: { sum=la->coef+lb->coef; if(sum!=0) { /* 将其不为零的系数和保存 */ la->coef=sum; ha=la; la=la->next; } /* end if*/ else { /* 分别删除系数和为零的对应的两个结点 */ if (lc==la) {lc=lc->next;ha=lc;la=ha;} /* 刚开始时特殊处理头结点 */ else{ ha->next=la->next; la=ha->next; } } /*end else*/ hb=lb; lb=lb->next; break; } case 1: { /* 将指数小的项插入到la的前部 */ hb=lb->next; if(ha==la) {lc=lb;lb->next=ha;la=la->next; } else { ha->next=lb; lb->next=la; ha=la; la=la->next; } lb=hb->next; break; } } /*end swtich*/ } /*end while*/ if (lb!=0) ha->next=lb; return(lc); } /*end AddLine */ /*************以下为主程序**************/ main() { line *la,*lb,*lc; printf("请输入多项式La: "); la=creat(); printf("请输入多项式Lb: "); lb=creat(); printf("多项式La:\n"); print(la); printf("多项式Lb:\n"); print(lb); printf("多项式La与Lb的和是: \n"); lc=AddLine(la,lb); print(lc); freeNode(lb); } 一、实验目的: 1.了解栈存储结构的特点; 2.掌握栈存储结构的应用。 二、实验原理: 栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。 由于栈的“先进先出”特点,在很多实际问题中都利用栈做一个辅助的数据结构来进行求解。 数制转换问题: 将十进制数N转换为r进制的数,其转换方法利用辗转相除法:以N=3456,r=8为例转换方法如下: N N / 8 (整除) N % 8(求余) 3467 433 3 低 433 54 1 54 6 6 6 0 6 高 所以:(3456)10 =(6600)8