使用单链表实现多项式计算示例
#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语言单链表实现多项式相加,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
Java实现单链表SingleLinkedList增删改查及反转 逆序等
单链表是链表的其中一种基本结构。一个最简单的结点结构如图所示,它是构成单链表的基本结点结构。在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。因为只有一个指针结点,称为单链表...2021-10-15- 这篇文章主要为大家详细介绍了C++使用模板实现单链表的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要给大家介绍了关于利用C++简单实现顺序表和单链表的方法,文中给出了详细的示例代码供大家参考学习,需要的朋友可以参考借鉴,下面来跟着小编一起来学习学习吧。...2020-04-25
- 今天小编就为大家分享一篇c语言实现两个单链表的交叉合并方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了C语言实现单链表实现方法的相关资料,链表分为单向链表、双向链表、循环链表,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言创建和操作单链表数据结构的实例教程,讲解使用C语言实现链表结构时指针的使用,需要的朋友可以参考下...2020-04-25
- 本篇文章是对单链表的快速排序进行了详细的分析介绍,需要的朋友参考下...2020-04-25
- 这篇文章主要为大家详细介绍了C++使用模板实现单链表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C语言单链表常见操作,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言实现单链表逆序与逆序输出,是数据结构与算法中比较基础的重要内容,有必要加以牢固掌握,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了使用单链表实现多项式计算示例,需要的朋友可以参考下...2020-04-25
- 以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下...2020-04-25
- 以下是对C++中单链表的建立与基本操作进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助...2020-04-25
- 这篇文章主要介绍了Go语言单链表实现方法,实例分析了基于Go语言的单链表实现原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-07
- 以下是对C++中单链表的增、删、改、减进行了详细的介绍,需要的朋友可以过来参考下...2020-04-25
- 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。这篇文章主要介绍了C语言单链表的实现 的相关资料,需要的朋友可以参考下...2020-04-25
- 下面小编就为大家带来一篇C++ 单链表的基本操作(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
- 单链表是由多个结点链接组成,它的每个结点包含两个域,一个数据域和一个链接域(地址域),下面这篇文章主要给大家介绍了关于C语言如何实现单链表的相关资料,需要的朋友可以参考下...2021-09-07
- 这篇文章主要介绍了C#定义并实现单链表实例解析,有助于读者加深对C#实现数据结构的理解,需要的朋友可以参考下...2020-06-25