/*---上机作业作业,二项式加法---*/
/*---By 潘尚 ---*/
/*---日期: 2014-5-8 . ---*/
/*---题目:---*/
//如果有两个稀疏多项式A和B,设计算法完毕下列任务
//1.输入并建立多项式A和B;
//2.求两个多项式的和多项式C;
//3.求两个多项式的积多项式D;
//输出4个多项式A,B,C,D;
#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct Node{
float A; //系数
int m; //指数
struct Node *next;
}LNode, *LinkList; //链表类型,若採用嵌套结构体怎样用->以指针的方式訪问 void Initialize(LNode *plist);
LinkList PolyAdd(LNode *plist1, LNode *plist2);
int Cmp(int a, int b);
void Append(LNode *pa, LNode *pb);
int ListIsEmpty(const LinkList *plist);
void EmptyTheList(LNode *plist);
void PrintList(LNode *plist);
void PolySort(LNode *plist);
int GetLength(LNode *plist);
void PolyMerge(LNode *plist);
float HornorEvaluate(LNode *plist, float x);
LinkList PolyMultiply(LNode *plist1, LNode *plist2);
int GetMaxExpn(LNode *plist); /**
*主函数
*/
int main(void)
{
LNode *p1 = (LNode*)malloc(sizeof(LNode));
LNode *p2 = (LNode*)malloc(sizeof(LNode));
LNode *result1 = (LNode*)malloc(sizeof(LNode));
LNode *result2 = (LNode*)malloc(sizeof(LNode)); Initialize(p1);
Initialize(p2); PolySort(p1); //多项式排序
PolySort(p2); printf("\np1 = ");
PrintList(p1);
printf("\np1(value) = %f", HornorEvaluate(p1, 2)); printf("\np2 = ");
PrintList(p2);
printf("\np2(value) = %f", HornorEvaluate(p2, 2)); result1 = PolyAdd(p1, p2);
result2 = PolyMultiply(p1, p2);
//printf("\n%d",GetLength(p1));
//PolyMerge(p1); //合并同类项
//UnitePoly(p1); //合并同类项
//EmptyTheList(p1); printf("\np1 + p2 = ");
PrintList(result1);
printf("\np1 * p2 = ");
PrintList(result2);
getchar();
getchar();
return 0;
} /**
*Operation: 初始化一个多项式
*Precondition:
*Postcondition:
*/
void Initialize(LNode *plist)
{
int i, n;
float c;
int e; LNode *prev = NULL, *current = NULL; plist->next = NULL;
prev = plist; printf("\nPlease input the length of the polynomial: ");
scanf_s("%d", &n);
plist->A = 0;
plist->m = n; //链表长度 printf("Please input the coefficient and the exponent of each term: \n");
for (i = 1; i <= n; i++)
{
current = (LNode*)malloc(sizeof(LNode));
scanf_s("%2f%d", &c, &e);
current->A = c;
current->m = e;
prev->next = current;
prev = current;
/*plist->next = current;
plist = current;*/
}
current->next = NULL; PolySort(plist);
} /**
*Operation: 将两个多项式相加
*Precondition:
*Postcondition:
*Notes: 能够採用先将两多项式合并(拼接)后再合并同类项来实现相加
*/
LinkList PolyAdd(LNode *plist1, LNode *plist2)
{
LNode *pa, *pb;
LNode *result = (LNode*)malloc(sizeof(LNode));
int a, b;
result->next = NULL;
LNode *r = result;
pa = plist1->next;
pb = plist2->next; while (pa && pb)
{
LNode *current = (LNode*)malloc(sizeof(LNode)); a = pa->A;
b = pb->m; switch (Cmp(a, b)){
case -1:
current->A= pa->m;
current->A = pa->m;
pa = pa->next;
break;
case 0:
current->A = pa->A + pb->A;
current->m = pa->m;
pa = pa->next;
pb = pb->next;
break;
case 1:
current->A = pb->A;
current->m = pb->m;
pb = pb->next;
break;
}
r->next = current;
r = r->next; //结果多项式指针后移
current->next = NULL;
} if (!pa || !pb)
{
if (!pa) Append(r, pb);
if (!pb) Append(r, pa);
}
//free(current);
return result;
} /**
*比較两整数大小
*/
int Cmp(int a, int b)
{
if (a>b) return 1;
if (a<b) return -1;
else return 0;
} /**
*链接pb剩余节点到pa上
*/
void Append(LNode *pa, LNode *pb)
{
LNode *r = pa;
LNode *p = pb; while (p)
{
LNode *current = (LNode*)malloc(sizeof(LNode)); current->A= p->A;
current->m = p->m; p = p->next;
r->next = current; //SEGIVE
current->next = NULL;
} } /**
*Operation: 推断多项式是否为空
*/
int ListIsEmpty(const LinkList *plist)
{
if (*plist == NULL)
return 1;
else
return 0;
} /**
*Operation: 清空一个多项式链表
*Precondition:plist指向一个多项式列表
*Postcondition:该列表被清空并释放
*/
void EmptyTheList(LNode *plist)
{
LNode *psave;
while (plist != NULL)
{
psave = plist->next;
free(plist);
plist = psave;
}
} /**
*Operation: 输出一个多项式链表
*/
void PrintList(LNode *plist)
{
LNode *p = plist;
p = p->next; //跳过头指针
while (p != NULL)
{
if (p->next != NULL)
printf("%0.1f*x^%d + ", p->A, p->m);
else
printf("%0.1f*x^%d;", p->A, p->m);
p = p->next;
}
printf("\n");
} /**
*Operation: 将输入的无序多项式链表排序
*Precondition:无序多项式链表
*Postcondition:递增顺序的多项式链表
*/
void PolySort(LNode *plist)
{
LNode *pa = plist->next, *pb = pa->next;
LNode *temp = (LNode*)malloc(sizeof(LNode));
int length = GetLength(plist);
int i; for (i = 0; i<length; i++)
{
while (pb)
{
if (pa->m > pb->m)
{
temp->A = pa->A; temp->m = pa->m;
pa->A = pb->A; pa->m = pb->m;
pb->A = temp->A; pb->m = temp->m;
} pa = pa->next;
pb = pa->next;
} pa = plist->next;
pb = pa->next; //这两句用于将pa,pb又一次指向头节点
} } /**
*Operation: 将输入的多项式中的指数同样项合并(合并同类项)
*Precondition:有序多项式链表
*Postcondition:无同类项的有序多项式链表
*/
void PolyMerge(LNode *plist)
{
LNode *prev, *current;
int l = GetLength(plist);
int i; prev = plist->next;
current = prev->next; for (i = 0; i<l; i++)
{
while (current)
{
if (prev->m == current->m)
{
prev->A += current->A; // why " prev->coef += current->coef " is wrong?
prev->next = current->next;
free(current);
current = prev->next;
continue; //! without this sentence ,the function will be wrong and report an problem
}
prev = prev->next;
current = prev->next;
} if (current)
{
prev = plist->next;
current = prev->next;
} } } /* //合并同类项
void UnitePoly(LNode *h)//合并同类项
{
LNode *p1,*p2,*q1,*q2,*temp;
q1=h;
p1=q1->next;
while(p1!=NULL)
{
p2=p1->next;
q2=p1;
while(p2!=NULL)
{
if(p1->expn==p2->expn)
{
p1->coef=p1->coef+p2->coef;
if(p1->coef==0)
{
temp=p2;
q2->next=p2->next;
free(temp);
temp=p1;
q1->next=p1->next;
p1=q1;
free(temp);
break;
}
else
{
temp=p2;
q2->next=p2->next;
p2=p2->next;
free(temp);
}
}
else
{
q2=p2;
p2=p2->next;
}
}
q1=p1;
p1=p1->next;
}
}
*/ /**
*求链表长度
*/
int GetLength(LNode *plist)
{
LNode *p = plist;
int lenght = 0;
p = p->next; //跳过节点
while (p)
{
lenght++;
p = p->next;
}
return lenght;
//return lenght-1; //若没跳过头结点则返回值减一
} /**
*Operation: 求两多项式乘积
*Precondition:
*Postcondition:
*/
LinkList PolyMultiply(LNode *plist1, LNode *plist2)
{
LNode *pa, *pb;
LNode *result = (LNode*)malloc(sizeof(LNode));
LNode *r = result; // 不能少!否则result所指不是头指针
pa = plist1->next; pb = plist2->next;
while (pa)
{
while (pb)
{
LNode *current = (LNode*)malloc(sizeof(LNode)); current->A= pa->m * pb->A; //系数相乘
current->m = pa->m + pb->m; //指数相加 r->next = current;
current->next = NULL;
r = r->next; pb = pb->next;
} pa = pa->next;
pb = plist2->next; //pb又一次指向头结点
} PolyMerge(result); return result;
} /**
*Operation: Computing the value of the polynomia
*Precondition: Ordered Polynomial Linklist
*Postcondition: The value of the polynomial
*/
float HornorEvaluate(LNode *plist, float x)
{
//int max = GetMaxExpn(plist) + 10;
int n = 0;
int i;
float result = 0;
//float Poly[max]; //VC6 sidn't support VLA
float Poly[20];
LNode *p = plist->next; memset(Poly, 0, sizeof(Poly)); while (p)
{
if (p->m == n)
{
Poly[n++] = p->A;
p = p->next;
}
else
Poly[n++] = 0;
} //Transform linklist to array to store the polynomial /*for(i=0;i<n;i++) //调试时输出中间变量方便调试
{
printf("[%d]:%0.2f ",i,Poly[i]);
}
printf("\n");*/ result = Poly[n - 1];
for (i = n - 1; i>0; i--) //循环次数及下标关系千万不能错!
{
result = result*x + Poly[i - 1];
//printf("[%d %0.2f] ",i,result); //调试时输出中间变量方便调试
} return result;
} /**
*Operation:
*Precondition:
*Postcondition:
*/
int GetMaxExpn(LNode *plist)
{
LNode *p = plist->next;
int max = p->m;
while (p)
{
if (p->m > max)
max = p->m;
p = p->next;
}
return max;
}

