国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【鏈表應(yīng)用】| 一元多項式的操作

這篇具有很好參考價值的文章主要介紹了【鏈表應(yīng)用】| 一元多項式的操作。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

專欄推薦:寫文章剛剛起步,各個專欄的知識點后續(xù)會補充完善,不斷更新好文,希望大
家支持一下。

專欄 名字
Elasticsearch專欄 es
spring專欄 spring開發(fā)
redis專欄 redis學習筆記
項目專欄 項目集錦
修bug專欄 bug修理廠

【鏈表應(yīng)用】| 一元多項式的操作

一. ?? 要求:

設(shè)有兩個一元多項式:
p(x)=p0+p1x+p2x2+···+pnxn
q(x)=q0+q1x+q2x2+···+qmxm
多項式項的系數(shù)為實數(shù),指數(shù)為整數(shù),設(shè)計實現(xiàn)一元多項式操作的程序:

  1. 多項式鏈表建立:以(系數(shù),指數(shù))方式輸入項建立多項式,返回所建立的鏈表的頭結(jié)點;
  2. 多項式排序: 將所建立的多項式按指數(shù)非遞減(從小到大) 進行排序
  3. 多項式相加: 實現(xiàn)兩個多項式相加操作。操作生成一個新的多項式,原有的兩個多項式不變,返回生成的多項式的頭指針;
  4. 多項式的輸出: 按照po+p1x+p2x2+···+pnxn 格式輸出多項式;

二. 代碼實現(xiàn)(Java & c)

1. Java實現(xiàn)

Java是一時興起創(chuàng)作,有bug希望提出!

public class SingleLinkedList {

     class Node{
        private Integer cof;            //系數(shù)
        private Integer exp;            //指數(shù)
        private Node next;
        public Node(Integer cof,Integer exp,Node next){
            this.cof = cof;
            this.exp = exp;
            this.next = next;
        }

        public Integer getCof() {
            return cof;
        }

        public void setCof(Integer cof) {
            this.cof = cof;
        }

        public Integer getExp() {
            return exp;
        }

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

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }
    }
    private Node head;      //存放頭結(jié)點
    private int size;       //記錄元素個數(shù)

    private Node getTail(){
        if (this.head == null) return null;
        Node node = this.head;
        while(node.next != null){
            node = node.next;
        }
        return node;
    }

    /**
     * 添加元素
     * @param cof
     * @param exp
     */
    public void add(Integer cof,Integer exp){
        Node tail = getTail();
        Node node = new Node(cof,exp,null);
        if (tail == null){
            this.head = node;
        }else {
            tail.next = node;
        }
        this.size++;
    }

    /**
     * 獲取元素
     * @param index
     * @return
     */
    public Node getNode(int index){
        checkIndex(index);
        Node node = this.head;
        for (int i = 0;i<index;i++){
            node = node.next;
        }
        return node;
    }

    /**
     * 檢查index合法性
     * @param index
     * @throws IndexOutOfBoundsException
     */
    private void checkIndex(int index) throws IndexOutOfBoundsException {
        if(index < 0 || index >= this.size){
            throw  new IndexOutOfBoundsException(index+"指針溢出");
        }
    }

    public Node getHead() {
        return head;
    }

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

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
    public void sort(){
        Node p,q;
        int temp1;
        int temp2;
        for(p=this.head;p != null;p = p.next){
            for (q = p.next;q != null;q = q.next){
                if(p.exp > q.exp){
                    temp1 = p.exp;
                    p.exp = q.exp;
                    q.exp = temp1;

                    temp2 = p.cof;
                    p.cof = q.cof;
                    q.cof = temp2;
                }
            }
        }
    }


    public Node addMethod(Node head1,Node head2){
        Node node = new Node(-1,-1,null);
        Node p = head1,q = head2 ,b = node;
        while (p != null && q != null){
            if (p.exp == q.exp){
                int res = p.cof+q.cof;
                Node node1 = new Node(res, p.exp, null);
                b.next = node1;
                b = node1;
                p = p.next;
                q = q.next;

            }else if (p.exp < q.exp){
                b.next = p;
                b = b.next;
                p = p.next;

            }else{
                b.next = q;
                b = b.next;
                q = q.next;
            }
        }
        if (p != null){
            b.next = p;
        }else {
            b.next = q;
        }
        return node.next;
    }


}

2.C語言實現(xiàn)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct 
{
	float radio;				//系數(shù)
	int index;					//指數(shù)
}Data;


typedef struct node
{
	Data data;					//數(shù)據(jù)域
	struct Node* next;			//指針域
	struct Node* prev;
}Node;


