数据结构:求两个多项式的相加运算
2017-10-22 16:40
316 查看
目的:掌握线性表的应用和有序单链表的二路归并算法设计。
内容:编写一个程序exp2-9.cpp,用单链表储存一元多项式,并实现
两个多项式的相加运算
#include<stdio.h> #include<stdlib.h> typedef struct LNode { int data; struct LNode* next; } LinkNode; void DestroyList(LinkNode*L) //销毁线性表函数 { LinkNode*p=L->next,*q=L; while(p!=NULL) { free(q); q=p; p=p->next; } free(q); } void DispList(LinkNode*L) //输出函数 { LinkNode*p=L->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } void CreatList(LinkNode*&L,int a[],int n) //数组数据建立链表函数尾插法 { LinkNode*p,*q; L=(LinkNode* )malloc(sizeof(LinkNode)); q=L; for(int i=0;i<n;i ) { p=(LinkNode * )malloc(sizeof(LinkNode)); p->data=a[i]; q->next=p; q=p; } q->next=NULL; } void diff1(LinkNode*&A,LinkNode*&B) //第一小题函数 { LinkNode*a,*b,*a_prior,*b_prior; //a_prior,b_prior分别为遍历循环中a,b节点的前驱节点 a_prior=A; int T; //辅助变量T for(a=A->next;a!=NULL;a=a->next) //遍历A中元素 { b_prior=B; T=1; for(b=B->next;b!=NULL;b=b->next) //对A中,每一个元素都遍历一遍B表 { if(a->data==b->data) //若两表中出现相同元素,则删除A,B中此元素所在节点(删除B中节点为减少以后遍历B表次数) { T=0; a_prior->next=a->next; //跳过a元素将a前后元素链接 free(a); a=a_prior; //∵这里if后break跳过B循环后A循环会执行a节点前移,既下一刻开始判断被删除节点的下一节点 b_prior->next=b->next; //跳过b元素将b前后元素链接 free(b); b=b_prior->next; break; } b_prior=b_prior->next; } if(T) //若T==0说明原a节点已删除,此刻a节点位置为a_prior位置,下一刻a节点前移,∴a_prior作为a节点的前驱节点此时就不必前移了 a_prior=a_prior->next; } } void diff2(LinkNode*&A,LinkNode*&B) //第二小题函数 { LinkNode*a=A->next,*b=B->next,*a_prior=A; //a_prior为a节点的前驱节点 while(a!=NULL && b!=NULL) { if(a->data > b->data) //若a节点的值大于b节点,则b节点后移 b=b->next; else if(a->data < b->data) //若a节点的值小于b节点,则a节点后移 { a_prior=a; //先将a的前驱节点前移,再将a节点前移 a=a->next; } else //若两值相等,则删a节点 { //b不必删除 ∵到后面有销毁函数销毁b,这里删除b并不能像第一题一样减少遍历次数 a_prior->next=a->next; //跳过a元素将a前后元素链接 free(a); a=a_prior->next; } } } void main() { int A[7]={9,5,6,7,1,8,2},B[4]={8,-1,5,3}; //无序数组,集合运算A-B应该为9,6,7,1,2 (以检测结果) int a[10]={0,1,2,3,4,5,6,7,8,9},b[5]={2,4,6,8,10}; //有序数组,集合运算a-b应该为0,1,3,5,7,9 LinkNode*LA=NULL,*LB=NULL; CreatList(LA,A,7); //建立无序链表LA,LB CreatList(LB,B,4); diff1(LA,LB); //第一题函数 DestroyList(LB); //根据题目要求释放A和B中不需要的节点,则B链表全删 DispList(LA); //最后(1)题答案即为diff1后的链表A,将答案输出 DestroyList(LA); //第一题已完成,删除原表LA,重置A,B表并开始(2)题 CreatList(LA,a,10); //建立有序表A,B CreatList(LB,b,5); diff2(LA,LB); DestroyList(LB); DispList(LA); }
相关文章推荐
- PAT-线性结构:两个多项式相加运算 C实现
- 货币运算:两个FLOAT型的数据相加 结果好比1.5+1.5应该是3.0 可是 却显示为了3.123332
- 02-线性结构1 一元多项式的乘法与加法运算[网易云课堂-数据结构]
- mooc浙大数据结构PTA习题之一元多项式的乘法与加法运算
- !求两个多项式相加运算
- 数据结构——链表—一元多项式的表示及相加
- 求两个多项式相加运算
- (编程训练)再回首,数据结构——链表上的编程训练_实现多项式运算
- 两个多项式相加的运算
- 数据结构基础 一元多项式的乘法与加法运算
- 南邮数据结构实验1 一元多项式的相加和相乘
- 数据结构简明教程5版李春葆 单链表解决 多项式相加问题
- 相同结构的两个表中相同字段的数据相加,不相同的字段合并
- 一元多项式的加减乘除运算,C++语言描述,数据结构实验
- 【数据结构基础】单链表实现多项式相加
- 数据结构实验之一元多项式相加
- 02-线性结构1 一元多项式的乘法与加法运算 -数据结构
- 求两个多项式相加运算
- 数据结构 一元多项式相加
- 数据结构实验1(一元多项式的相加和相乘)