线性表及多项式操作Word文件下载.docx
- 文档编号:22415116
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:22
- 大小:87.69KB
线性表及多项式操作Word文件下载.docx
《线性表及多项式操作Word文件下载.docx》由会员分享,可在线阅读,更多相关《线性表及多项式操作Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
returnERROR;
returnOK;
}
顺序表的查找
StatusFind(SeqListL,inti,int*x)
if(i<
0||i>
L.n-1)//越界判断
*x=L.element[i];
顺序表的插入:
StatusInsert(SeqList*L,inti,intx)
intj;
-1||i>
n-1)
if(L->
n==L->
maxLength)
for(j=L->
n-1;
j>
i;
j--)
element[j+1]=L->
element[j];
element[i+1]=x;
n++;
顺序表的删除:
StatusDelete(SeqList*L,inti)
if(i<
n)
for(j=i+1;
j<
n;
j++)
element[j-1]=L->
n--;
顺序表的输出:
StatusOutput(SeqListL)//输出
inti;
L.n)
for(i=0;
i<
L.n;
i++)
printf("
%d"
L.element[i]);
顺序表的析构:
voidDestroy(SeqList*L)
maxLength=0;
free(L->
element);
用主函数进行测试:
#include<
stdio.h>
stdlib.h>
#defineERROR0
#defineOK1
intmain()
SeqListlist;
Init(&
list,10);
10;
Insert(&
list,i-1,i);
Output(list);
\n"
);
Delete(&
list,0);
Destroy(&
list);
调用结果:
2.带表头节点单链表的基本运算
单链表的类型定义(struct.h):
typedefstructNode
{
intelement;
//结点的数据域
structNode*link;
//结点的指针域
}Node;
typedefstruct
structNode*head;
}headerList;
typedefintstatus;
单链表的初始化(Init.c):
statusInit(headerList*L)
head=(Node*)malloc(sizeof(Node));
if(!
head)
returnERROR;
head->
link=NULL;
returnOK;
单链表的查找(Find.c):
statusFind(headerListL,inti,int*x)
Node*p;
intj;
if(i<
0||i>
L.n-1)//对i进行越界检查
p=L.head;
for(j=0;
j<
j++)
p=p->
link;
//从头结点开始查找ai
*x=p->
element;
//通过x返回ai的值
单链表的插入(Insert.c):
statusInsert(headerList*L,inti,intx)
Node*p,*q;
-1||i>
p=L->
head;
for(j=0;
=i;
q=malloc(sizeof(Node));
q->
element=x;
link=p->
p->
link=q;
单链表的删除(Delate.c):
statusDelete(headerList*L,inti)
Node*p,*q;
if(!
q=L->
for(j=0;
j++)q=q->
p=q->
//p指向ai
//从单链表中删除p所指向的结点
free(p);
//释放p所指结点的存储空间
单链表的输出(Output.c):
statusOutput(headerListL)
L.n)//判断顺序表是否为空
p=L.head->
while(p)
printf("
p->
单链表的析构(Destroy.c):
voidDestroy(headerList*L)
Node*p;
while(L->
head)
p=L->
head->
free(L->
head);
head=p;
测试所用主函数(main.c):
voidmain()
inti;
intx;
headerListlist;
Init(&
//对线性表初始化
for(i=0;
9;
Insert(&
//线性表中插入新元素
thelinklistis:
"
Output(list);
Delete(&
\nthelinklistis:
Nizhi(&
\n逆置后:
Find(list,0,&
x);
//printf("
\nthevalueis:
1);
Destroy(&
}调用结果:
单链表的基本操作和逆置是在一篇代码中,所以主函数中已包括逆置函数的调用,调用结果如图也包括了逆置结果。
3.单链表逆置操作
statusNizhi(headerList*L)
Node*p,*q,*r;
p=L->
q=p->
while(q)
{
r=q->
q->
link=p;
p=q;
q=r;
}
link->
return0;
}调用结果:
4.单链表排序操作(冒泡)
#include<
typedefstructnode
structnode*next;
}Node,*LinkList;
LinkListCreat(void)/*创建链表,输入数据,结束标志为当输入的数据为0*/
LinkListH,p,q;
n=0;
p=q=(LinkList)malloc(sizeof(Node));
输入数据:
(输入0标志着输入完成)\n"
scanf("
%d"
&
H=NULL;
while(p->
element!
=0)
n=n+1;
if(n==1)
H=p;
else
q->
next=p;
q=p;
p=(LinkList)malloc(sizeof(Node));
scanf("
next=NULL;
return(H);
LinkListPaixu(LinkListl)/*排序*/
LinkListp,q;
inttemp;
for(p=l;
p!
=NULL;
next)
for(q=p->
next;
q!
q=q->
{
if(p->
element>
element)
{
temp=q->
q->
element=p->
p->
element=temp;
}
}
returnl;
LinkListL,S,K;
L=Creat();
初始化的单链表为:
for(S=L;
S!
S=S->
printf("
S->
Paixu(L);
\n按递增排序后的链表为:
for(K=L;
K!
K=K->
K->
5.多项式操作
多项式的类型定义(struct.h):
typedefstructPNode
intcoef;
intexp;
structPNode*link;
}PNode;
structPNode*head;
}polynominal;
多项式的创建(Create.c):
voidCreate(polynominal*p)
PNode*pn,*pre,*q;
p->
head=(void*)malloc(sizeof(PNode));
exp=-1;
请输入多项式\n"
for(;
;
)
pn=(void*)malloc(sizeof(PNode));
coef:
pn->
coef);
exp:
exp);
if(pn->
exp<
0)break;
pre=p->
q=p->
while(q&
&
exp>
exp)
pre=q;
q=q->
pn->
pre->
link=pn;
多项式的输出(Output.c):
voidOutput(polynominalL)
PNode*p;
link!
=NULL)
%d*X^%d+"
coef,p->
p=p->
%d*X^%d\n"
多项式的析构(Destroy.h):
voidDestroy(polynominal*L)
{
PNode*p;
while(L->
两个多项式的加法(Add.c):
voidAdd(polynominal*px,polynominal*qx)
PNode*q,*q1=qx->
head,*p,*temp;
p=px->
q=q1->
while(p&
q)
while(p->
q1=q;
if(p->
exp==q->
coef=q->
coef+p->
coef;
if(q->
coef==0)
q1->
link=q->
free(q);
q=q1->
p=p->
else
q1=q;
q=q->
else
temp=(void*)malloc(sizeof(PNode));
temp->
coef=p->
exp=p->
exp;
link=q1->
q1->
link=temp;
p=p->
两个多项式的乘法(Mult.c):
polynominal*Mult(polynominal*a,polynominal*b)
PNode*an,*bn;
polynominaltemp;
初始化temp,输入000-1"
Create(&
temp);
an=a->
bn=b->
while(an->
link)
an=an->
while(bn->
bn=bn->
bn->
exp+=an->
coef*=an->
Add(b,&
exp-=an->
coef/=an->
return&
temp;
调用主函数测试:
voidmain()
polynominallistA,listB,listC,listD,temp;
intchoose=0;
请选择操作:
1.多项式相加2.多项式相乘\n"
choose);
switch(choose)
case1:
Create(&
listA);
listB);
多项式A为:
"
Output(listA);
多项式B为:
Output(listB);
Add(&
listA,&
A与B相加得:
Output(listB);
Destroy(&
}break;
case2:
Create(&
listC);
listD);
多项式C为:
Output(listC);
多项式D为:
Output(listD);
//Mult(&
listC,&
Output(*Mult(&
listD));
}break;
运行结果:
(1)多项式加法:
(2)多项式乘法:
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
一、前面写顺序表的时候没有遇到什么问题,只是有两个地方有点小问题但很快解决了;
(1)(void*)malloc(sizeof(PNode))在malloc前面漏掉强制类型转换。
(2)for(inti=1,i<
n,i++)类似上式,有些编译器不支持for循环类定义变量名。
二、刚开始写链表的代码时,总是搞不清一个链表内的成员和关系,后来一直到完成多项式加法时才对链表有了一个较为全面的认识。
三、在写多项式乘法时,在网上找了一个乘法的算法,可是改来改去还是会出问题,在输出最终结果时输出的系数和指数是地址而不是数,和舍友讨论了很久也没有解决,我后来在舍友的帮助下完成了多项式的乘法;
但是之前的那段没有找出问题的代码还是没有找到答案,而且目前还以注释的形式保留在源代码中。
四、希望自己能够在实验和作业中有所收获,使得自己的代码水平有一定的提升。
五、指导教师评语
成绩
批阅人
日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 多项式 操作