public class Test {
public static void main(String[] args) {
try{
LinkList list1 = new LinkList()
LinkList list2 = new LinkList()
LinkList list3 = null
list1.addAt(0, new Item(1, 5))
list1.addAt(1, new Item(-1.5, 3))
list1.addAt(2, new Item(1, 1))
list2.addAt(0, new Item(0.5, 5))
list2.addAt(1, new Item(0.5, 4))
list2.addAt(2, new Item(1.5, 3))
list2.addAt(3, new Item(3, 0))
list3 = mergeLinkList(list1, list2)
System.out.println("一元多项式的相加过程:")
list1.listAll()
System.out.println(" + ")
list2.listAll()
System.out.println(" = ")
list3.listAll()
}
catch(Exception e){
e.printStackTrace()
}
}
/**
* 一元多项式的一般项类
*/
class Item{
private double coef //一元多项式的一般项的系数
private int exp //一元多项式的一般项的指数
public Item(){
this.coef = 0.0
this.exp = 0
}
public Item(double coef, int exp){
this.coef = coef
this.exp = exp
}
public double getCoef(){
return this.coef
}
public void setCoef(double coef){
this.coef = coef
}
public int getExp(){
return this.exp
}
public void setExp(int exp){
this.exp = exp
}
}
/**
* 链表结点类
*/
class Node{
private Item data
private Node next //链表结点的指针域,指向直接后继结点
public Node(){
data = null
next = null
}
public Node(Item data, Node next){
this.data = data
this.next = next
}
public Item getData(){
return this.data
}
public void setData(Item data){
this.data = data
}
public Node getNext(){
return this.next
}
public void setNext(Node next){
this.next = next
}
}
/**
* 链表类
*/
class LinkList{
private Node head = null//头结点指针
private int size = 0
public LinkList(){
head = new Node()
size = 0
}
//在i位置插入元素elem
public boolean addAt(int i, Item elem) {
if(i <0 || i >size){
return false
}
Node pre,curr
int pos
for(pre=headi>0 &&pre.getNext()!=nulli--,pre=pre.getNext())
curr = new Node(elem, pre.getNext())
pre.setNext(curr)
size++
return true
}
//删除i位置的元素
public boolean removeAt(int i) {
if(i <0 || i >= size){
return false
}
Node pre,curr
for(pre=headi>0 &&pre.getNext()!=nulli--,pre=pre.getNext())
curr = pre.getNext()
pre.setNext(curr.getNext())
size--
return true
}
java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。除以上功能外,还有乘法和除法的计算和导数计算呢。这是我以前做的数据结构课程设计。希望能帮上你的忙。
#include<stdio.h>
#include<malloc.h>
typedef struct Polynomial{
float coef
int expn
struct Polynomial *next
}*Polyn,Polynomial //Polyn为结点指针类型
void Insert(Polyn p,Polyn h){
if(p->coef==0) free(p) //系数为0的话释放结点
else{
Polyn q1,q2
q1=hq2=h->next
while(q2&&p->expn<q2->expn){ //查找插入位置
q1=q2
q2=q2->next
}
if(q2&&p->expn==q2->expn){ //将指数相同相合并
q2->coef+=p->coef
free(p)
if(!q2->coef){ //系数为0的话释放结点
q1->next=q2->next
free(q2)
}
}
else{ //指数为新时将结点插入
p->next=q2
q1->next=p
}
}
}//Insert
Polyn CreatePolyn(Polyn head,int m){//建立一个头指针为head、项数为m的一元多项式
int i
Polyn p
p=head=(Polyn)malloc(sizeof(struct Polynomial))
head->next=NULL
for(i=0i<mi++){
p=(Polyn)malloc(sizeof(struct Polynomial))//建立新结点以接收数据
printf("请输入第%d项的系数与指数:",i+1)
scanf("%f %d",&p->coef,&p->expn)
Insert(p,head) //调用Insert函数插入结点
}
return head
}//CreatePolyn
void DestroyPolyn(Polyn p){//销毁多项式p
Polyn q1,q2
q1=p->next
q2=q1->next
while(q1->next){
free(q1)
q1=q2//指针后移
q2=q2->next
}
}
void PrintPolyn(Polyn P){
Polyn q=P->next
int flag=1//项数计数器
if(!q) { //若多项式为空,输出0
putchar('0')
printf("\n")
return
}
while (q){
if(q->coef>0&&flag!=1) putchar('+')//系数大于0且不是第一项
if(q->coef!=1&&q->coef!=-1){//系数非1或-1的普通情况
printf("%g",q->coef)
if(q->expn==1) putchar('X')
else if(q->expn) printf("X^%d",q->expn)
}
else{
if(q->coef==1){
if(!q->expn) putchar('1')
else if(q->expn==1) putchar('X')
else printf("X^%d",q->expn)
}
if(q->coef==-1){
if(!q->expn) printf("-1")
else if(q->expn==1) printf("-X")
else printf("-X^%d",q->expn)
}
}
q=q->next
flag++
}//while
printf("\n")
}//PrintPolyn
int compare(Polyn a,Polyn b){
if(a&&b){
if(!b||a->expn>b->expn) return 1
else if(!a||a->expn<b->expn) return -1
else return 0
}
else if(!a&&b) return -1//a多项式已空,但b多项式非空
else return 1//b多项式已空,但a多项式非空
}//compare
Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa=pa->next
Polyn qb=pb->next
Polyn headc,hc,qc
hc=(Polyn)malloc(sizeof(struct Polynomial))//建立头结点
hc->next=NULL
headc=hc
while(qa||qb){
qc=(Polyn)malloc(sizeof(struct Polynomial))
switch(compare(qa,qb)){
case 1:
{
qc->coef=qa->coef
qc->expn=qa->expn
qa=qa->next
break
}
case 0:
{
qc->coef=qa->coef+qb->coef
qc->expn=qa->expn
qa=qa->next
qb=qb->next
break
}
case -1:
{
qc->coef=qb->coef
qc->expn=qb->expn
qb=qb->next
break
}
}//switch
if(qc->coef!=0){
qc->next=hc->next
hc->next=qc
hc=qc
}
else free(qc)//当相加系数为0时,释放该结点
}//while
return headc
}//AddPolyn
Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn h=pb
Polyn p=pb->next
Polyn pd
while(p){ //将pb的系数取反
p->coef*=-1
p=p->next
}
pd=AddPolyn(pa,h)
for(p=h->nextpp=p->next)//恢复pb的系数
p->coef*=-1
return pd
}//SubtractPolyn
float ValuePolyn(Polyn head,float x){//输入x值,计算并返回多项式的值
Polyn p
int i
float sum=0,t
for(p=head->nextpp=p->next){
t=1
for(i=p->expni!=0){
if(i<0){t/=xi++}//指数小于0,进行除法
else{t*=xi--}//指数大于0,进行乘法
}
sum+=p->coef*t
}
return sum
}//ValuePolyn
Polyn Derivative(Polyn head){//求解并建立a的导函数多项式,并返回其头指针
Polyn q=head->next,p1,p2,hd
hd=p1=(Polyn)malloc(sizeof(struct Polynomial))//建立头结点
hd->next=NULL
while(q){
if(q->expn!=0){ //该项不是常数项时
p2=(Polyn)malloc(sizeof(struct Polynomial))
p2->coef=q->coef*q->expn
p2->expn=q->expn-1
p2->next=p1->next//连接结点
p1->next=p2
p1=p2
}
q=q->next
}
return hd
}//Dervative
Polyn MultiplyPolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针
Polyn hf,pf
Polyn qa=pa->next
Polyn qb=pb->next
hf=(Polyn)malloc(sizeof(struct Polynomial))//建立头结点
hf->next=NULL
for(qaqa=qa->next){
for(qb=pb->nextqbqb=qb->next){
pf=(Polyn)malloc(sizeof(struct Polynomial))
pf->coef=qa->coef*qb->coef
pf->expn=qa->expn+qb->expn
Insert(pf,hf)//调用Insert函数以合并指数相同的项
}
}
return hf
}//MultiplyPolyn
void DevicePolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针
Polyn hf,pf,af,temp1,temp2,q
Polyn qa=pa->next
Polyn qb=pb->next
hf=(Polyn)malloc(sizeof(struct Polynomial))//建立头结点,存储商
hf->next=NULL
pf=(Polyn)malloc(sizeof(struct Polynomial))//建立头结点,存储余数
pf->next=NULL
temp1=(Polyn)malloc(sizeof(struct Polynomial))
temp1->next=NULL
temp2=(Polyn)malloc(sizeof(struct Polynomial))
temp2->next=NULL
temp1=AddPolyn(temp1,pa)
while(qa!=NULL&&qa->expn>=qb->expn){
temp2->next=(Polyn)malloc(sizeof(struct Polynomial))
temp2->next->coef=(qa->coef)/(qb->coef)
temp2->next->expn=(qa->expn)-(qb->expn)
Insert(temp2->next,hf)
pa=SubtractPolyn(pa,MultiplyPolyn(pb,temp2))
qa=pa->next
temp2->next=NULL
}
pf=SubtractPolyn(temp1,MultiplyPolyn(hf,pb))
pb=temp1
printf("商是:")
PrintPolyn(hf)
printf("余数是:")
PrintPolyn(pf)
}//DevicePolyn
int main(){
int m,n,flag=0
float x
Polyn pa=0,pb=0,pc,pd,pe,pf//定义各式的头指针,pa与pb在使用前付初值NULL
printf("请输入a的项数:")
scanf("%d",&m)
pa=CreatePolyn(pa,m)//建立多项式a
printf("请输入b的项数:")
scanf("%d",&n)
pb=CreatePolyn(pb,n)//建立多项式a
//输出菜单
printf("**********************************************\n")
printf("操作提示:\n\t1.输出多项式a和b\n\t2.建立多项式a+b\n\t3.建立多项式a-b\n")
printf("\t4.计算多项式a在x处的值\n\t5.求多项式a的导函数\n\t6.建立多项式a*b\n")
printf("\t7.建立多项式a/b\n\t8.退出\n**********************************************\n")
for(flag=0){
printf("执行操作")
scanf("%d",&flag)
if(flag==1){
printf("多项式a:")PrintPolyn(pa)
printf("多项式b:")PrintPolyn(pb)continue
}
if(flag==2){
pc=AddPolyn(pa,pb)
printf("多项式a+b:")PrintPolyn(pc)
DestroyPolyn(pc)continue
}
if(flag==3){
pd=SubtractPolyn(pa,pb)
printf("多项式a-b:")PrintPolyn(pd)
DestroyPolyn(pd)continue
}
if(flag==4){
printf("输入x的值:x=")
scanf("%f",&x)
printf("多项式a的值%g\n",ValuePolyn(pa,x))continue
}
if(flag==5){
pe=Derivative(pa)
printf("多项式a的导函数:")PrintPolyn(pe)
DestroyPolyn(pe)continue
}
if(flag==6){
pf=MultiplyPolyn(pa,pb)
printf("多项式a*b:")PrintPolyn(pf)
DestroyPolyn(pf)continue
}
if(flag==7){
DevicePolyn(pa,pb)
continue
}
if(flag==8) break
if(flag<1||flag>8) printf("Error!!!\n")continue
}//for
DestroyPolyn(pa)
DestroyPolyn(pb)
return 0
}