static char scan[100];
char* SetScan(char* str)
{
	
	strcpy(scan, str);
	int i ;
	for (i = 0; i <= strlen(str) - 1; i++)
	{
		if (str[i] == '(' || str[i] == ')'||str[i]==',')
		{
			scan[i] = ' ';
		}
	}
	return scan;
}
void SetPol(Node ** head,int tindex,double tradio)
{
	
	Data temp;
	temp.index = tindex;
	temp.radio = tradio;
	Node* curr = NULL,*tail = *head,*prev = *head;
	if(*head)
		for (; tail->next; tail = tail->next)
		{
			prev = last->next;
		}
	if (*head != NULL)
	{
		curr= (Node*)malloc(sizeof(Node));
		curr->data = temp;
		curr->next = NULL;
		curr->prev = NULL;
		*head = curr;
	}
	else
	{
		curr = (Node*)malloc(sizeof(Node));
		curr->data = temp;
		curr->next = NULL;
		curr->prev = prev;
		tail->next = curr;
	}
	
}
void DeleteNode(Node **curr)
{
	if ((*now)->prev)
	{
		Node* temp = (*curr)->prev;
		temp->next = (*curr)->next;
		*curr = (*curr)->prev;

	}
	else
	{
		Node *temp = *curr;
		*curr = NULL;
		free(temp);
	}
	
}
void ArrPol(Node **head)
{
	Data temp;
	Node *p1 = *head;
	Node *p2 = *head; 
	for(p1 = *head;p1;p1=p1->next)
		for (p2 = p1; p2; p2 = p2->next)
		{
			if (p1->data.index > p2->data.index)
			{
				temp = p1->data;
				p1->data = p2->data;
				p2->data = temp;
			}
			else if (p1->data.index == p2->data.index&&p1!=p2)
			{
				p1->data.radio += p2->data.radio;
				DeleteNode(&p2);
			}
		}
}
Node* merge_pol(Node* head1,Node* head2,int op)
{
	Node* p1 = head1, * p2 = head2;
	static Node* head = NULL;
	head = NULL;
	while (p1 || p2)
	{
		if (p1)
		{
			if (!p2 || p1->data.index < p2->data.index)
			{
				set_pol(&head, p1->data.index, p1->data.radio);
				p1 = p1->next;
			}
			else if (p2 && p1->data.index == p2->data.index)
			{
				if (!op) SetPol(&head, p1->data.index, p1->data.radio + p2->data.radio);
				else SetPol(&head, p1->data.index, p1->data.radio - p2->data.radio);
				p1 = p1->next;
				p2 = p2->next;
			}
		}
		if (p2)
		{
			if (!p1 || p1->data.index > p2->data.index)
			{
				if (!op)	SetPol(&head, p2->data.index, p2->data.radio);
				else SetPol(&head, p2->data.index, -p2->data.radio);
				p2 = p2->next;
			}
			else if (p1 && p1->data.index == p2->data.index)
			{
				if (!op) SetPol(&head, p1->data.index , p1->data.radio + p2->data.radio);
				else SetPol(&head, p1->data.index, p1->data.radio - p2->data.radio);
				p1 = p1->next;
				p2 = p2->next;
			}
		}
	}
	return head;
}
void print(Node* head)
{
	Node* curr;
	int flag = 0;
	for (curr = head; curr; curr = curr->next)
	{
		if (curr->data.radio)
		{
			if (!flag)

			{
				printf("%.2g", curr->data.radio);
				flag = 1;
			}
			else
			{
				printf("%+.2g", now->data.radio);
			}
			if (now->data.index)
				printf("x%d", now->data.index);
		}
		
	}
}
int main()
{
	Node* head1=NULL, *head2=NULL, *head=NULL;
	printf("請按照“(系數(shù),指數(shù))”的形式輸入第一個多項式,輸入“()”以結(jié)束\n");
	float radio;
	int index;
	char str[100] = { 0 };
	while (scanf("%s", str) &&strcmp(str,"()"))
	{
		strcpy(scan,set_scan(str));
		sscanf(scan, "%lf %d", &radio, &index);
		SetPol(&head1, radio, index);
	}
	printf("請按照“系數(shù) 指數(shù)”的形式輸入第二個多項式,輸入“()”以結(jié)束\n");
	while (scanf("%s", str) && strcmp(str, "()"))
	{
		strcpy(scan, set_scan(str));
		sscanf(scan,"%lf %d", &radio, &index);
		set_pol(&head2, radio, index);
	}
	ArrPol(&head1);
	ArrPol(&head2);

	printf("多項式相加所得結(jié)果為\n");
	head = merge_pol(head1, head2, 0);
	print(head);
	printf("多項式相減所得結(jié)果為\n");
	head = merge_pol(head1, head2, 1);
	print(head);
	
	return 0;
}

