A. c語言寫一個程序,用鏈表實現多項式相加相減
//要求:多項式按降冪排列
#include<stdafx.h>
#include<iostream.h>
structnode
{
intcoef;//系數
intexp;//指數
node*next;
};
node*h1=NULL;//第一個多項式的頭指針
node*h2=NULL;//第二個多項式的頭指針
node*insert(intc,inte)//創建一個系數為c,指數為e的結點,並返回其地址
{
node*newnode=newnode;//創建新結點
newnode->coef=c;//系數等於c
newnode->exp=e;//指數等於e
newnode->next=NULL;
returnnewnode;
}
node*create(node*h)
{
intcoef;
intexp;
charc;
cout<<"請輸入系數:";
cin>>coef;
cout<<"請輸入指數:";
cin>>exp;
h=insert(coef,exp);
cout<<"是否輸入完畢?(Y/N)";
cin>>c;
if(c=='y'||c=='Y')
{
returnh;//如果輸入完畢,返回頭指針地址
}
else
{
h->next=create(h->next);//否則遞歸建立下一個結點
returnh;//返回頭指針地址
}
}
node*(node*source)//將一個結點的內容復制到另一個結點,並返回該結點地址
{
if(source!=NULL)//如果源結點不為空
{
node*des=newnode;//創建新結點
des->coef=source->coef;//新結點的系數等於源結點的系數
des->exp=source->exp;//新結點的指數等於源結點的指數
des->next=NULL;
returndes;//返回新結點地址
}
returnNULL;
}
voidprint(node*head)//輸出頭指針為head的多項式鏈表
{
node*h=head;
if(h==NULL)
{
cout<<"0";//如果鏈表為空,輸出0
}
else
{
while(h->next!=NULL)//否則,當其下一個結點不為空時
{
if(h->exp==0)//如果指數為0,即常數
{
if(h->coef>0)//如果系數大於0
{
cout<<h->coef;//輸出系數
}
else
{
cout<<""<<h->coef;//否則,退一格(消除前面的+號),輸出系數
}
}
elseif(h->exp==1)//否則,如果指數為1
{
if(h->coef>0)//如果系數大於0
{
if(h->coef==1)//如果系數等於1
{
cout<<"x"<<"+";//輸出x+
}
else
{
cout<<h->coef<<"*x"<<"+";//否則,輸出相應的系數
}
}
else
{
if(h->coef==-1)//否則,如果系數等於-1
{
cout<<""<<"-x"<<"+";//退一格,輸出-x
}
else
{
cout<<""<<h->coef<<"*x"<<"+";//否則,退一格,輸出相應的系數
}
}
}
else//否則,指數大於1
{
if(h->coef>0)//如果系數大於0
{
if(h->coef==1)//如果系數等於1
{
cout<<"x"<<h->exp<<"+";
}
else
{
cout<<h->coef<<"*x"<<h->exp<<"+";
}
}
else
{
if(h->coef==-1)//否則,如果系數等於-1
{
cout<<""<<"-x"<<h->exp<<"+";
}
else
{
cout<<""<<h->coef<<"*x"<<h->exp<<"+";
}
}
}
h=h->next;
}
//輸出最後一項
if(h->exp==0)//如果指數為0,即常數
{
if(h->coef>0)//如果系數大於0
{
cout<<h->coef;//輸出系數
}
else
{
cout<<""<<h->coef;//否則,退一格,輸出系數
}
}
elseif(h->exp==1)//否則,如果指數為1
{
if(h->coef>0)//如果系數大於0
{
if(h->coef==1)//如果系數等於1
{
cout<<"x";//輸出x
}
else
{
cout<<h->coef<<"*x";
}
}
else
{
if(h->coef==-1)//否則,如果系數等於-1
{
cout<<""<<"-x";//退一格,輸出-x
}
else
{
cout<<""<<h->coef<<"*x";
}
}
}
else//否則,指數大於1
{
if(h->coef>0)//如果系數大於0
{
if(h->coef==1)//如果系數等於1
{
cout<<"x"<<h->exp;
}
else
{
cout<<h->coef<<"*x"<<h->exp;
}
}
else
{
if(h->coef==-1)//否則,如果系數等於-1
{
cout<<""<<"-x"<<h->exp;
}
else
{
cout<<""<<h->coef<<"*x"<<h->exp;
}
}
}
}
}
voidprints(node*p1,node*p2,node*r)//輸出相加結果,形如p1+p2=r
{
print(p1);
cout<<endl<<"+"<<endl;
print(p2);
cout<<endl<<"="<<endl;
print(r);
cout<<endl;
}
charcompare(node*n1,node*n2)//比較兩個結點的指數大小
{
if(n1->exp==n2->exp)
{
return'=';
}
elseif(n1->exp>n2->exp)
{
return'>';
}
else
{
return'<';
}
}
node*add(node*p1,node*p2)//計算兩個多項式相加,返回結果鏈表首地址
{
node*fr;
//如果有一個為空,就把另外一個鏈表其後的部分復制到結果鏈表的尾部
if(p1==NULL)
{
node*x=(p2);
node*temp=x;
while(p2!=NULL)
{
x->next=(p2->next);
x=x->next;
p2=p2->next;
}
returntemp;
}
elseif(p2==NULL)
{
node*x=(p1);
node*temp=x;
while(p1!=NULL)
{
x->next=(p1->next);
x=x->next;
p1=p1->next;
}
returntemp;
}
//如果都不為空
else
{
switch(compare(p1,p2))//比較兩個結點的指數大小
{
case'='://相等
if(p1->coef+p2->coef!=0)//如果系數和不為0
{
fr=insert(p1->coef+p2->coef,p1->exp);//新結點的系數為兩個結點的系數和,指數為這兩個結點的指數
fr->next=add(p1->next,p2->next);
returnfr;
}
else
{
fr=add(p1->next,p2->next);//否則,新結點地址為這兩個結點之後的部分鏈表的和鏈表的首地址
returnfr;
}
case'>'://大於
fr=(p1);//新結點的內容與p1相同
fr->next=add(p1->next,p2);//以p1->next為新的p1,遞歸調用add,創建鏈表餘下的部分
returnfr;
case'<'://小於
fr=(p2);//新結點的內容與p2相同
fr->next=add(p1,p2->next);//以p2->next為新的p2,遞歸調用add,創建鏈表餘下的部分
returnfr;
default:
returnNULL;
}
}
}
voidmain(void)
{
cout<<"先建立第一個多項式:"<<endl;
h1=create(h1);
cout<<"再建立第二個多項式:"<<endl;
h2=create(h2);
cout<<"和:"<<endl;
prints(h1,h2,add(h1,h2));
}
B. 兩個多項式相加運算(用c語言)
#include<stdio.h>
#include<malloc.h>
#define Null 0
typedef struct Node
{
int coeff;
int expo;
Node *next;
}listNode,*list;
list createList()
{
list head;
head = (list)malloc(sizeof(listNode));
head = NULL;
printf("want to create a new node?y/n\n");
char ch;
fflush(stdin);
scanf("%c",&ch);
while(ch=='Y' || ch== 'y')
{
list p;
p = (list)malloc(sizeof(listNode));
printf("input coeff\n");
int coeff;
scanf("%d",&coeff);
p->coeff = coeff;
printf("input expo\n");
int expo;
scanf("%d",&expo);
p->expo = expo;
p->next = NULL;
//鏈表為空的時候,即添加首個元素
if(head == NULL)
{
head=p;//添加代碼
}
else
{
list prev,curr;
curr = head;
prev = NULL;
//找到添加位置
while(curr!=NULL && curr->expo>p->expo)
{
prev=curr;
curr=curr->next;//添加代碼
}
if(curr!=NULL && curr->expo == p->expo)
{
curr->coeff = curr->coeff + p->coeff;
printf("want to create a new node?y/n\n");
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y' || ch== 'y')
continue;
else
return head;
}
//插入結點,結點非首
if(prev != NULL)
{
p->next=curr;
prev->next=p;
//添加代碼
}
//插入結點,結點為首
else
{
p->next=curr;
head=p;
//添加代碼
}
}
printf("want to create a new node?y/n\n");
fflush(stdin);
scanf("%c",&ch);
}
return head;
}
list add(list head1,list head2)
{
list head,newNode,ptr1,ptr2,ptr3;
ptr1 = head1;
ptr2 = head2;
head = NULL;
while(ptr1 != NULL && ptr2 != NULL)
{
newNode = (list)malloc(sizeof(listNode));
if(ptr1->expo > ptr2->expo)
{
newNode->coeff = ptr1->coeff;
newNode->expo = ptr1->expo;
newNode->next = NULL;
ptr1 = ptr1->next;
}
else if(ptr1->expo < ptr2->expo)
{
newNode->coeff = ptr2->coeff;
newNode->expo = ptr2->expo;
newNode->next = NULL;
ptr2 = ptr2->next;//添加代碼
}
else
{
newNode->coeff = ptr1->coeff + ptr2->coeff;
newNode->expo = ptr1->expo;
newNode->next = NULL;
ptr1 = ptr1->next;
ptr2 = ptr2->next;
}
if(head==NULL)
{
head = newNode;
}
else
{
ptr3 = head;
//添加代碼
while(ptr3->next != NULL)
ptr3 = ptr3->next;
ptr3->next = newNode;
}
}
while(ptr1 != NULL)
{
newNode = (list)malloc(sizeof(listNode));
newNode->coeff = ptr1->coeff;
newNode->expo = ptr1->expo;
newNode->next = NULL;
ptr3 = head;
if(ptr3 == NULL)
head = ptr3 = newNode;
else
{
while(ptr3->next != NULL)
ptr3 = ptr3->next;
ptr3->next = newNode;//添加代碼
}
ptr1 = ptr1->next;
}
while(ptr2 != NULL)
{
newNode = (list)malloc(sizeof(listNode));
newNode->coeff = ptr2->coeff;
newNode->expo = ptr2->expo;
ptr3 = head;
if(ptr3 == NULL)
head = ptr3 = newNode;
else
{
while(ptr3->next != NULL)
ptr3 = ptr3->next;
ptr3->next = newNode;
}
ptr2 = ptr2->next;
}
return head;
}
void display(list head)
{
list ptr = head;
while(ptr != NULL)
{
if(ptr != head )
printf("+");
printf("%d",ptr->coeff);
printf("x^");
printf("%d",ptr->expo);
ptr = ptr->next;
}
printf("\n");
}
int main(int argc, char* argv[])
{
list head,head1,head2;
printf("input the first list\n");
head1 = createList();
display(head1);
printf("input the second list\n");
head2 = createList();
display(head2);
head = add(head1,head2);
display(head);
return 0;
}
C. 用C語言鏈表實現多元多項式及其乘法,加法。
用C語言鏈表實現多項式, 例如f(x_{i,k}^{l})=3+x_{1,2}^2x_{3,2}+x_{1,3}x_{4,3}^3 (變數x_{i,k}^{l}有3個指標i,k,l, i,k,l可以取遍1到n的整數)。要求多項式由鍵盤輸入,用鏈表存儲單項式(節點是x_{i,k}^{l}),用鏈表存儲多項式(節點是單項式)。編寫3個函數分別是實現多項式加法,乘法的函數,以及輸出多項式的函數。
D. 數據結構(C語言)用單鏈表存儲一元多項式,並實現兩個多項式的相加運算,怎麼做
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
/*單項鏈表的聲明*/
typedef struct PolynNode{
int coef; // 系數
int expn; // 指數
struct PolynNode *next; }PolynNode,*PolynList;
/*正位序(插在表尾)輸入n個元素的值,建立帶表頭結構的單鏈線性表*/
/*指數系數一對一對輸入*/ void CreatePolyn(PolynList &L,int n)
{
int i;
下載
原文檔已轉碼為如下格式,以便移動設備查看
數據結構(c語言)用單鏈表存儲一元多項式,並實現兩個多項式的相加運算【最新】
閱讀:1037次 頁數:36頁 2016-03-21 舉報
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
/*單項鏈表的聲明*/
typedef struct PolynNode{
int coef; // 系數
int expn; // 指數
struct PolynNode *next; }PolynNode,*PolynList;
/*正位序(插在表尾)輸入n個元素的值,建立帶表頭結構的單鏈線性表*/
/*指數系數一對一對輸入*/ void CreatePolyn(PolynList &L,int n)
{
int i;
PolynList p,q;
L=(PolynList)malloc(sizeof(PolynNode)); // 生成頭結點
L->next=NULL;
q=L;
printf("成對輸入%d個數據 ",n);
for(i=1;i<=n;i++)
{
p=(PolynList)malloc(sizeof(PolynNode));
scanf("%d%d",&p->coef,&p->expn); //指數和系數成對輸入
q->next=p;
q=q->next;
}
p->next=NULL;
}
// 初始條件:單鏈表L已存在
// 操作結果: 依次對L的每個數據元素調用函數vi()。一旦vi()失敗,則操作失敗
void PolynTraverse(PolynList L,void(*vi)(ElemType, ElemType)) {
PolynList p=L->next;
while(p)
{
vi(p->coef, p->expn);
if(p->next)
{
printf(" + "); //「+」號的輸出,最後一項後面沒有「+」
}
p=p->next;
}
printf(" ");
}
/*ListTraverse()調用的函數(類型要一致)*/ void visit(ElemType c, ElemType e) {
if(c != 0)
{
printf("%dX^%d",c,e); //格式化輸出多項式每一項
}
}
/* 多項式相加,原理:歸並 */ /* 參數:兩個已經存在的多項式 */ /* 返回值:歸並後新的多項式的頭結點 */
PolynList MergeList(PolynList La, PolynList Lb) {
PolynList pa, pb, pc, Lc;
pa = La->next;
pb = Lb->next;
Lc = pc = La; // 用La的頭結點作為Lc的頭結點
while(pa&&pb)
{
if(pa->expn < pb->expn)
{
pc->next = pa; //如果指數不相等,pc指針連上指數小的結
點,
pc = pa;
pa = pa->next; //指向該結點的指針後移
}
else if (pa ->expn > pb->expn )
{
pc->next = pb; //pc指針連上指數小的結點,
pc = pb;
pb = pb->next; //指向該結點的指針後移
}
else //(pa ->expn = pb->expn )
{
pa->coef = pa->coef + pb->coef; //指數相等時,系數相加
pc->next = pa;
pc = pa;
pa = pa->next; //兩指針都往後移
pb = pb->next;
}
}
pc->next = pa ? pa:pb; // 插入剩餘段
return Lc;
}
void main()
{
PolynList ha,hb,hc;
printf("非遞減輸入多項式ha, ");
CreatePolyn(ha,5); // 正位序輸入n個元素的值
printf("非遞減輸入多項式hb, ");
CreatePolyn(hb,5); // 正位序輸入n個元素的值
E. C語言用鏈表實現一元多項式的相加
C語言代碼:
#include"stdio.h"
#include"malloc.h"
/*鏈表結點結構*/
typedefstructLNode{
doublecoef;/*系數*/
intexp;/*指數*/
structLNode*next;
}LNode;
/*初始化鏈表*/
LNode*Init()
{
LNode*head=(LNode*)malloc(sizeof(LNode));
head->next=NULL;
returnhead;
}
/*將值為data的結點插入到head鏈表的最後*/
voidAddNode(LNode*head,doublecoef,intexp)
{
LNode*pre=head->next;
LNode*temp;
temp=(LNode*)malloc(sizeof(LNode));
temp->coef=coef;
temp->exp=exp;
temp->next=NULL;
if(pre==NULL)
{
head->next=temp;
return;
}
for(;pre->next!=NULL;pre=pre->next);
pre->next=temp;
}
/*輸出head鏈表的所有結點的值*/
voidList(LNode*head)
{
LNode*curr;
printf("Allnodes:");
for(curr=head->next;curr!=NULL;curr=curr->next)
{
printf("(%lf,%d) ",curr->coef,curr->exp);
}
printf(" ");
}
/*返回head鏈表的所有結點的數量*/
intSize(LNode*head)
{
intlen=0;
LNode*curr;
for(curr=head->next;curr!=NULL;curr=curr->next,len++);
returnlen;
}
LNode*Add(LNode*headA,LNode*headB)
{
LNode*currA,*currB,*headC;
doublesum;
currA=headA->next;
currB=headB->next;
headC=Init();
while(currA!=NULL&&currB!=NULL)
{
if(currA->exp>currB->exp)
{
AddNode(headC,currA->coef,currA->exp);
currA=currA->next;
}
elseif(currA->exp<currB->exp)
{
AddNode(headC,currB->coef,currB->exp);
currB=currB->next;
}
else
{
sum=currA->coef+currB->coef;
if(sum!=0)
{
AddNode(headC,sum,currA->exp);
}
currA=currA->next;
currB=currB->next;
}
}
while(currA!=NULL)
{
AddNode(headC,currA->coef,currA->exp);
currA=currA->next;
}
while(currB!=NULL)
{
AddNode(headC,currB->coef,currB->exp);
currB=currB->next;
}
returnheadC;
}
voidmain()
{
LNode*headA,*headB,*headC;
headA=Init();
headB=Init();
AddNode(headA,1.0,5);
AddNode(headA,-1.0,3);
AddNode(headA,1,0);
AddNode(headB,0.5,5);
AddNode(headB,1.0,4);
AddNode(headB,1.0,3);
List(headA);
List(headB);
headC=Add(headA,headB);
List(headC);
}
運行測試:
F. 多項式相加 鏈表 C語言
#include#includestructnode{
intcoef; //系數
intindex; //指數
structnode*next;
};
//初始化linklist
structnode*init_ll(){
structnode*p;
p=(structnode*)malloc(sizeof(structnode)); //為節點指針分配內存空間
p->next=NULL; //*為節點的next值賦值為NULL方便表的遍歷,作為遍歷為結尾的判斷條件
returnp; //返回指針,便於操作
}
//頭插法插入linklist
voidinsert_ll(structnode*head,intcoef,intindex){
structnode*p;
p=(structnode*)malloc(sizeof(structnode)); //為節點指針分配內存空間
p->coef=coef; //實例化系數
p->index=index; //實例化指數
p->next=head->next; //*該節點的next指針指向head指向的節點
head->next=p; //*插入在頭指針的後面
}
//列印輸出linklist
voidreverse_ll(structnode*head){
structnode*p;
p=head->next;
while(p!=NULL){ //為空時結束循環
printf("%d次項系數為%d",p->index,p->coef); //列印輸出
p=p->next; //指針迭代,進行循環輸出
}
printf(" ");
}
//銷毀linklist釋放空間
voiddestory_ll(structnode*head){
structnode*p,*q;
p=head->next;
while(p!=NULL){
q=p;
p=p->next;
free(q);
}
free(head);
}
//兩個多項式進行相加操作
voidadd_poly(structnode*head1,intlength1,structnode*head2,intlength2){
structnode*p1;
structnode*p2;
if(length1>length2){
p1=head1->next;
p2=head2->next;
while(p1!=NULL){
if(p1->index==p2->index){
p1->coef=(p1->coef)+(p2->coef);
p2=p2->next;
}
p1=p1->next;
}
}
else{
p1=head1->next;
p2=head2->next;
while(p2!=NULL){
if(p1->index==p2->index){
p2->coef=(p2->coef)+(p1->coef);
p1=p1->next;
}
p2=p2->next;
}
}
}
//兩個多項式進行相減操作
voidsub_poly(structnode*head1,intlength1,structnode*head2,intlength2){
structnode*p1;
structnode*p2;
if(length1>length2){
p1=head1->next;
p2=head2->next;
while(p1!=NULL){
if(p1->index==p2->index){
p1->coef=(p1->coef)-(p2->coef);
p2=p2->next;
}
p1=p1->next;
}
}
else{
p1=head1->next;
p2=head2->next;
while(p2!=NULL){
p2->coef=-(p2->coef);
if(p1->index==p2->index){
p2->coef=(p2->coef)+(p1->coef);
p1=p1->next;
}
p2=p2->next;
}
}
}
main(void){
structnode*head1; //多項式1頭節點
structnode*head2; //多項式2頭節點
intindex_current=0; //要輸入的指數
intcoef_current=0; //要輸入的系數
intindex_max1; //多項式1次數
intindex_max2; //多項式2次數
int i=0; //循環控制變數
head1=init_ll();
printf("-請輸入第一個多項式的次數- ");
scanf_s("%d",&index_max1);
for(i=0;i<index_max1;i++){
printf("-請輸入%d次項系數:",index_current);
scanf_s("%d",&coef_current);
insert_ll(head1,coef_current,index_current); //頭插法
index_current++;
}
head2=init_ll();
index_current=0;
printf("-請輸入第二個多項式的次數- ");
scanf_s("%d",&index_max2);
for(i=0;i<index_max2;i++){
printf("-請輸入%d次項系數:",index_current);
scanf_s("%d",&coef_current);
insert_ll(head2,coef_current,index_current); //頭插法
index_current++;
}
add_poly(head1,index_max1,head2,index_max2); //進行相加操作
//sub_poly(head1,index_max1,head2,index_max2); //進行相減操作
printf("多項式1的結果為:");
reverse_ll(head1);
printf("多項式2的結果為:");
reverse_ll(head2);
destory_ll(head1);
destory_ll(head2);
getchar();
getchar();
}