单向链表实现多项式加和乘--自己写数据结构

用单项链表实现多项式数据结构和代码如下(由于时间原因多项式乘法的函数没用实现,读者可以在自己完善):

存放结构体的头文件polylist.h

#ifndef _H_POLYLIST_
#define _H_POLYLIST_

typedef struct _Poly_Node
{
    int ratio;  //系数
    int power;  //幂

    struct _Poly_Node* next;
}Node,*pNode;

typedef struct _Poly_List
{
    struct _Poly_Node* next;
}PolyList,*pPolyList;

pPolyList init_list_header(void);
pNode poly_add_node(pPolyList plist,int ratio,int power);
int poly_delete_node(pPolyList plist,int power);
int print_poly(pPolyList plist);
int poly_bubble_sort(pPolyList plist);
pPolyList poly_addcat(pPolyList pfir,pPolyList psec);
pPolyList poly_add(pPolyList pfir,pPolyList psec);

#endif

数据结构函数实现文件polylist.c如下:

/**************************************
时间:2014.12.11
作者:XIAO_PING_PING
内容:单向链表表示多项式的加法和乘法
功能:学习写数据结构

***************************************/
#include <string.h>
#include <stdlib.h>

#include "polylist.h"

/*创建一个多项式链表头*/
pPolyList init_list_header(void)
{
    pPolyList phead;

    phead = (PolyList *)malloc(sizeof(PolyList));
    phead->next = NULL;

    return phead;
} 

/*往多项式里面添加项*/
pNode poly_add_node(pPolyList plist,int ratio,int power)
{
    pNode ptail,pre,p;

    ptail = (Node *)malloc(sizeof(Node));
    ptail->ratio = ratio;
    ptail->power = power;
    ptail->next = NULL;

    if(NULL == plist->next)
    {
        plist->next = ptail;
        printf("多项式链表插入点:系数=%d,幂值=%d\n",ptail->ratio,ptail->power); 

        return ptail;
    } 

    pre = plist->next;
    while(pre)
    {
        p = pre;
        pre = pre->next;
    }
    p->next = ptail;
    printf("多项式链表插入点:系数=%d,幂值=%d\n",ptail->ratio,ptail->power); 

    return ptail;
}

/*删除多项式中对应幂值的项*/
int poly_delete_node(pPolyList plist,int power)
{
    pNode pre,p;

    if(NULL == plist->next)
    {
        printf("多项式链表为空");
        return  -1;
    }

    pre = plist->next;
    p = pre;
    while(NULL != p->next)
    {
        pre = p;
        if(power == pre->next->power)
        {
             pre = pre->next;
             p->next = pre->next;

             free(pre);
             printf("删除多项式链表中幂值为%d的项\n",power);
        }
        p = p->next;
    } 

    if(power == plist->next->power)
    {
        p = plist->next;

        plist->next = plist->next->next;

        free(p);
        printf("删除多项式链表中幂值为%d的项\n",power);        

    }

    return 0;
}
/*打印多项式*/
int print_poly(pPolyList plist)
{
    pNode p;

    p = plist->next;

    if(NULL == p)
    {
        printf("该多项式为空。\n");
        return -1;
    } 

    printf("遍历输出多项式:\n");
    printf("Y = ");
    while(NULL != p)
    {
       printf("%d X%d + ",p->ratio,p->power);
       p = p->next;
    }        

    return 0;
}
/*多项式排序*/
int poly_bubble_sort(pPolyList plist)
{
    int tpower,tratio;
    pNode p,pre,ptemp;

    if(NULL == plist->next)
    {
        printf("多项式链表为空\n");
        return -1;
    }

    if(NULL == plist->next->next)
    {
        printf("多项式链表只有一项\n");
        return -2;
    }

    p = plist->next;
    pre = p;
    while(p)
    {
        pre = p;
        while(pre->next)
        {
           // ptemp = pre;
            if(pre->next->power == p->power)
            {
                ptemp = pre->next;

                p->ratio += pre->next->ratio;
                pre->next = pre->next->next ;

                free(ptemp);
                if(NULL == pre->next)
                {
                    break;
                }
            }
            else if(pre->next->power < p->power)
            {
                tpower = p->power;
                tratio = p->ratio;
                p->power = pre->next->power;
                p->ratio = pre->next->ratio;
                pre->next->power = tpower;
                pre->next->ratio = tratio;
                //ptemp = p;
                //p = pre->next;

                //pre->next = ptemp;
                //
            }
            else
            {
            }
            pre = pre->next;
        }
        p = p->next;
    }
}
/*合并两个多项式,把第二个多项式的全部节点添加到第一个多项式后面*/
pPolyList poly_addcat(pPolyList pfir,pPolyList psec)
{
    PolyList *p = pfir;
    //ptotal = (PolyList *)malloc(sizeof(PolyList));

    Node *pre = pfir->next;

    //p = pfir->next;
    if(NULL == pre)
    {
        pfir->next = psec->next;
    }
    else
    {
        while(pre->next)
        {
            //pre = p;
            pre = pre->next;
        }
        pre->next = psec->next;
    }
    free(psec);   

    return  pfir;
}

