一元稀疏多项式计算器:一次数据结构实验的题目

原创 2004年09月29日 14:23:00

据说今天要交这个变态的作业,所以,我赶了一夜写了这么个小程序,可是今天拿到了学校老师却说今天不上课,害的我困的差点撞车。
唉,多少也是写完了一点东西,传上来大家看看吧。
输入一个一元多项式,例如:-23x^9+54x^8+22x^9等等,把指数相同的项目合并,并且按照指数大小排列输出字符串。差不多了吧。

老师要求使用线性表来操作,我也就按要求做了。源代码含有四个文件,datastruct.h是数据结构的定义;ListOper.h是线性表操作函数的声明;ListOper.cpp是线性表操作函数的定义;main.cpp是主单元含有主函数和字符串分析函数。
datastruct.h

typedef struct list
{
    int c;    //多项式的项数
    int e;    //多项式的指数
    struct list *next;    //下一结点
};

typedef struct list *LinkList;
typedef struct list Node;

下面是线性表的操作相关函数声明,对应文件ListOper.h:
//File: ListOper.h


#ifndef DATASTRUCT
#define DATASTRUCT
#include "datastruct.h"
#endif

//some functions declaretioin

bool CreateList(LinkList &L);
Node *CreateNode(int e, int c);
void FreeList(LinkList &L);
void SortList(LinkList &L);
void DeleteNextNode(Node *d);
void SweepNextNode(Node *s);
void OutPutList(LinkList &L);

相关函数的实现,对应文件ListOper.cpp:
//File: ListOper.cpp

#include <stdlib.h>
#include <iostream>
#ifndef DATASTRUCT
#define DATASTRUCT
#include "datastruct.h"
#endif
#include "ListOper.h"

using namespace std;

bool CreateList(LinkList &L)
{
    //TODO: 创建线性链表
    Node *head;
    head=(Node *)malloc(sizeof(Node));
    if(head==NULL)
    {
        cout << "内存分配错误" << endl;
        return false;
    }
    head->next=NULL;
    head->c=0;
    head->e=0;
    L=head;
    return true;
}

Node *CreateNode(int e, int c)
{
    //TODO: 创建结点
    Node * pos;
    pos=(Node *)malloc(sizeof(Node));
    if(pos==NULL)
    {
        cout << "内存分配错误" << endl;
        exit(1);
    }
    pos->e=e;
    pos->c=c;
    pos->next=NULL;
    return pos;
}
        
void FreeList(LinkList &L)
{
    //TODO: 释放整个线性表所占用的内存空间
    Node *pos;
    Node *next;
    pos=L;
    while(pos!=NULL)
    {
        next=pos->next;
        free(pos);
        pos=next;
    }
}

void SortList(LinkList &L)
{
    bool flag=true; //是否需要排序标志
    Node *head=L->next;
    Node *pos;
    Node *last;
    Node *temp;
    if(head->next==NULL)
    {
        return;
    }
    while(flag)
    {
        flag=true;
        last=head;
        pos=last->next;
        if(last==NULL||last->next==NULL)
        {
            break;
        }
        while(last!=NULL && last->next!=NULL)
        {
            flag=false;
            pos=last->next;
            if(last->e<pos->e)    //哈哈哈哈哈,HTML代码
            {
                SweepNextNode(last);
                flag=true;
            }
            if(last->e==pos->e)
            {
                last->c+=pos->c;
                DeleteNextNode(last);
                flag=true;
                /*last=last->next;
                pos=last->next;*/
            }
            last=last->next;
        }
    }
}

void DeleteNextNode(Node *d)
{
    Node *temp;
    temp=d->next;
    d->next=temp->next;
    free(temp);
}

void SweepNextNode(Node *s)
//一点偷懒的办法,只交换值,不修改指针
{
    int c,e;
    c=s->c;e=s->e;
    s->c=s->next->c;s->e=s->next->e;
    s->next->c=c;s->next->e=e;
}

void OutPutList(LinkList &L)
{
    Node *pos;
    pos=L->next;
    cout << "输出表达式:";
    while(pos!=NULL)
    {
        if(pos->c>0)
        {
            cout << "+";
        }
        if(pos->c!=1)
        {
            cout << pos->c;
        }
        if(pos->e!=0)
        {
            cout << "x^";
            cout << pos->e;
        }
        pos=pos->next;
    }
    cout << endl;
}

主单元文件main.cpp:
#include <iostream>
#include <stdlib.h>
#include <ctype.h>
#include "ListOper.h"

using namespace std;

LinkList AnayString(char aString[], int aLength);

int main(int argc, char *argv[])    //-------------------------------
{
    LinkList L;
    char InStr[1024];
    int len;
    cout << "一元稀疏多项式计算器" << endl;
    cout << "Copyright@1999-2004, Gashero Liu." << endl;
    cout << "作者:刘晓明" << endl << endl;
    cout << "请输入一个1024个字符以内的稀疏多项式:";
    cin >> InStr;
    len=strlen(InStr);
    L=AnayString(InStr,len);
    SortList(L);
    OutPutList(L);
    FreeList(L);
    system("PAUSE"); 
    return 0;
}

