`

用线性表实现两个一元多项式相加

阅读更多

                                          用线性表实现两个一元多项式的相加

1.用链表实现:

因为是用链表来实现,所以要有一个节点(Node)类,又节点是用类存放数据(一个含有系数和指数的项),所以还要定义一个Item类(当然这个类也可以不写,直接把数据的特征放到节点类中)。

Item 类:

public class Item {
	private int coef;
	private int exp;

	public Item() {
		this.coef = 0;
		this.exp = 0;
	}

	public Item(int coef, int exp) {
		this.coef = coef;
		this.exp = exp;
	}

	public int getCoef() {
		return this.coef;
	}

	public void setCoef(int coef) {
		this.coef = coef;
	}

	public int getExp() {
		return this.exp;
	}

	public void setExp(int exp) {
		this.exp = exp;
	}

}
 

 

 

Node类:

public 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;
	}
}
 

 

再根据分析可知要有一个Chain类来将所有的节点串联起来

Chain类:

 

public class Chain {
	private Node head = null;
	private int size = 0;

	public Chain() {
		head = new Node();
		size = 0;
	}

	public Node getHead() {
		return this.head;
	}

	public void setHead(Node head) {
		this.head = head;
	}

	public int getSize() {
		return this.size;
	}

	public void chainAll() {
		for (Node curr = head.getNext(); curr != null; curr = curr.getNext()) {
			System.out.print("  " + curr.getData().getCoef() + "x^"
					+ curr.getData().getExp());
			System.out.print(curr.getNext() == null ? " " : "+");
		}
	}

	public boolean addAt(int i, Item elem) {
		if (i < 0 || i > size) {
			System.out.println("输入的数据不合法,请重新输入");
			return false;
		}
		Node pre, curr;
		for (pre = head; i > 0 && pre.getNext() != null; i--) {
			pre = pre.getNext();
		}
		curr = new Node(elem, pre.getNext());
		pre.setNext(curr);
		size++;
		return true;
	}

	public Chain mergeChain(Chain chain1, Chain chain2) {
		int i = 0;
		Item item = new Item();
		Node curr1, curr2;
		Chain chain3 = new Chain();
		curr1 = chain1.getHead().getNext();
		curr2 = chain2.getHead().getNext();
		while (curr1 != null && curr2 != null) {
			if (curr1.getData().getExp() > curr2.getData().getExp()) {
				item = curr1.getData();
				chain3.addAt(i, item);
				curr1 = curr1.getNext();
				i++;
			} else if (curr1.getData().getExp() < curr2.getData().getExp()) {
				item = curr2.getData();
				chain3.addAt(i, item);
				curr2 = curr2.getNext();
				i++;
			} else {
				item = new Item(curr1.getData().getCoef()
						+ curr2.getData().getCoef(), curr1.getData().getExp());
				if (item.getCoef() != 0) {
					chain3.addAt(i, item);
					i++;
				}
				curr1 = curr1.getNext();
				curr2 = curr2.getNext();
			}
		}
		while (curr1 != null) {
			item = curr1.getData();
			chain3.addAt(i++, item);
			curr1 = curr1.getNext();
		}
		while (curr2 != null) {
			item = curr2.getData();
			chain3.addAt(i++, item);
			curr2 = curr2.getNext();
		}
		return chain3;
	}
} 

 

最后用一个主函数实现功能:

Test类:

public class Test {
	public static void main(String[] args) {
		Chain chain1 = new Chain();
		Chain chain2 = new Chain();
		Chain chain3 = new Chain();
		// 按降幂实例化链表
		chain1.addAt(0, new Item(1, 5));
		chain1.addAt(1, new Item(2, 3));
		chain1.addAt(2, new Item(1, 1));
		chain2.addAt(0, new Item(1, 5));
		chain2.addAt(1, new Item(2, 4));
		chain2.addAt(2, new Item(3, 3));
		chain2.addAt(3, new Item(3, 0));
		chain3 = chain3.mergeChain(chain1, chain2);

		System.out.println("一元多项式的相加过程: ");
		chain1.chainAll();
		System.out.println(" + ");
		chain2.chainAll();
		System.out.println(" = ");
		chain3.chainAll();

	}
}

 

这样一就实现了用链表完成两个一元多项是的加法,虽然还不是很完美,不过我水平有限呵呵!

 
2.用顺序表实现

顺序表其实就是用数组的形式实现,同样需要一个Item类,这就不做叙述了。还要有一个List类来存储数据

List类:

 

public class List {
	private Item[] a = new Item[100];
	private int size = 0;
	private int current;

	public List() {
		int i = 0;
		size = 0;
		for (i = 0; i < 100; i++)
			a[i] = null;
	}

	public int getSize() {
		return this.size;
	}

	public void listAll() {
		for (int i = 0; i < size; i++) {
			System.out.print(" " + a[i].getCoef() + "x^" + a[i].getExp());
			System.out.println(i < size ? " + " : "  ");
		}
	}

	public void addAt(int index, Item data) {
		if (index < 0 || index > size) {
			System.out.println("the index error");
		} else {
			for (int i = size - 1; i >= index; i--) {
				a[i + 1] = a[i];
			}
			a[index] = data;
			this.size++;
		}
	}

	public Item getData(int i) {
		if (i >= 0 && i < size)
			return a[i];
		else
			return null;

	}

	public List mergeChain(List list1, List list2) {
		int index = 0;
		int i = 0;
		int j = 0;
		List list3 = new List();
		while (i < list1.getSize() && j < list2.getSize()) {
			if (list1.getData(i).getExp() > list2.getData(j).getExp()) {
				list3.addAt(index, list2.getData(j));
				j++;
				index++;
			} else if (list1.getData(i).getExp() < list2.getData(j).getExp()) {
				list3.addAt(index, list1.getData(i));
				i++;
				index++;
			} else {

				int coef = list1.getData(i).getCoef()
						+ list2.getData(j).getCoef();
				int exp = list1.a[i].getExp();
				Item item = new Item();
				item.setCoef(coef);
				item.setExp(exp);
				if (coef != 0) {
					list3.addAt(index, item);
					i++;
					j++;
					index++;
				}

			}
		}
		while (i < list1.getSize()) {

			list3.addAt(index++, list1.getData(i++));

		}
		while (j < list2.getSize()) {
			list3.addAt(index++, list2.getData(j++));
		}

		return list3;
	}

}

 



同样需要一个主函数类

 

Manager类:

 

public class Manager{
      public static void main(String[] args){
         //按降幂实例化三个顺序表
   List list1 = new List();
         List list2 = new List();
         List list3 = new List();
  
         list1.addAt(0, new Item(1, 5));
         list1.addAt(1, new Item(2, 3));
         list1.addAt(2, new Item(1, 1));
  
         list2.addAt(0, new Item(1, 5));
         list2.addAt(1, new Item(2, 4));
         list2.addAt(2, new Item(3, 3));
         list2.addAt(3, new Item(3, 0));  
  
         list3 = list3.mergeChain(list1, list2);
  
         System.out.println("一元多项式相加的过程: ");
         list1.listAll();
         System.out.println(" + ");
         list2.listAll();
         System.out.println(" = ");
         list3.listAll();
        }
}

 

这样就实现了用线性表完成两个多项式的相加。这算得上是线性表的经典应用了吧,通过这两个实验

 

我基本上算是了解了线性表。后来看了老师给的代码发现其实我的代码还是比较累赘的,而且比较死板,

 

多项式是直接定死了,不是从键盘输入的还有待改进。


 

 

分享到:
评论

相关推荐

    c语言 两个一元多项式相加。

    在`两个一元多项式相加.cpp`文件中,可以看到具体的实现代码。主要会包含以下函数: - `void addPolynomials(PolynomialTerm* poly1, int n1, PolynomialTerm* poly2, int n2, PolynomialTerm* result)`:这个函数...

    数据结构(C语言)用单链表存储一元多项式并实现两个多项式的相加运算.doc

    数据结构(C语言)用单链表存储一元多项式并实现两个多项式的相加运算 本篇文章主要讲述了使用单链表存储一元多项式,并实现两个多项式的相加运算的算法和实现细节。 一、单链表的声明和实现 在C语言中,单链表是...

    数据结构线性表一元多项式的表示及相加PPT学习教案.pptx

    例1:设两个一元多项式为A(x)= 3x14 + 2x8 + 1,B(x)= 8x14 - 3x10 + 10x6,求此两一元多项式之和:C(x)=A(x)+B(x)。 例2:设两个一元多项式为A(x)= 4 + 6x4 + 5x8 + 4x12,B(x)= 2x3 - 5x8 + 3x12,求此两一元...

    数据结构课件:第2章 线性表2一元多项式的表示及相加.pptx

    数据结构课件:第2章 线性表2一元多项式的表示及相加.pptx

    数据结构+实验报告+线性表及其应用(多项式相加、相乘)等

    本次实验的具体任务是设计一个一元多项式的简单计算器,实现以下功能: 1. **输入并建立多项式**:用户可以通过输入系数和指数的方式创建多项式。 2. **输出多项式**:显示多项式的完整表达式。 3. **多项式相加*...

    数据结构试验报告

    实验一:线性表的应用算法:构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减...实验二:线性表的应用算法:构造两个按指数递增的有序链表,实现两个一元多项式相加

    线性表的应用_多项式相加

    在实现一元多项式加法运算时,我们使用单链表数据结构。链表的每个节点代表多项式的一个项,包含系数(coef)和指数(exp),以及指向下一个节点的指针(next)。在C语言中,我们可以定义一个结构体`Pnode`来表示...

    用链表实现多项式相乘以及相加

    加法函数AddPloyn的作用是将两个多项式链表相加。该函数首先比较两个链表的指数,如果指数小于另一个链表的指数,则将该结点添加到结果链表中。如果指数相等,则将两个结点的基数相加,并将结果添加到结果链表中。...

    数据结构 实验报告 线性表及其应用(多项式相加、相乘)等

    两个多项式相加的过程可以通过遍历线性表来实现。定义两个指针 p 和 q 分别指向两个多项式,比较它们当前指向项的指数,如果相同,则合并系数;如果不同,则将指数较大的项添加到结果多项式中。这个过程直到一个...

    数据结构之线性表——一元稀疏多项式计算器

    - 加法:遍历两个稀疏多项式的三元组链表或哈希表,对于相同的指数,将对应的系数相加;对于不同的指数,则保留原有的项。由于稀疏多项式中大部分项为零,因此这种操作可以大大减少计算量。 - 乘法:乘法较为复杂,...

    一元多项式相加问题的实验报告.doc

    给定两个一元多项式,如何通过编程将它们相加并输出结果是本实验报告的研究对象。 1. 问题描述 一元多项式相加问题是指通过键盘输入两个形如 P0+P1X1+P2X2+…+PnX 的多项式,然后经过程序运算后在屏幕上输出它们的...

    一元多项式相加数据结构实验一-1307班谭淇蔚.docx

    4. **一元多项式加法运算**:给定两个一元多项式,通过合并同类项来计算这两个多项式的和。这涉及到遍历两个多项式的所有项,并根据指数相同的项进行系数相加。 #### 概要设计 1. **链接存储结构**:通过链表结构...

    数据结构:线性表求一元多项式的值

    总的来说,通过使用C++的数据结构——线性表(在这里是`std::vector`),我们可以有效地存储和操作一元多项式,并方便地求解其值。这种方法体现了数据结构在解决实际问题中的重要作用,同时也展示了C++作为一种强大...

    一元多项式的表示及相加 严蔚敏

    本程序配合清华大学出版社 《数据结构(C语言版)》P39页 在WIT-TC下调试通过

    数据结构与算法分析(C++语言版)张琨 第二章线性表一元多项式代码

    例如,加法可以通过遍历两个多项式的项,对相同幂次的项进行相加来完成;乘法则更为复杂,通常采用Karatsuba算法或FFT(快速傅里叶变换)算法来提高效率。 在描述中提到,这些一元多项式代码已经在Visual Studio ...

    线性表(一元多项式四则运算)

    - **加法**:两个多项式相加,相同次数的项系数相加,不同次数的项保持不变。通过合并相同次数的项,可以简化结果多项式。 - **减法**:类似于加法,但需要将第二个多项式的系数取相反数后再进行加法运算。 - **...

    一元多项式相加完整实验报告.pdf

    这篇实验报告是关于一元多项式相加的,主要涵盖了数据结构中线性结构的应用,特别是在解决实际问题上的应用。报告详细介绍了实验的目标、需求分析、概要设计、详细设计以及源程序代码。 首先,实验内容是利用线性...

Global site tag (gtag.js) - Google Analytics