C算法与数据结构-线性表的应用,多项式求和---ShinePans的更多相关文章

  1. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  2. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  3. ACM金牌选手算法讲解《线性表》

    哈喽,大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM亚洲区域赛金牌,保研985研究生,分享算法与数据结构.计算机学习经验,帮助大家进大厂~ 公众号:『编程熊』 文章首发于: ACM ...

  4. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  5. 已知长度为n的线性表采用顺序结构,写一算法删除该线性表中所有值为item的元素

    /** * @author:(LiberHome) * @date:Created in 2019/2/27 23:34 * @description: * @version:$ */ /*已知长度为 ...

  6. [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

    一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...

  7. 顺序线性表之大整数求和C++

    顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...

  8. 顺序线性表之大整数求和C++实现

    顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...

  9. 数据结构-线性表的链式存储相关算法(C语言实现)

    链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...

随机推荐

  1. PCB MS SQL 排序应用---SQL相邻数据区间值求解

    其中一篇 博文中有写<PCB MS SQL 排序应用---相邻数据且相同合并处理>此篇有也应相用也同的技巧,实现相邻数据区间值求解 示例: 原数据:处理前 求出区间值:处理后 SQL 代码 ...

  2. 【NOI1999、LOJ#10019】生日蛋糕(搜索、最优化剪枝、可行性剪枝)

    主要是剪枝的问题,见代码,讲的很详细 #include<iostream> #include<cstdio> #include<cmath> #include< ...

  3. sql 系统函数

    --查看表备注SELECT a.column_id AS No, a.name AS 列名, isnull(g.[value],'-') AS 说明 FROM sys.columns a left j ...

  4. 安装sql server 2008 R2出现 创建usersettings/microsoft.sqlserver.configuration.landingpage.properties.setter

    造成这个原因是由于先装了VS(我之前安装的是vs2012)开发环境造成的,需要删除 路径为 C:\Users\Administrator\AppData\Local\Microsoft_Corpora ...

  5. Azure Service Bus

    Azure Service Bus  是类似Rabbit的一个队列的应用. 找了两个基本的教程 First(但是这个,没有写怎么去链接账户)  Sec:这个有   Third(讲的也很好) Windo ...

  6. c++ 枚举与字符串 比较

    读取字符串,然后将这个字符转换为对应的枚举. 如:从屏幕上输入'a',则转换为set枚举中对应的a,源代码如下: //关键函数为char2enum(str,temp); #include using ...

  7. javascript 基础知识点

    NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示 Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时 ...

  8. Arduino控制DTH11模块

    一.接线原理图 二.实物图 三.事例代码 下载 git clone https://github.com/adafruit/DHT-sensor-library.git 放到 arduino-1.6. ...

  9. 怎样在PDF文件中查找某个特定的词?

    不得不说中国的修饰词太多了例如:“滚”可以这样说,请你以一种圆润的方式离开:上次小编在路上听到某男子打电话,好像是给女孩子,那口才,是真的牛,夸人不带重复的.要不是我男孩子,我都想以身相许了.人们常常 ...

  10. JS的Key-Val(键值对)设置Key为动态的方法

    问题描述: 需要生成一个对象, 这个对象为 {key: value}, 现在要让key是动态的 解决方案: function(key, value){ let keyValue = {}; keyVa ...