1. 感觉被我写的复杂了,不过还是写出来了;()
  2. 自我感觉合并同类项的函数还是不错滴(因为我改了一下午从o(2^n) -> o(n^2) -> o(n));
  3. 还有就是偷了个懒需要输入两个多项式的项数。
  4. 好好学习,天天向上!Yes

输入

4 5
5 3 4 2 3 1 2 0
6 5 3 4 4 3 7 2 2 1

/* 单链表 */
#include <stdio.h>
#include <stdlib.h>
struct nape{/* 项 */int coefficient;/* 系数 */int exponent;/* 指数 */struct nape *next;
};
struct nape *creatList();/* 创建表头 */
struct nape *inputNape();/* 输入一项 */
struct nape *attach(struct nape *head, struct nape *p);/* 连接输入项 */
struct nape *search(struct nape *head, int i); /* 寻找第i项 */
int empty(struct nape *head); /* 判断是否为空 */
void delate(struct nape *head, int i);/* 删除第 i 个节点 */void inSert(struct nape *head, struct nape *p);/* 插入到链表的末尾 */
void sertIn(struct nape *head, int i, struct nape *p); /* 插入到链表中某个节点后面,辅助插入排序 */
struct nape *waitNape(struct nape *head, int i); /* 寻找,删除,并返回第 i 项,辅助插入排序 */
void sort(struct nape *head, int len); /* 按照系数的大小排序,就是传入输入的项数(偷懒了) */
int Max(int a, int b); /* 求两数中的大的那个 */
int count(struct nape *head);/* 计算链表项数 */struct nape *addList(struct nape *head_1, struct nape *head_2);/* 相加 */
struct nape *multiplyList(struct nape *head_1, struct nape *head_2, int n, int m);/* 相乘 */void print(struct nape *head) { /* 打印链表 */struct nape *p = head->next;while(p) {printf("%d-%d ", p->coefficient, p->exponent);if( p->next ) {printf(" ");}p = p->next;}printf("\n");
}int main(void)
{int n, m;printf("请分别输入第一个多项式和第二个多项式的项数:");scanf("%d %d", &n, &m); /* 确定两个多项式的项数,图方便了 */struct nape *head_1, *head_2, *head_add, *head_mul;head_1 = creatList();/* 创建第一个链表的表头 */head_2 = creatList();/* 创建第二个链表的表头 *//* 输入第一个多项式的项 */printf("请输入第一个多项式每个项的系数与指数:\n");for( int i = 0; i < n; ++i){struct nape *p = inputNape();head_1 = attach(head_1, p);}     /* 输入第二个多项式的项 */printf("请输入第二个多项式每个项的系数与指数:\n");for( int i = 0; i < m; ++i){struct nape *p = inputNape();head_2 = attach(head_2, p);} /* 排序 */sort(head_1, n);sort(head_2, m);/* 计算 */printf("......\n"); head_add = addList(head_1->next, head_2->next);head_mul = multiplyList(head_1->next, head_2->next, n, m);/* 打印 */printf("两式相加等于:\n"); print(head_add);printf("两式相乘等于:\n");print(head_mul);return 0;
}/* 寻找链表中的第 i 项*/
struct nape *search(struct nape *head, int i){struct nape *tail = head;int j = 0;while( j != i) {tail = tail->next;j++;}return tail;
}/* 判断链表是否为空 */
int empty(struct nape *head){if( head->next == NULL ) {return 0;}return 1;
} /* 删除链表中第 i 个节点 */
void delate(struct nape *head, int i){if( empty(head) ) {/* 判断是否为空 */struct nape *pre = search(head, i - 1);/* 被删除的前一项 */struct nape *del = search(head, i);/* 被删除的那一项 */pre->next = del->next;free(del);}
}/* 创建头结点 */
struct nape *creatList() {struct nape *head = (struct nape*)malloc(sizeof(struct nape));head->coefficient = 0;head->exponent = 0;head->next = NULL;return head;
} /* 输入一项 */
struct nape *inputNape() {struct nape *p = (struct nape*)malloc(sizeof(struct nape));scanf("%d %d", &p->coefficient, &p->exponent);p->next = NULL;return p;
}/* 连接输入项,在main函数中用到,返回head。与insert(无返回值)区分 */
struct nape *attach(struct nape *head, struct nape *p) {struct nape *tail = head;while( tail->next ) {tail = tail->next;}tail->next = p;p->next = NULL;/* 保证结尾是NULL */return head;
}/* 结构体中的数据拷贝 */
struct nape *copy(struct nape *a){struct nape *p = (struct nape*)malloc(sizeof(struct nape));p->coefficient = a->coefficient;p->exponent = a->exponent;p->next = NULL;return p;
}/* 插入到链表中某个节点后面,辅助插入排序 */
void sertIn(struct nape *head, int i, struct nape *p) {struct nape *tail = search(head, i);/* 要插到这一项后面 */p->next = tail->next;tail->next = p;
} /* 寻找,删除,并返回第 i 项,辅助插入排序 */
struct nape *waitNape(struct nape *head, int i) {int t = i;struct nape *tail = search(head, t);struct nape *p = (struct nape*)malloc(sizeof(struct nape));p = copy(tail);/* 拷贝 */delate(head, t);/* 删除 */return p;
}/* 这里我用的插入排序 */
void sort(struct nape *head, int len) {int i;for( i = 2; i <= len; ++i ) {struct nape *wait = waitNape(head, i);/* 等待插入的项 */for( int j = i - 1; j >= 0; --j ) {struct nape *judge = search(head, j);/* 正在与wait比较的那一项 *//* 如果找到插入位置,便插在其后面 */ if( (judge->coefficient == 0 && judge->exponent == 0) || wait->exponent < judge->exponent ) {/* 如果在最前面那插入到head后面,或者插在系数第一个比他大的后面 */sertIn(head, j, wait);break;}}}
}/* 插入到链表的末尾,与attach(返回插入的头结点)区分 */
void inSert(struct nape *head, struct nape *p) {struct nape *tail = head;while(tail->next) {tail = tail->next; }tail->next = p;p->next = NULL;
} /* 加法运算 ,三个循环*/
struct nape *addList(struct nape *head_1, struct nape *head_2) {struct nape *p = head_1, *q = head_2, *head_add, *temp;head_add = creatList();/* 创建头结点 */while( p && q ) {/* 当 p 或 q 都不等于空时 */struct nape *temp = (struct nape*)malloc(sizeof(struct nape));if( p->exponent > q->exponent ) {/* 若 p 的指数大则插入 q */temp = copy(p);inSert(head_add, temp) ;p = p->next;}else if( p->exponent < q->exponent ) {/* 若 p 的指数大则插入 q */temp = copy(q);inSert(head_add, temp);q = q->next;}else{/* 若相等那么合并后插入 */temp->coefficient = q->coefficient + p->coefficient;temp->exponent = q->exponent;temp->next = NULL;inSert(head_add, temp);p = p->next;q = q->next;}}if(p) {/* 如果 p 不为空,把 p 的项全部都插入到后面 */while(p) {struct nape *temp = (struct nape*)malloc(sizeof(struct nape));temp = copy(p);inSert(head_add, temp);p = p->next;}}else{/* 如果 q 不为空,把 q 的项全部都插入到后面 */while(q) {struct nape *temp = (struct nape*)malloc(sizeof(struct nape));temp = copy(q);inSert(head_add, temp);q = q->next;}      }return head_add;
}/* 合并同类项,有点像用在线处理 */
struct nape *mergeSimilarItems(struct nape *head){int counts = count(head) - 1;/* 计算链表项数 */sort(head, counts);/* 排序 */struct nape *head_merge = creatList(), *p = head->next, *temp = (struct nape*)malloc(sizeof(struct nape)),*toFree = head, *pre = toFree->next;int c;/* 用于判断下一个与这一个是否为同类项 *//* 初始化temp,与c */temp->coefficient = p->coefficient;temp->exponent = p->exponent;temp->next ==NULL;while(counts--) {c = p->next->exponent;if(counts != 1) {/* 解决循环结束的问题 */if( c == p->exponent ) { /* 判断下一个是否与这一个的指数相同 */temp->coefficient += p->next->coefficient;   /* 相同则相加 */ temp->exponent = temp->exponent;}else{/* 不同则插入并创建新的结点 */inSert(head_merge, temp);temp = (struct nape*)malloc(sizeof(struct nape));temp->coefficient = p->next->coefficient;temp->exponent = p->next->exponent;temp->next ==NULL;}}else{/* 若遍历到倒数第二个 */if( c == p->exponent ) {/* 如果最后一个的指数等于倒数第二个,那么系数相加后插入 */temp->coefficient += p->next->coefficient;        temp->exponent = temp->exponent;temp->next = NULL;inSert(head_merge, temp);}else{/* 否则说明最后一个是单独的一项,需要单独的插入 */inSert(head_merge, temp);/* 先把跟倒数第二项的指数相同的项相加后插入 */temp = (struct nape*)malloc(sizeof(struct nape));            temp->coefficient = p->next->coefficient;temp->exponent = p->next->exponent;temp->next = NULL;inSert(head_merge, temp);/* 将最后一个单独插入 */}break; }p = p->next;}/* 将原先的空间释放掉,避免内存泄漏 */while(toFree) {pre = toFree->next;free(toFree);toFree = pre;}return head_merge;/* 返回新的头结点 */
}/* 计算链表项数,算头结点 */
int count(struct nape *head) {int count=0;struct nape *p = head;while(p) {count++;p = p->next;}return count;
}/* 乘法运算 */
struct nape *multiplyList(struct nape *head_1, struct nape *head_2, int n, int m) {struct nape *p, *q, *head_less, *head_more, *head_mul, *temp;head_mul = creatList();if( n < m ) {/* 让项数少的在外层循环,提高性能 */head_less = head_1;head_more = head_2;}else{head_less = head_2;head_more = head_1;}p = head_less;q = head_more;int min = n<m?n:m;int max = n>m?n:m;for( int i = 0; i < min; i++ ) {/* 有头结点,让项数少的在外层循环 */struct nape *nape_i = search(head_less, i);/* 寻找项少的链表的第i项 */for( int j = 0; j < max; j++ ) {temp = (struct nape*)malloc(sizeof(struct nape));struct nape *nape_j = search(head_more, j);/* 寻找项多的链表的第j项 */temp->coefficient = nape_i->coefficient * nape_j->coefficient;/* 系数相乘 */temp->exponent = nape_i->exponent + nape_j->exponent;/* 指数相加 */temp->next = NULL;inSert(head_mul, temp);/* 插入 */}}head_mul = mergeSimilarItems(head_mul);/* 合并同类项 */return head_mul;
}

