Anwendung der einfach verketteten Liste: Addition und Subtraktion von Polynomen

Inhalt : 1. Vervollständige die Operation der Addition zweier Polynome. Es ist bekannt, dass es zwei Polynome P(x) und Q(x) gibt, und der Algorithmus ist so ausgelegt, dass er die Operation von P(x) + Q(x) realisiert, ohne erneut Platz für die Additionsoperation zu öffnen, d. h müssen mit einer verketteten Speicherstruktur implementiert werden.

             2. Vervollständige die Operation der Subtraktion zweier Polynome. Es ist bekannt, dass es zwei Polynome P(x) und Q(x) gibt, und ein Algorithmus ist entworfen, um die Operation von P(x) – Q(x) zu realisieren, ohne erneut Raum für die Subtraktionsoperation zu öffnen erforderlich, um eine verkettete Speicherstruktur zu realisieren.

Analyse von Algorithmen:

Algorithmus zum Addieren zweier Polynome: Speichern Sie zunächst die beiden Polynome in einer verketteten Liste. Setzen Sie zwei Zeiger A1 und B1, um sich von den ersten Knoten der Polynome P(x) bzw. Q(x) zu bewegen, vergleichen Sie die Exponenten exp der Knoten, auf die A1 und B1 zeigen, und behandeln Sie die folgenden drei Fälle:

① Wenn A1->exp < B1->exp, dann ist der Knoten, auf den A1 zeigt, ein Element eines Polynoms, und der Zeiger von A1 bewegt sich um eine Position auf der ursprünglichen Basis zurück.

②Wenn A1->exp = B1->exp, dann addiere die entsprechenden Koeffizienten, wenn die Summe der Koeffizienten Null ist, lasse den Knoten los, auf den A1 und B1 zeigen; wenn die Summe der Koeffizienten nicht Null ist, ändere den Knoten, auf den A1 zeigt Der Koeffizientenbereich des Punktes gibt den Knoten frei, auf den B1 zeigt.

③ Wenn A1 -> exp > B1 -> exp, dann ist der Knoten, auf den B1 zeigt, ein Element des Polynoms, und der B1-Zeiger bewegt sich auf der ursprünglichen Basis um eine Position zurück.

       Knotentyp:

coef

exp

nächste

Der Algorithmus zum Subtrahieren zweier Polynome ist derselbe.

Gliederungsdesign (verwendete Funktionen)

FunktionInit()

Initialisieren Sie eine leere verkettete Liste

Funktion CreateFromTail()

Tail-Einfügungsmethode zum Erstellen einer verknüpften Liste

Funktion Add(),Sub()

Implementieren Sie polynomiale Addition und Subtraktion

FunktionPrint()

Ausgangspolynom

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 typedef struct node
 {
 	int exp;
 	int coef;
 	struct node *next;
 }LNode,*LinkList;
 int Init(LinkList *head)//链表初始化 
 {
 	*head=(LinkList)malloc(sizeof(LNode));
 	if(*head)
 	{
 		(*head)->next=NULL;
 		return 1;
	 }
	else
	  return 0;
 }
 int CreatFromTail(LinkList *head)//尾插法创建链表 
 {
 	LNode *Temp,*Head;
 	int c;
 	int exp;
 	int i=1;
 	Head=*head;
 	scanf("%d,%d",&c,&exp);
 	while(c!=0)
 	{
 		Temp=(LinkList)malloc(sizeof(LNode));
 		if(Temp)
 		{
 			Temp->exp=exp;
 			Temp->coef=c;
 			Temp->next=NULL;
 			Head->next=Temp;
 			Head=Temp;
 			scanf("%d,%d",&c,&exp);
		 }
		 else
		   return 0;
	 }
	 return 1;
 }
 void Add(LinkList A,LinkList B)//加法 
 {
 	LNode *A1=A->next;
 	LNode *B1=B->next;
 	LNode *temp;
 	int sum=0;
 	while(A1&&B1)
 	{
 		if(A1->exp<B1->exp)//A1所指结点指数小于B1所指结点,将A1所指结点存入A并向后移动 
 		{
 			A->next=A1;
 			A=A->next;
 			A1=A1->next;
		 }
		else 
	if(A1->exp==B1->exp)//指数相同系数相加 
		 {
		 	sum=A1->coef+B1->coef;
		 	if(sum)//系数不为零,将结果存入A中,删除结点B1 
		 	{
		 		A1->coef=sum;
		 		A->next=A1;
		 		A=A->next;
		 		A1=A1->next;
		 		temp=B1;
				B1=B1->next;
				free(temp); 
			 }
			 else//系数为零,删除两个结点 
			 {
			 	temp=A1;
			 	A1=A1->next;
			 	free(temp);
			 	temp=B1;
			 	B1=B1->next;
			 	free(temp);
			 }
		 }
	else //A1所指结点指数大于B1所指结点,将B1所指结点存入A并B1向后移动 
		 {
		 	A->next=B1;
		 	A=A->next;
		 	B1=B1->next;
		 }
	 }
	 if(A1)//将剩余结点存入A中 
	   A->next=A1;
	 else
	   A->next=B1;
  } 
  
  void print(LinkList head)//输出多项式
  {
  	head=head->next;
  	while(head)
  	{
  		if(head->exp)
  		 printf("%dx^%d",head->coef,head->exp);
  		 else
  		 printf("%d",head->coef);
  		 if(head->next)
  		 printf("+");
  		 else
  		 break;
  		 head=head->next;
	  }
   } 
   void main()
   {
   	LinkList A;
   	LinkList B;
   	Init(&A);
   	Init(&B);
   	printf("输入第一个多项式的系数,指数例如(10,2) 输入0,0结束输入");
	CreatFromTail(&A);
	printf("输入第二个多项式的系数,指数例如(10,2) 输入0,0结束输入"); 
	CreatFromTail(&B);
	print(A);
	printf("\n");
	print(B);
	printf("\n");
	Add(A,B);
	printf("两个多项式相加的结果为:\n");
	print(A);
	printf("\n"); 
	Sub(A,B);
	printf("两个多项式相减的结果为:\n");
	print(A);
	printf("\n"); 
   }

Operation der Subtraktion:

void Sub(LinkList A,LinkList B)//减法
  {
  	LNode *A1=A->next;
  	LNode *B1=B->next;
  	LNode *temp;
  	int sum=0;
  	while(A1&&B1)
  	{
  		if(A1->exp<B1->exp)
  		{
  			A->next=A1;
  			A=A->next;
  			A1=A1->next;
		  }
		  else if(A1->exp==B1->exp)
		  {
		  	sum=A1->coef-B1->coef;
		  	if(sum)
		  	{
		  		A1->coef=sum;
			  	A->next=A1;
			  	A=A->next;
			  	A1=A1->next;
			  	temp=B1;
			  	B1=B1->next;
			  	free(temp);
		  		
			  }
			  else
			  {
			    temp=A1;
		  		A1=A1->next;
		  		free(temp);
		  		temp=B1;
		  		B1=B1->next;
		  		free(temp);
			  }
		  }
		  else
		  {
		  	A->next=B1;
		  	A=A->next;
		  	B1=B1->next;
		  }
	  }
  	if(A1)
  	A->next=A1;
  	else
  	A->next=B1;
   } 

Die Ausgabe der Addition:

 Die Ausgabe der Subtraktion:

Supongo que te gusta

Origin blog.csdn.net/weixin_54474126/article/details/121659980
Recomendado
Clasificación