【鏈表應(yīng)用】| 一元多項式的操作

三. ?? 總結(jié)

下面是一些雙向鏈表應(yīng)用場景:
雙向鏈表是一種數(shù)據(jù)結(jié)構(gòu),它允許在列表中快速、高效地添加、刪除和查找元素。與單向鏈表不同,雙向鏈表允許在每個節(jié)點中存儲一個指向前一個節(jié)點和一個指向后一個節(jié)點的指針。這使得雙向鏈表具有許多優(yōu)點和應(yīng)用,如下所述。

  1. 實現(xiàn)LRU緩存算法:LRU(最近最少使用)緩存算法是一種在計算機內(nèi)存中向硬盤存儲一些數(shù)據(jù)的方法,它會在內(nèi)存滿了之后替換最近最少使用的數(shù)據(jù)。在這種情況下,雙向鏈表可用于實現(xiàn)快速的插入和刪除操作,從而使LRU緩存算法更加高效。

  2. 實現(xiàn)雙端隊列:雙端隊列是一種數(shù)據(jù)結(jié)構(gòu),它允許在隊列的兩端進行插入和刪除操作。雙向鏈表可以用于實現(xiàn)雙端隊列,因為它可以在列表的兩端進行添加和刪除操作。

  3. 實現(xiàn)哈希表:哈希表是一種常用的數(shù)據(jù)結(jié)構(gòu),在其中存儲鍵和值的映射關(guān)系。哈希表通常使用鏈表來解決哈希沖突,而雙向鏈表可以用于實現(xiàn)這種鏈表,因為它允許快速的插入和刪除操作。

  4. 實現(xiàn)文本編輯器:文本編輯器通常需要處理文本的插入和刪除操作。雙向鏈表可以用于實現(xiàn)文本編輯器,因為它可以在列表中添加、刪除和移動文本的節(jié)點,從而實現(xiàn)高效的文本操作。

總之,雙向鏈表是一種非常優(yōu)秀且常用的數(shù)據(jù)結(jié)構(gòu),它可以用于解決各種問題和應(yīng)用程序。不過,雙向鏈表也有一些缺點,例如它需要額外的存儲空間以存儲指向前一個節(jié)點的指針,這會增加存儲成本。在使用雙向鏈表時,需要根據(jù)具體應(yīng)用場景進行權(quán)衡和選擇。
一個簡單的鏈表操作應(yīng)用,希望你喜歡文章來源地址http://www.zghlxwxcb.cn/news/detail-460210.html

