链表(linkList):用一组任意的存储单元来存放线性表的数据元素。
链式存储
优点:插入或删除元素时很方便,使用灵活;结点空间可以动态申请和释放。
缺点:存储密度小,存储空间利用率低,非随机存取。
适合于线性表的长度变化较大,且其主要操作是插入、删除操作。
应用场景1.一元多项式相加
一元多项式可以采用顺序存储和链式存储。
但我们为什么要选择链表呢?
1.多项式次数很高,且变化很快,顺序存储存储利用率低。
2.链表结点设置为三个域来存储数据单元,一个存储系数,一个存储指数,最后一个指向下一个结点。简直完美!!
package codefile;
import java.util.Scanner;
class Item implements Comparable<Item>{
//成员变量
double coef;
int exp;
Item next;
//构造方法
Item(){
coef=0.0;
exp=0;
next=null;
}
Item(double c,int e,Item n){
coef=c;
exp=e;
next=n;
}
double getCoef(){
return coef;
}
int getExp(){
return exp;
}
void Add(Item x){
if(exp==x.exp){
coef+=x.coef;
}
}
public String toString(){
return String.valueOf(coef)+"x^"+exp+"+";
}
public int compareTo(Item other){
if(exp>other.exp)
return 1;
else if(exp<other.exp)
return -1;
else
return 0;
}
}
class linkList<T>{
int length;
Item head;
linkList(){
head=new Item();
length=0;
}
int size(){
return length;
}
Item value(int pos){
int num=1;
Item p=head.next;
while(num<pos){
p=p.next;
num++;
}
return p;
}
void add(Item obj,int pos){
int num=1;
Item p=head;
Item q=head.next;
值得注意的是插入,怎么插入
while(num<pos){
p=q;
q=q.next;
num++;
}
Item s=new Item(obj.coef,obj.exp,null);
s.next=q;
p.next=s;
length++;//在p,q中插入一个结点s
如图,帮助理解
然后接着继续
}
void nextOrder(){
Item x=head.next;
while(x.next!=null){
System.out.print(x.toString());
x=x.next;//要记得移动,不然就要陷入无限死循环
}
if(x!=null){
System.out.println(String.valueOf(x.coef)+"x^"+x.exp);
}
}
}
public class Second {
public static void main(String[] args) {
double coef1[]={1.1,2,3.3,6.1,5};
int exp1[]={2,3,5,9,11};
double coef2[]={99,3,3.43,64.1,45,33,5};
int exp2[]={1,2,5,7,13,15,21};
linkList<Item> b1=new linkList<Item>();
linkList<Item> b2=new linkList<Item>();
linkList<Item> b3=new linkList<Item>();
for(int i=1;i<=coef1.length;i++){
Item x=new Item(coef1[i-1],exp1[i-1],null);
b1.add(x,i);
}
System.out.print("b2:");
b1.nextOrder();
for(int i=1;i<=coef2.length;i++){
Item x=new Item(coef2[i-1],exp2[i-1],null);
b2.add(x,i);
}
System.out.print("b2:");
b2.nextOrder();
int i1=1,i2=1;
while(i1<=b1.size()&&i2<=b2.size()){
Item x1=b1.value(i1);
Item x2=b2.value(i2);
if(x1.compareTo(x2)<0){
b3.add(x1,b3.size()+1);
i1++;
}else if(x1.compareTo(x2)>0){
b3.add(x2,b3.size()+1);
i2++;
}else{
double y=x1.getCoef()+x2.getCoef();
if(Math.abs(y)>1.0E-6){
x1.Add(x2);
b3.add(x1,b3.size()+1);
}
i1++;
i2++;
}
}
while(i1<b1.size()){
b3.add(b1.value(i2),b3.size()+1);
i1++;
}
while(i2<b2.size()+1){
b3.add(b2.value(i2),b3.size()+1);
i2++;
}
System.out.print("b3:");
b3.nextOrder();
}
}
执行结果