使用单链表实现多项式计算示例
#include <stdio.h>
#include <stdlib.h>
//比较函数返回值
#define A_EQUAL_B 0
#define A_LARGE_B 1
#define A_LOWER_B -1
//错误返回之集合
#define SUCCESS 0
#define POINT_ARG_IS_NULL -1
#define LINKLIST_IS_NULL -2
#define NOT_FOUND -3
typedef struct
{
int cst_term;//常数项
int idx_term;//指数
}factor;
typedef factor data_t;
typedef struct linklist
{
data_t data;
struct linklist *next;
}linklist;
/*
*
* malloc头节点,头节点内的数据是无效的
*
*/
linklist *creat_lnklst()
{
linklist *head = (linklist *)malloc(sizeof(linklist));
head->next = NULL;
return head;
}
/*
* pll是插入节点的前一项
* data是数据
* 为新节点分配内存,之后插入
*
*/
int ins_head_lnklst(linklist *pll, const data_t *data)
{
linklist *newnode = NULL;
if(NULL == pll || NULL == data)
return POINT_ARG_IS_NULL;
newnode = (linklist *)malloc(sizeof(linklist));
newnode->data = *data;
newnode->next = pll->next;
pll->next = newnode;
return SUCCESS;
}
/*
*
* pll是要删除节点的前一个
* data存放删除的数据
* 检查pll是否是空
* 检查链表是否为空
* data是NULL就不用保存删除的数据
*
*/
int del_head_lnklst(linklist *pll, data_t *data)
{
linklist *tmp = NULL;
if(NULL == pll)
return POINT_ARG_IS_NULL;
if(pll->next == NULL)
return LINKLIST_IS_NULL;
tmp = pll->next;
if(NULL != data)
*data = tmp->data;
pll->next = tmp->next;
free(tmp);
return SUCCESS;
}
/*
*
* 内部支持data_t大小比较函数
* 如果data_t修改成其他类型则需要修改此方法
*
*/
static int cmp_data(const data_t *a, const data_t *b)
{
int res = 0;
if(a == NULL || b == NULL)
return POINT_ARG_IS_NULL;
res = a->idx_term - b->idx_term;
if(res == 0)
return A_EQUAL_B;
else if(res > 0)
return A_LARGE_B;
else
return A_LOWER_B;
}
/*
*
* 实现在链表中查找data匹配的前一项
* compare是实现虚拟数据类型比较函数
*
*/
linklist * locate_lnklst(linklist *pll, const data_t *data, int (*compare)(const data_t *, const data_t *))
{
if(NULL == pll || data == NULL)
return NULL;
if(NULL == compare)
compare = cmp_data;
while(pll->next)
{
if(A_EQUAL_B == compare(&(pll->next->data), data))
return pll;
pll = pll->next;
}
return NULL;
}
/*
*
* 打印链表数据
* 检查参数空指针
* 检查空链表
*
*/
int print_lnklst(linklist *pll)
{
if(NULL == pll)
return POINT_ARG_IS_NULL;
if((pll = pll->next) == NULL)
{
printf("%s\n", "no element in linklist.\n");
return LINKLIST_IS_NULL;
}
while(pll)
{
if(pll->next == NULL)
{
printf("%2d*X^%1d ", pll->data.cst_term, pll->data.idx_term);
}
else
{
printf("%2d*X^%1d +", pll->data.cst_term, pll->data.idx_term);
}
pll = pll->next;
}
printf("\n");
return SUCCESS;
}
/*
*
* 删除对应数据的节点
*
*/
int locate_del_lnklst(linklist *pll, const data_t *data)
{
linklist *prev = NULL;
if(NULL == pll || data == NULL)
return POINT_ARG_IS_NULL;
prev = locate_lnklst(pll, data, NULL);
if(NULL == prev)
return NOT_FOUND;
return del_head_lnklst(prev, NULL);
}
int add_linklist(linklist *a, linklist *b)
{
linklist *tmp;
if(NULL == a || NULL == b)
return POINT_ARG_IS_NULL;
if((b = b->next) == NULL)
{
return LINKLIST_IS_NULL;
}
while(b != NULL)
{
tmp = locate_lnklst(a, &b->data, NULL);
if(NULL == tmp)
ins_head_lnklst(a, &b->data);
else
tmp->next->data.cst_term += b->data.cst_term;
b = b->next;
}
return 0;
}
/*
*
* A = 1 + 2*X + 3*X^2
* B = 4 + 5*X + 6*X^2
* R = A + B
* = 5 + 7*X + 9*X^2
*
*/
int init_a_b(linklist *a, linklist *b)
{
factor tmp;
tmp.cst_term = 1;
tmp.idx_term = 0;
ins_head_lnklst(a, &tmp);
tmp.cst_term = 2;
tmp.idx_term = 1;
ins_head_lnklst(a, &tmp);
tmp.cst_term = 3;
tmp.idx_term = 2;
ins_head_lnklst(a, &tmp);
tmp.cst_term = 4;
tmp.idx_term = 0;
ins_head_lnklst(b, &tmp);
tmp.cst_term = 5;
tmp.idx_term = 1;
ins_head_lnklst(b, &tmp);
tmp.cst_term = 6;
tmp.idx_term = 2;
ins_head_lnklst(b, &tmp);
return 0;
}
int main(int argc, const char *argv[])
{
linklist *fml_a = creat_lnklst();
linklist *fml_b = creat_lnklst();
init_a_b(fml_a, fml_b);
printf("A =");
print_lnklst(fml_a);
printf("B =");
print_lnklst(fml_b);
add_linklist(fml_a, fml_b);
printf("A + B =");
print_lnklst(fml_a);
return 0;
}
上一篇:c++判断是否为目录的示例分享
栏 目:C语言
下一篇:udp socket客户端和udp服务端程序示例分享
本文标题:使用单链表实现多项式计算示例
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3729.html
您可能感兴趣的文章
- 04-02func函数+在C语言 func函数在c语言中
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10使用OpenGL实现3D立体显示的程序代码
- 01-10求斐波那契(Fibonacci)数列通项的七种实现方法
- 01-10C语言 解决不用+、-、&#215;、&#247;数字运算符做加法
- 01-10使用C++实现全排列算法的方法详解
- 01-10深入Main函数中的参数argc,argv的使用详解
- 01-10用C++实现DBSCAN聚类算法
- 01-10深入全排列算法及其实现方法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10C#中split用法实例总结
- 01-10delphi制作wav文件的方法
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11ajax实现页面的局部加载
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 04-02jquery与jsp,用jquery