嚴蔚敏數據結構:鏈表實現一元多項式相加

一、基本概念

1、多項式pn(x)可表示成: ?pn(x)=a0+a1x+a2x2+…+anxn。

listP={(a0,e0),(a1,e1),(a2,e2),…,(an,en) }。在這種線性表描述中,各個結點包括兩個數據域,對應的類型描述為:

typedef struct node

{ double coef; ? ? ? ? ? ?//系數為雙精度型

? int expn; ? ? ? ? ? ? ? ?//指數為正整型
? struct node *next; ? ?//指針域
}polynode; ? ? ? ? ?




二、算法思想
對兩個一元多項式進行相加操作的運算規則是:假設指針qa和qb分別指向多項式A(x)和B(x)中當前進行比較的某個結點,則需比較兩個結點數據域的指數項,有三種情況:

(1) 指針qa所指結點的指數值<指針qb所指結點的指數值時,則保留qa指針所指向的結點,qa指針后移;
(2) 指針qa所指結點的指數值>指針qb所指結點的指數值時,則將qb指針所指向的結點插入到qa所指結點前,qb指針后移;
(3) 指針qa所指結點的指數值=指針qb所指結點的指數值時,將兩個結點中的系數相加。若和不為零,則修改qa所指結點的系數值,同時釋放qb所指結點;反之,從多項式A (x)的鏈表中刪除相應結點,并釋放指針qa和qb所指結點。