/*多项式加法*/
pPolyList poly_add(pPolyList pfir,pPolyList psec)
{
    PolyList *p = pfir;
    //ptotal = (PolyList *)malloc(sizeof(PolyList));

    p = poly_addcat(pfir,psec);
    poly_bubble_sort(p);
    //return poly_bubble_sort(poly_addcat(pfir,psec));
    return p;
}

测试文件test.c如下

#include <string.h>
#include <conio.h>

#include "polylist.h"

int main()
{
    pPolyList polyone,polytwo,polyadd;

    printf("多项式一:\n");
    polyone = init_list_header();
    poly_add_node(polyone,2,11);
    poly_add_node(polyone,3,7);
    poly_add_node(polyone,23,11);
    poly_add_node(polyone,1,13);
    poly_add_node(polyone,32,45);
    poly_add_node(polyone,23,32);
    poly_add_node(polyone,3,343);
    poly_add_node(polyone,34,414);
    poly_add_node(polyone,23,7);
    poly_add_node(polyone,12,44);
    print_poly(polyone);
    printf("\n");
    printf("\n");
    printf("多项式二:\n");
    polytwo = init_list_header();
    poly_add_node(polytwo,2,11);
    poly_add_node(polytwo,44,13);
    poly_add_node(polytwo,23,34);
    poly_add_node(polytwo,43,32);
    poly_add_node(polytwo,32,45);
    poly_add_node(polytwo,23,32);
    poly_add_node(polytwo,3,343);
    poly_add_node(polytwo,34,44);
    poly_add_node(polytwo,23,7);
    poly_add_node(polytwo,12,464);
    print_poly(polytwo);
    printf("\n");
    printf("\n");

    //polyadd = init_list_header();
   // polyadd = poly_addcat(polyone,polytwo);
    //polyadd = init_list_header();
    printf("合并多项式一和二:\n");
    polyadd = poly_add(polyone,polytwo);

    print_poly(polyadd);
    //poly_bubble_sort(polyone);

    //poly_delete_node(polyone,2);
    //poly_delete_node(polyone,4);
    //poly_delete_node(polyone,2);
    //poly_delete_node(polyone,3);
   //
    getch();
}

以上文件运行结果如下:

时间: 2024-10-12 09:55:11

单向链表实现多项式加和乘--自己写数据结构的相关文章

数据结构之利用单向链表实现多项式加法和乘法

在<数据结构与算法分析--c语言描述>一书中,作者指出了使用单向链表作为实现多项式的方法.但是没有给出具体实现.下面自己对其进行实现.只考虑功能.对其他细节不暂时不考虑.程序完成两个功能,使用单向链表完成多项式的加法和乘法.首先看加法,解决加法问题的思想在于对表示进行操作的两个链表表示的多项式按照指数递减的结构排列,每个节点的数据域存储着多项式某一项的系数(Coefficient)和指数(Exponent),还有一个指向后继节点的指针.节点的实现如下: 1 typedef struct Nod