LinkList AnayString(char aString[], int aLength)    //---------------
//TODO: 字符串分析函数
{
    LinkList L=NULL;
    Node *pos=NULL;
    Node *last;
    Node *head;
    CreateList(L);
    head=L;
    last=head;
    int c=0;
    int e=0;
    char temp[1];
    char tp;
    bool plus=true;
    char status='n';    //状态指示符,我省略了系数为负的情况
    /*
    n: 非运算状态
    c: 正在计算系数
    e: 正在计算指数
    p: 指数为0
    f: 完成了一个项目的输入
    */
    for(int i=0;i<aLength;i++)
    {
        temp[0]=aString[i];
        tp=temp[0];
        switch(status)
        {
            case 'n':
            {
                c=0;e=0;
                status='c';
                if(tp=='-')
                {
                    plus=false;
                    continue;
                }
                if(isdigit(tp))
                {
                    c=atoi(temp);
                    continue;
                }
                if(tp=='x')//多项式以x开头
                {
                    c=1;
                    status='e';
                    continue;
                }
            }
            case 'c':
            {
                if(isdigit(aString[i]))
                {
                    if(plus)
                    {
                        c=c*10+atoi(temp);
                    }
                    else
                    {
                        c=c*10-atoi(temp);
                    }
                    continue;
                }
                if(tp=='x')
                {
                    if(c==0)
                    {
                        c=1;
                    }
                    status='e';
                    e=0;
                    continue;
                }
                //此处考虑了常数项出现在其他位置的可能
                if(tp=='+')
                {
                    plus=true;
                    status='p';
                    continue;
                }
                if(tp=='-')
                {
                    plus=false;
                    status='p';
                    continue;
                }
                /*if(temp[0]=='^')
                {
                    status='e';
                    e=0;
                    continue;
                }*/ //此种情况不可能出现
                continue;
            }    //正在解析系数
            case 'e':
            {
                if(tp=='^')
                {
                    continue;
                }
                if(isdigit(tp))
                {
                    e=e*10+atoi(temp);
                    continue;
                }
                if(tp=='+')
                {
                    plus=true;
                    status='f';
                    continue;
                }
                if(tp=='-')
                {
                    plus=false;
                    status='f';
                    continue;
                }
            }            //正在解析系数
            case 'p':
            {
                e=0;
                status='f';
                continue;
            }
            case 'f':
            {
                pos=CreateNode(e,c);
                last->next=pos;
                last=pos;
                c=0;e=0;
                status='c';
                i--;
                continue;
            }
        }
    }   
    pos=CreateNode(e,c);
    last->next=pos;
    return L;
}

我就写了这么一点代码,而且其中应该还会有bug,推荐大家看一下只是为了学习除虫技术么,嘿嘿嘿嘿。
第一次在博客上发文章试试看,写的不好大家包含哈。

一元稀疏多项式计算器

试题名称 一元稀疏多项式计算器 时间限制:  2 秒 内存限制:  10000Kb 问题描述 设计一个一元稀疏多项式计算器(习题集P81) 输入说明 多组数据,输入数据第1行为一个整数表示有几组数...
  • hiboy_111
  • hiboy_111
  • 2014年12月11日 17:10
  • 976

数据结构课程设计一元稀疏多项式计算器

#include #include #include typedef struct Polynomial {  float coef;            int exp;       ...
  • xuan_xinya
  • xuan_xinya
  • 2013年04月01日 19:00
  • 1728

一元稀疏多项式加减法计算器

实验一:一元稀疏多项式计算器 [问题描述]: 设计一个一元稀疏多项式简单计算器。 [基本要求]: 一元稀疏多项式简单计算器的基本功能是: (1)输出并建立多项式;(2)输出多项式,输出形式为整数序列:...
  • a010655
  • a010655
  • 2015年05月14日 13:59
  • 4320

设计一个一元稀疏多项式简单的加减法计算器

问题描述: 设计一个一元稀疏多项式简单的加减法计算器 实现要求: 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式: ; (2)输出多项式 (3)多项式A和B相加,建立...
  • xueba8
  • xueba8
  • 2017年10月24日 22:16
  • 151

数据结构1——稀疏多项式乘法计算器

数据结构1——稀疏多项式乘法计算器一元稀疏多项式简单计算器 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列: n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,c...
  • littlebai07
  • littlebai07
  • 2017年03月08日 11:45
  • 246

顺序表实现一元稀疏多项式

上次写了顺序表后就顺便写了顺序表的应用之一:一元稀疏多项式
  • OnlyLove_KD
  • OnlyLove_KD
  • 2016年09月21日 21:02
  • 1562

一元稀疏多项式(加减法)

这是我们的数据结构的一个实验,用链表实现一元稀疏多项式的加减法,我写的是一个无排序的。 基本思路是创建一个结构体节点,储存每一项的系数(float),指数(int),和一个next指针。输入两个链表...
  • Chuck_0430
  • Chuck_0430
  • 2012年11月14日 23:31
  • 4488

【C++】PAT(basic level)1010. 一元多项式求导 (25)

1010. 一元多项式求导 (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 设计函数求一元多项...
  • artemisrj
  • artemisrj
  • 2014年03月13日 21:10
  • 1095

一元稀疏多项式

/*******************************************************************   文件名: CNode.h   摘要: 多项式中每一个项CN...
  • DL88250
  • DL88250
  • 2006年12月10日 15:22
  • 1586

一元稀疏多项式相加

#include #include using namespace std; typedef struct { int ceof; int expn; }Poly; typedef s...
  • Leo__Ares
  • Leo__Ares
  • 2016年10月07日 10:49
  • 246
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一元稀疏多项式计算器:一次数据结构实验的题目
举报原因:
原因补充:

(最多只允许输入30个字)