到了這里,關(guān)于【鏈表應(yīng)用】| 一元多項式的操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 一元多項式相加問題(兩種方法)

    一元多項式相加問題(兩種方法)

    一元多項式的相加問題,主要運用了線性結(jié)構(gòu)的合并,在合并線性結(jié)構(gòu)的基礎(chǔ)上,增加判斷,所以我們可以將這個問題理解為一個復雜的線性表合并問題? 目錄 問題描述 一、順序表法 1.1 初始化并創(chuàng)建順序表 1.2 一元多項式相加算法 1.3 完整代碼 二、單鏈表法 1.1 初始化并創(chuàng)

    2024年02月06日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)】一元多項式的表示及相加

    【數(shù)據(jù)結(jié)構(gòu)】一元多項式的表示及相加

    ??博客主頁: 程序員好冰 ??歡迎 【點贊?? 關(guān)注?? 收藏?? 留言??】 ??本文由 程序員好冰 原創(chuàng),CSDN 首發(fā)! ??入站時間: ??2022 年 07 月 13 日?? ?? 是非不入松風耳,花落花開只讀書。 ??推薦書籍:??《Java編程思想》,??《Java 核心技術(shù)卷》 ??參考在線編程網(wǎng)

    2024年02月11日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)(嚴蔚敏)【一元多項式的運算】【C語言】

    數(shù)據(jù)結(jié)構(gòu)(嚴蔚敏)【一元多項式的運算】【C語言】

    1、一元多項式的運算:實現(xiàn)兩個多項式加、減乘運算 設(shè)計內(nèi)容: 用順序存儲結(jié)構(gòu)實現(xiàn)一元多項式的加法、減法和乘法。具體要求為:用五個函數(shù)分別實現(xiàn)一元多項式的創(chuàng)建、輸出、加法、減法和乘法; 設(shè)計思路: 將順序表數(shù)組下標作為多項式的指數(shù)項,數(shù)組內(nèi)的數(shù)據(jù)元素

    2023年04月15日
    瀏覽(39)
  • 一元稀疏多項式簡單計算器(C語言)含注釋

    一元稀疏多項式簡單計算器(C語言)含注釋

    問題描述 設(shè)計一個一元稀疏多項式簡單計算器 基本要求 一元稀疏多項式簡單計算器的基本功能是: (1)輸入并建立多項式; (2)輸出多項式,輸出形式為整數(shù)序列:n,c1,e1,c2,e2,……,cn,en,其中n是多項式的項數(shù),ci和ei分別是第i項的系數(shù)和指數(shù),序列按指數(shù)降序排列; (

    2024年02月08日
    瀏覽(18)
  • PTA 習題3.6 一元多項式的乘法與加法運算

    PTA 習題3.6 一元多項式的乘法與加法運算

    設(shè)計函數(shù)分別求兩個一元多項式的乘積與和。 輸入格式: 輸入分2行,每行分別先給出多項式非零項的個數(shù),再以指數(shù)遞降方式輸入一個多項式非零項系數(shù)和指數(shù)(絕對值均為不超過1000的整數(shù))。數(shù)字間以空格分隔。 輸出格式: 輸出分2行,分別以指數(shù)遞降方式輸出乘積多項式

    2024年02月07日
    瀏覽(23)
  • Python做曲線擬合(一元多項式擬合及任意函數(shù)擬合)

    Python做曲線擬合(一元多項式擬合及任意函數(shù)擬合)

    目錄 1. 一元多項式擬合 使用方法?np.polyfit(x, y, deg) 2. 任意函數(shù)擬合 使用 curve_fit() 方法 實例: (1)初始化 x 和 y 數(shù)據(jù)集 (2)建立自定義函數(shù) (3)使用自定義的函數(shù)生成擬合函數(shù)繪圖? polyfig 使用的是最小二乘法,用于擬合一元多項式函數(shù)。 參數(shù)說明: x 就是x坐標,

    2024年02月02日
    瀏覽(27)
  • 題02-線性結(jié)構(gòu)2 一元多項式的乘法與加法運算(C語言)

    題02-線性結(jié)構(gòu)2 一元多項式的乘法與加法運算(C語言)

    設(shè)計函數(shù)分別求兩個一元多項式的乘積與和。 輸入格式: 輸入分2行,每行分別先給出多項式非零項的個數(shù),再以指數(shù)遞降方式輸入一個多項式非零項系數(shù)和指數(shù)(絕對值均為不超過1000的整數(shù))。數(shù)字間以空格分隔。 輸出格式: 輸出分2行,分別以指數(shù)遞降方式輸出乘積多項式

    2024年02月07日
    瀏覽(18)
  • 浙大數(shù)據(jù)結(jié)構(gòu)第二周02-線性結(jié)構(gòu)2 一元多項式的乘法與加法運算

    設(shè)計函數(shù)分別求兩個一元多項式的乘積與和。 輸入格式: 輸入分2行,每行分別先給出多項式非零項的個數(shù),再以指數(shù)遞降方式輸入一個多項式非零項系數(shù)和指數(shù)(絕對值均為不超過1000的整數(shù))。數(shù)字間以空格分隔。 輸出格式: 輸出分2行,分別以指數(shù)遞降方式輸出乘積多項式

    2024年02月13日
    瀏覽(19)
  • 用鏈表表示多項式,并實現(xiàn)多項式的加法運算

    用鏈表表示多項式,并實現(xiàn)多項式的加法運算

    輸入格式: 輸入在第一行給出第一個多項式POLYA的系數(shù)和指數(shù),并以0,0 結(jié)束第一個多項式的輸入;在第二行出第一個多項式POLYB的系數(shù)和指數(shù),并以0,0 結(jié)束第一個多項式的輸入。 輸出格式: 對每一組輸入,在一行中輸出POLYA+POLYB和多項式的系數(shù)和指數(shù)。 輸入樣例: 輸出樣例: 本

    2024年02月07日
    瀏覽(31)
  • 【數(shù)據(jù)結(jié)構(gòu)】15 隊列應(yīng)用實例:多項式加法運算

    我們準備采用不帶頭節(jié)點的單向鏈表結(jié)構(gòu)表示一元多項式,并按照指數(shù)遞減的順序排列各項。 對列表存放的兩個多項式進行加法運算時,可以使用兩個指針p1和p2。初始時的p1和p2分別指向這兩個多項式第1個節(jié)點(指數(shù)的最高項)。通過循環(huán)不斷比較p1和p2所指的節(jié)點,比較結(jié)

    2024年02月21日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包