PTA 6-14 用单向链表完成多项式运算 (35 分)

输入两个多项式,计算它们的加.减及乘法, 将计算结果输出到屏幕上. 1) 输入:从键盘分两行分别输入两个多项式数据,每个多项式输入格式如下: n a1 m1 a2 m2 a3 m3 . .. ai mi.... an mn 其中n为多项式系数为非零的项数,ai为系数,mi为指数, 它们都是整数,该输入数据所表达的多项式意义为(其中符号^表示幂次): a1x^m1 + a2x^m2 + a3x^m3 + ...... + an x^mn 2)输出:先输出参与运算的两个多项式, 然后输出它们的运算结

【转】单向链表(单链表)的Java实现

最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我 还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提

链表实现多项式操作

最近看了weiss的数据结构,想记录一下自己的代码,这里是一个关于链表实现多项式的相关操作./**************************************@function:数据结构第三章,链表实现多项式的加减,乘也是类似,只不过还要合并,合并比较麻烦:*@data:2015/5/8*@Author:lss************************************/#include #include using namespace std;#define N1 2

单链表实现多项式的表示及运算

单链表实现多项式的加法运算 最近学习数据结构的线性表,有顺序存储和链表两种,多项式的表示和运算,最能巩固学习成果,现在提供详细代码,来实现多项式的加法运算. 多项式用单链表最为合适,不会造成更多的资源浪费. 如果你恰好用的这本书--数据结构(Java版)(第4版)(叶核亚),推荐你去下面这个链接下载书本源代码,将更助你学的轻松. http://download.csdn.net/detail/wang______jing/9907538 1 //单链表类,实现一些基本单链表的操作 2 publi

C#学习单向链表和接口 IList&lt;T&gt;

作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: MSDN 索引器(C# 编程指南) <数据结构(C#语言版)>下载 When to use IEnumerable, ICollection, IList and List 章节: 单向链表元素 定义单向链表操作接口 逐步实现单向链表 正文: 前面学习了 IEnumerable<T>.IComparable<T>.ICollec

判断单向链表是否有环,环起点,环长,链表长

今天在微信上看到一篇介绍如何判断单向链表是否有环的文章,感觉很有意思,整理一下读后的思路. 一.判断单向链表是否有环 方法1:设置一个Hashset,顺序读取链表中的节点,判断Hashset中是否有该节点的唯一标识(ID).如果在Hashset中,说明有环:如果不在Hashset中,将节点的ID存入Hashset. 这种方法时间复杂度已经最优,但是因为额外申请了Hashset,所以空间复杂度不算最优. 方法2:设置2个指针,指向头节点.第1个指针每次指向下一个节点:第2个指针指向下一个节点的下一

如何判断一个单向链表是否为回文链表(Palindrome Linked List)

题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案就是数组.遍历链表,用数组把数据存下来,然后再进行一次遍历,同时用数组反向地与之比较,这样就可以判断是否回文.这个方法时间复杂度是O(n),达到了要求,然而空间复杂度显然不满足要求.所以,开数组这一类的方法显然不是最佳的. 2,既然要满足O(1)的空间复杂度,我就想到了用一个变量来存储这些数据,恰好

单向链表反转算法——递归版和迭代版

最近在做笔试题时,遇到一道编程题:单向链表反转算法.一时紧张,没写出来就提前交卷了,然而交完卷就想出来了... 最初想出来的是递归版,遗憾的是没能做到尾递归,后来又琢磨出了迭代版.后来用实际编译运行测试了一遍,能正常运行. 递归版的灵感来源于<Haskell 趣学指南>中非常简洁的快速排序算法的实现,其思想是将单向链表分割头部和尾部.其中头部指是链表的第一个节点,尾部是指除去第一个节点后的子链表.通过递归的方法,将子链表继续分割成头部和尾部,直至尾部指剩下一个节点,无法继续分割,然后将头部和尾