#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR -1
#define FALSE 0
#define TRUE 2
typedef int Status;typedef struct
{
float coef; //系數
int expn;   //指數
}term,ElemType;typedef struct LNode
{
ElemType data;
struct LNode *next;
}*Link,*Position;typedef struct
{
Link head,tail;
int len;
}LinkList;typedef LinkList polynomial; //用帶頭結點的有序鏈表表示多項式int cmp(term a,term b)
{
if(a.expn<b.expn) return -1;
else if(a.expn==b.expn) return 0;
else return 1;
}//cmpStatus InitList(polynomial &P)
{//構造一下空的線性鏈表
Link p;
p=(Link)malloc(sizeof(LNode));//生成頭結點
if(p){p->next=NULL;P.head=P.tail=p;P.len=0;return OK;}//
else return ERROR;
}//InitListPosition GetHead(polynomial P)
{
return P.head;
}//PositionStatus SetCurElem(Position h,term e)
{
h->data=e;
return OK;
}//SetCurElemStatus LocateElem(LinkList P,ElemType e,Position &q,int(*cmp)(ElemType,ElemType))
{
Link p=P.head,pp;
do{pp=p;p=p->next;}while(p&&(cmp(p->data,e)<0));if(!p||cmp(p->data,e)>0){q=pp;return FALSE;}//ifelse //find it{q=p;return TRUE;}//else
}Status MakeNode(Link &p,ElemType e)
{
p=(Link)malloc(sizeof(LNode));
if(!p) return ERROR;
p->data=e;
return OK;
}//MakeNodeStatus InsFirst(LinkList &P,Link h,Link s)
{
s->next=h->next;
h->next=s;
if(h==P.tail)
P.tail=h->next;
++P.len;
return OK;
}//InsFirstvoid CreatPolyn(polynomial &P,int m){//輸入m項的指數及系數,建立表示一元多項式的有序鏈表P
InitList(P);
Position h,q,s;
h=GetHead(P); //h指向P的頭結點
term e;
e.coef=0.0;
e.expn=-1;
SetCurElem(h,e);//設置頭結點的數據元素
printf("input the the value of m(indicate how many items)\n");
scanf("%d",&m);
printf("input (%d) ceof,expn(separated by ,)\n",m);
for(int i=1;i<=m;++i){scanf("%f,%d",&e.coef,&e.expn);if(!LocateElem(P,e,q,cmp)){if(MakeNode(s,e)) InsFirst(P,q,s);}//if不存在,則生成新結點并插入}//for
}//CreatPolynPosition NextPos(Link p)
{
return p->next;
}//NextPosElemType GetCurElem(Link p)
{
return p->data;
}//GetCurElemStatus DelFirst(LinkList L,Link h,Link &q)
{
q=h->next;
if(q)//非空鏈表{h->next=q->next;if(!h->next) //刪除尾結點L.tail=h;L.len--;return OK;}//ifelse return FALSE; //鏈表空}//DelFirstvoid FreeNode(Link &p)
{
free(p);
p=NULL;
}//FreeNodeStatus ListEmpty(LinkList L)
{
if(L.len)return FALSE;
else return TRUE;
}//ListEmptyStatus Append(LinkList &L,Link s)
{
int i=1;
L.tail->next=s;
while(s->next){s=s->next;i++;}//whileL.tail=s;
L.len+=i;
return OK;
}//Appendvoid PrintPolyn(polynomial P)
{
Link q;
q=P.head->next;
printf("系數  指數\n");
while(q){printf("%f   %d\n",q->data.coef,q->data.expn);q=q->next;}//while
}//PrintPolynStatus ClearList(LinkList &L)
{
Link q,p;
if(L.head!=L.tail){p=q=L.head->next;L.head->next=NULL;while(p!=L.tail){p=q->next;free(q);q=p;}//whilefree(q);L.tail=L.head;L.len=0;}//if
return OK;
}//ClearListStatus DestroyPolyn(LinkList &L)
{ // 銷毀線性鏈表L,L不再存在ClearList(L); // 清空鏈表FreeNode(L.head);L.tail=NULL;L.len=0;return OK;}//DestroyListvoid AddPolyn(polynomial &Pa,polynomial &Pb){ // 多項式加法:Pa=Pa+Pb,并銷毀一元多項式PbPosition ha,hb,qa,qb;term a,b;ha=GetHead(Pa);hb=GetHead(Pb); // ha和hb分別指向Pa和Pb的頭結點qa=NextPos(ha);qb=NextPos(hb); // qa和qb分別指向Pa和Pb中當前結點(現為第一個結點)while(qa&&qb){ // Pa和Pb均非空且ha沒指向尾結點(qa!=0)a=GetCurElem(qa);b=GetCurElem(qb); // a和b為兩表中當前比較元素switch(cmp(a,b)){case -1:ha=qa; // 多項式Pa中當前結點的指數值小qa=NextPos(ha); // ha和qa均向后移一個結點break;case 0: qa->data.coef+=qb->data.coef;// 兩者的指數值相等,修改Pa當前結點的系數值if(qa->data.coef==0) // 刪除多項式Pa中當前結點{DelFirst(Pa,ha,qa);FreeNode(qa);}elseha=qa;DelFirst(Pb,hb,qb);FreeNode(qb);qb=NextPos(hb);qa=NextPos(ha);break;case 1: DelFirst(Pb,hb,qb); // 多項式Pb中當前結點的指數值小InsFirst(Pa,ha,qb);ha=ha->next;qb=NextPos(hb);}}if(!ListEmpty(Pb)){Pb.tail=hb;Append(Pa,qb); // 鏈接Pb中剩余結點}DestroyPolyn(Pb); // 銷毀Pb}int main()
{
polynomial Pa,Pb;
int m;
CreatPolyn(Pa,m);
PrintPolyn(Pa);
printf("Pa.len: %d\n",Pa.len);
CreatPolyn(Pb,m);
PrintPolyn(Pb);
printf("Pb.len: %d\n",Pb.len);
AddPolyn(Pa,Pb);
PrintPolyn(Pa);
printf("Pa.len: %d\n",Pa.len);
return 1;
}




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453389.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java二十三設計模式之------工廠方法模式

一、工廠方法模式&#xff08;Factory Method&#xff09; 工廠方法模式有三種 1、普通工廠模式&#xff1a;就是建立一個工廠類&#xff0c;對實現了同一接口的一些類進行實例的創建。首先看下關系圖&#xff1a; 舉例如下&#xff1a;&#xff08;我們舉一個發送郵件和短信的…

無法轉化為項目財富的技術或功能就是垃圾

技術人員可能有個習慣&#xff0c;也可以叫通病&#xff0c;發現一個新技術&#xff0c;或者新的想法&#xff0c;會把某個現有的東西做的更好&#xff0c;或者可以增加某個功能讓系統看上去更完美。 如果這是一個產品&#xff0c;那么大家都會鼓勵你去做&#xff0c;如果我們…

ibatis oracle function,IBATIS調用oracle function(函數)的步驟實例

IBATIS調用oracle function(函數)的方法實例引用create or replace function getClassifiedCode(p_planCode in varchar2 -- 險種代碼,p_usageAttributeCode in varchar2 -- 使用性質代碼,p_ownershipAttributeCode in varchar2 -- 所屬性質代碼,p_vehicleTypeCode in varchar2…

一元多項式乘法算法

我認為大致算法應該是這樣的: 首先準備一個空的鏈表L。利用第一個多項式的的指針所指的節點數值乘以多項式二的每一項&#xff0c;將結果保存在鏈表L中。 然后將指向該節點的指針后移到下一個節點繼續進行乘法運算&#xff0c;將所得結果加到L中&#xff08;這個操作已經在一…

堆以及stl堆的使用

概念 性質: 1.堆是一顆完全二叉樹&#xff0c;用數組實現。 ???2.堆中存儲數據的數據是局部有序的。 最大堆&#xff1a;1.任意一個結點存儲的值都大于或等于其任意一個子結點中存儲的值。 ?????2.根結點存儲著該樹所有結點中的最大值。 最小堆&#xff1a;1.任意一個結…

讀【36歲IT老人再次隨筆】的讀后感,你會哪些計算機語言?

論壇首頁一篇&#xff1a;社區“揭穿最大謊言”事件 &#xff0c; 我看了&#xff0c;也順便看了里面另一位仁兄的【36歲IT老人再次隨筆】 其中關鍵的地方就是一個例子&#xff1a;你會哪些計算機語言&#xff1f; 這個問題很有意思&#xff0c;確實如網友回復里說到的&#xf…

php接收vue請求數據axios,詳解vue axios用post提交的數據格式

Content-type的幾種常見類型一、是什么&#xff1f;是Http的實體首部字段&#xff0c;用于說明請求或返回的消息主體是用何種方式編碼&#xff0c;在request header和response header里都存在。二、幾個常用類型&#xff1a;1、application/x-www-form-urlencoded這應該是最常見…

數據結構中的邏輯結構簡介

數據的邏輯結構是對數據之間關系的描述&#xff0c;有時就把邏輯結構簡稱為數據結構。邏輯結構形式地定義為&#xff08;K&#xff0c;R&#xff09;&#xff08;或&#xff08;D&#xff0c;S&#xff09;&#xff09;&#xff0c;其中&#xff0c;K是數據元素的有限集&#x…

applicationContext配置文件模板1

<?xml version"1.0" encoding"utf-8"?> <beans      --整個配置文件的根節點&#xff0c;包含一個或多個bean元素 xmlns    --最基本的命名空間定義 xmlns:xsi  --最基本的命名空間定義 xmlns:context  --啟動自動掃描或注解裝配…

時間復雜度的一些計算規則

一些規則(引自&#xff1a;時間復雜度計算 ) 1) 加法規則 T(n,m) T1(n) T2(n) O (max ( f(n),g(m) ) 2) 乘法規則 T(n,m) T1(n) * T2(m) O (f(n) * g(m)) 3) 一個特例&#xff08;問題規模為常量的時間復雜度&#xff09; 在大O表示法里面有一個特例&#xff0c;如…

職場新人面試誤區:我的技術好,所以你必須要請我?

這個是論壇的一個帖子。 前幾天有家軟件公司聯系到我&#xff0c;去之前電話里跟他們的項目經理聊了兩句&#xff0c;什么都明白了就沒去面試 是老板先給我打的電話&#xff0c;問我做J2EE多久了&#xff0c;期望薪水什么個范圍。。。 然后老板說&#xff0c;你稍等&#xff…

Oracle 基礎

為什么80%的碼農都做不了架構師&#xff1f;>>> Oracle DB筆錄&#xff0c;以后會不斷Add&#xff0c;歡迎留言補充! --cmd.exe(你懂得!) --[1]多個數據庫實例&#xff0c;切換選擇DB后&#xff0c;登錄操作 set ORACLE_SIDorcl --選擇DB orcl(你的DB實例名) --可在…

Linux執行命令提示Password,linux expect遠程自動登錄以及執行命令

linux遠程自動登錄以及執行命令遠程登錄該自動登錄的過程是通過shell里面expect實現的&#xff0c;類似相當于開了一個類似于cmd的命令段輸出IP和密碼。注意該腳本能夠執行的前提是安裝了expectyum install -y expect直接上腳本&#xff1a;#!/usr/bin/expect …

雙塔

## 雙塔 題目描述 有n個數字&#xff0c;要求將這n個數字分成兩部分&#xff08;兩部分可以數字個數不同&#xff09;&#xff0c;使得兩部分數字之和的差最小 輸入輸出格式 輸入&#xff1a; 第一行為n 第二行有n個數&#xff0c;即題目中所描述那樣 輸出&#xff1a; 兩部分和…

時間復雜度計算雜記

算法時間復雜度的計算 [整理] 時間復雜度算法 基本的計算步驟 時間復雜度的定義 一般情況下&#xff0c;算法中基本操作重復執行的次數是問題規模n的某個函數&#xff0c;用T(n)表示&#xff0c;若有某個輔助函數f(n)&#xff0c;使得當n趨近于無窮大時&#xff0c;T(n)/f(n…

MyBatis 在xml文件中處理大于號小于號的方法

為什么80%的碼農都做不了架構師&#xff1f;>>> 第一種方法&#xff1a;用轉義字符&#xff08;注&#xff1a;對大小寫敏感&#xff01; &#xff09; 用了轉義字符把>和<替換掉&#xff0c;然后就沒有問題了。 SELECT * FROM test WHERE 1 1 AND start_da…

linux 進程間讀寫鎖,Linux系統編程—進程間同步

我們知道&#xff0c;線程間同步有多種方式&#xff0c;比如&#xff1a;信號量、互斥量、讀寫鎖&#xff0c;等等。那進程間如何實現同步呢&#xff1f;本文介紹兩種方式&#xff1a;互斥量和文件鎖。##互斥量mutex我們已經知道了互斥量可以用于在線程間同步&#xff0c;但實際…

程序員:開汽車,難道我要知道汽車的原理才能把車開好嗎?

一個網友的迷惑&#xff1a; 我工作&#xff15;年了&#xff0c;一直做&#xff2a;&#xff12;&#xff25;&#xff25;的項目&#xff0c;前幾天去面試&#xff0c;一個人問我JDBC有幾種連接方式&#xff0c;這個問題這么多年以來我從來沒有遇見過&#xff0c;不知道大家 …

杭州某知名xxxx公司急招大量java以及大數據開發工程師

因公司戰略以及業務拓展&#xff0c;收大量java攻城獅以及大數據開發攻城獅. 職位信息&#xff1a; java攻城獅: https://job.cnblogs.com/offer/56032 大數據開發攻城獅: https://job.cnblogs.com/offer/56033 歡迎博客園的XDJM自薦和推薦&#xff01; 此招聘長期有效 歡迎留言…

35.6. /etc/dnsmasq.d/dnsmasq.address.conf

vim /etc/dnsmasq.d/dnsmasq.address.confaddress/www.mydomain.com/172.16.0.254deny domain address/www.facebook.com/127.0.0.1 address/www.google.com/127.0.0.135.6.1. 域名劫持 將域名解析到錯誤的地址&#xff0c;這樣可以屏蔽一些網站。 address/www.facebook.com/12…