上海交通大学网络教育数据结构协同作业实验线性表1顺序表操作验证 (2)1.1实验目的 (2)1.2实验内容 (2)2一元多项式相加实验 (2)3开发环境 (2)4算法设计介绍 (3)4.1设计思路 (3)4.2详细设计 (6)5界面流程展示 (7)6检查及测试报告 (9)6.1检查报告 (9)6.2测试报告 (9)7附程序源代码 (10)7.1一元多项式验证: (10)7.2顺序表操作验证: (16)1顺序表操作验证1.1 实验目的(1)掌握线性表的顺序存储结构;(2)验证顺序表及其基本操作的实现;(3)掌握数据结构及算法的程序实现的基本方法。
1.2 实验内容(1)建立含有若干个元素的顺序表;(2)对已建立的顺序表实现插入、删除、查找等基本操作。
2一元多项式相加实验已知A( x )= a0 + a1x + a2x2+ …… + a n x n和B(x) = b0 + b1x + b2x2 +…… + a m x m,并在A( x ) 和B( x ) 中指数相差很多,求A( x ) = A( x ) + B(x) 。
3开发环境软件平台:Windows XP软件环境:Microsoft Visual C++ 6.0最低硬件配置:内存64MB或以上、硬盘3.2G或以上4 算法设计介绍4.1 设计思路分析:1.存储结构分析根据一元多项式的特点,要表示一个多项式,只要存储第i 项以及ai 的值,并且如果ai 为0的话,该项就不用存储了,从而减少一个存储空间。
在线性表中可以通过顺序和链式存储,并用Ti 表示一个数据项Ti=(ai,i )。
下面以图示表示两种存储结构(假设a2=0)。
图1 顺序存储表图2 单链表存储以上两个图可知,在存储空间分配量上两种结构是一致的,但如果两多项式相加的话需要频繁的做插入操作,顺序表的结构特性决定了插入操作的时间复杂度为O(n/2),链式表的时间复杂度为O(1),并且如果存储的是一个排好序的多项式的话,不需要双向查找,因此选择单链表存储。
2.相加算法分析首先,由于两个多项式A(x)和B(x)的指数相差非常多,因此一定要把输入的多项式按照指数i 排好序,防止过高的查找时间复杂度;其次,两个AB 多项式同时从head 开始查找,AB 指数i 相同的计算相加ai 值存入A 表,并且回收不需要的B 空间,指数不同的,B 指数小的节点插到A 指数大的前面。
以此往后推移。
其时间复杂度为O(n)。
举例:A(x)=2+3x+1x3B(x)=1+3x+2x2+2x4+12x7+32x8+42x11+2x12 整个相加过程如下:见注释111Data 区域2[0]表示 该节点的系数为2 指数为0…图3 初始化后的A(x) pA=headA图4 初始化后的B(x)pB=HeadB->next第一步:图5 A(x) pA->next系数+pB系数图6 B(x) pA->next指数0与pB指数0相等free pB所指节点第二步与第一步做法一致第三步将pB的节点插入pA后第四步pA->next指数小于pB指数,pA=pA->next,pB不动第五步pA没有后继节点,直接把pB的所有节点接到pA后即可4.2 详细设计a)数据结构typedef struct term {float coef; //系数int expn; //指数struct term *next //指向下一节点} termb)输入输出输入:两个多项式A,B输出:A+B样式:输入一元多项式的项数2请依次输入非零2个非零项,请注意输入格式2 23 33X^3+2X^21~4 (+ - * 退出)4个选项再输入一元多项式的项数3请依次输入非零3个非零项,请注意输入格式2 23 34 43X^3+2X^2 + 4X^4+3X^3+2X^2 = 4X^4+6X^3+4X^2c)函数原型主函数:void main()输入函数: InputPolynomial(LinkList &p)多项式相加函数: term* APolyn(term *Pa, term *Pb)多项式相减函数: term* BPolyn(term *Pa, term *Pb)多项式相乘函数:term* CPolyn(term *Pa, term *Pb)输出函数: void PrintfPoly(term *P)5界面流程展示第一步:先输入第一个“一元多项式的项数”第二步,根据一元多项式的项数,输入非零项。
注意输入格式,系数和指数之间要有空格。
第三步,选择要进行的运算方式编码第四步,再输入第二个“一元多项式的项数”,方式如第二步一致,最后回车进行运算6检查及测试报告6.1 检查报告6.2 测试报告7附程序源代码7.1 一元多项式验证:#include<stdlib.h>#include<stdio.h>#include<ctype.h>typedef struct term //项的表示,多项式的项作为LinkList的数据元素{float coef; //系数int expn; //指数struct term *next;}term;term* CreatPolyn(term *P,int m) // 输入m项的系数和指数,建立表示一元多项式的有序链表P{if(m <= 0) return NULL;term *h = P = (term*)malloc(sizeof(term)), *q;P->coef = 0.0;int i;printf("依次输入%d个非零项,请注意输入格式,系数和指数之间要有空格,ex:2 2 3 1\n",m);for (i = 1; i <= m; ++i) // 依次输入m个非零项{scanf("%f%d",&P->coef,&P->expn);if(P->coef)q = P;P = P->next = (term*)malloc(sizeof(term));}q->next = NULL;free(P);return h;} // CreatPolynterm* selsort(term *h){term *g, *p, *q;if(!h) return NULL;float f;int i, fini = 1;for(g = h;g->next&&fini;g = g->next){fini = 0;for(p = h,q = h->next;q;p = p->next,q = q->next)if (p->expn < q->expn){f = p->coef;i = p->expn;p->coef = q->coef;p->expn = q->expn;q->coef = f;q->expn = i;fini = 1;}}for(g = h,p = g->next;p;)if(g->expn==p->expn){g->coef += p->coef;g->next = p->next;q = p;p = p->next;free(q);}else if(g->next){g = g->next;p = p->next;}return h;}void PrintfPoly(term *P){term *q = P;if(!q){putchar('0');return;}if(q->coef!=1){printf("%g",q->coef);if(q->expn==1) putchar('X');else if(q->expn) printf("X^%d",q->expn);}else if(!q->expn) putchar('1');else if(q->expn==1) putchar('X');else printf("X^%d",q->expn);q = q->next;while (q){if(q->coef > 0) putchar('+');if(q->coef!=1){printf("%g",q->coef);if(q->expn==1) putchar('X');else if(q->expn) printf("X^%d",q->expn);}else if(!q->expn) putchar('1');else if(q->expn==1) putchar('X');else printf("X^%d",q->expn);q = q->next;}}Compare(term *a, term *b){if (a->expn < b->expn) return -1;if (a->expn > b->expn) return 1;return 0;}term* APolyn(term *Pa, term *Pb)// 多项式加法:Pa = Pa+Pb,利用两个多项式的结点构成"和多项式"。
{term *h, *qa = Pa, *qb = Pb, *p, *q;float sum;h = p = (term*)malloc(sizeof(term));p->next = NULL;while (qa && qb) // Pa和Pb均非空{switch (Compare(qa,qb)){case -1: // 多项式PA中当前结点的指数值小p->next = qb;p = qb;qb = qb->next;break;case 0: // 两者的指数值相等sum = qa->coef + qb->coef;if (sum != 0.0) // 修改多项式PA中当前结点的系数值{p->next = qa;qa->coef = sum;p = qa;qa = qa->next;}else // 删除多项式PA中当前结点{q = qa;qa = qa->next;free(q);}q = qb;qb = qb->next;free(q);break;case 1: // 多项式PB中当前结点的指数值小p->next = qa;p = qa;qa = qa->next;break;} // switch} // whileif (Pa) p->next = qa; // 链接Pa中剩余结点if (Pb) p->next = qb; // 链接Pb中剩余结点q = h;h = h->next;free(q);return h;} // APolynterm* A(term *Pa, term *Pb){int n;puts("再输入一元多项式的项数");scanf("%d",&n);Pb = CreatPolyn(Pb,n);Pb = selsort(Pb);PrintfPoly(Pa);if(Pb && Pb->coef>0) printf(" + ");PrintfPoly(Pb);Pa = APolyn(Pa,Pb);printf(" = ");Pa = selsort(Pa);PrintfPoly(Pa);return Pa;}term* BPolyn(term *Pa, term *Pb) //多项式减法:Pa = Pa-Pb,利用两个多项式的结点构成"差多项式"。