多项式的 加法 与 乘法(C语言 单链表)相关推荐

  1. c语言用链表的方式实现多项式加减,如何实现C语言单链表多项式相加的操作

    #include#pragma warning(disable:4996)//兼容scanf typedef struct node { int coef; int expon; struct nod ...

  2. C语言单链表实现多项式

    C语言单链表实现多项式 一.多项式的存储结构 注意:多项式每项的指数必须递增 typedef struct PNode{int coef; //系数int expn; //指数struct PNode ...

  3. C语言一趟冒泡交换最小值,C语言单链表冒泡排序为啥以下代码实现不了?

    struct node *sort(struct node *head)/*排序*/ { struct node *p,*q; struct node *temp; for(p=head;p!=NUL ...

  4. c语言单链表功能,[数据结构]单链表(C语言)的各种功能

    06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...

  5. C语言单链表,能直接运行的代码!

    C语言单链表,实现增删改查 不废话 直接上代码,COPY就能运行 #include <stdio.h> #include <stdlib.h> /** *定义数据元素 */ t ...

  6. C++语言单链表实现荷兰旗问题

    C++语言单链表实现荷兰旗问题 一.设备及软件 VC6.0 二.语言 C++ 三.涉及的数据结构与算法 单链表.尾插法 四.问题描述 荷兰旗问题亦称三色旗问题. 这里荷兰旗用0,1,2分别表示三种颜色 ...

  7. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  8. C语言单链表代码实现

    C语言单链表代码实现 一.头文件.常量以及自定义数据结构 #include<stdio.h> #include<malloc.h> #include<stdlib.h&g ...

  9. c语言单链表倒置(附原理讲解)

    c语言单链表倒置 今天博主,讲一个单链表倒置的例子,事实上 话不多说,我们直接上代码,待会会给大家讲解倒置算法实现原理 #include<stdio.h> #include<stdl ...

  10. C语言 单链表通讯录基础版实现,保证看完都直呼easy

    C语言 单链表实现通讯录基础版,保证看完都大呼简单! --------------------------------- 首先在写通讯录之前,必须明确我们的需求: 因为是基础版,我在这里暂时只实现以下 ...

最新文章

  1. 大数据集群搭建之hadoop、tomcat、jdk等工具的安装(三)
  2. MySql数据库驱动类
  3. 综述 | 深度学习弱目标检测定位
  4. Bootstrap3 面板 .panel 容器
  5. 海康服务器协议,国标流媒体服务器GB28181协议和海康设备的交互过程记录
  6. Python在线编辑器推荐
  7. 适合新手——MySQL中基于SQL语言增删改查等基础的练习大汇总
  8. html 城市选择 按字母排序吗,微信小程序实现按字母排列选择城市功能
  9. Origin画图标签常见语法
  10. 图神经网络对抗攻击的研究学习(一)
  11. OpenCV Mat转dlib array2d
  12. mysql锁级别_MySql三种级别锁的介绍及解锁命令
  13. 【CarMaker学习笔记】TestManager自动测试实验
  14. 路由器、交换机、集线器三剑客有什么区别?分别是用来干什么的?
  15. 自制基于python的DoU log分析脚本
  16. 微型计算机中的pcl是指,PCL XL error的基本解决办法
  17. SpringBoot自动配置Redis原理
  18. There is no setter for property named 可能产生的原因!
  19. 用Python破解翻译词典反爬虫机制!反爬虫也就这样嘛!
  20. 螺钉分类及表面处理种类

热门文章

  1. 设计模式(二) 访问者模式 Vistor
  2. “云适配”获1亿元B+轮融资,盯上了大企业的移动化需求
  3. Spring Boot - Thymeleaf模板简介以及集成
  4. stm32-Hardfault及内存溢出的查找方法
  5. 小红书推广效果怎么样?如何进行小红书推广?
  6. mpaaS的kylin框架-项目结构(脚手架)
  7. Scratch精通之侦测的使用
  8. 自己编写的数据库如何和mapkeeper相连进行评测
  9. 改变linux字体的大小,如何更改字体并调整其大小?
  10. intel英特尔架构