分享
 
 
 

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

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

据说今天要交这个变态的作业,所以,我赶了一夜写了这么个小程序,可是今天拿到了学校老师却说今天不上课,害的我困的差点撞车。

唉,多少也是写完了一点东西,传上来大家看看吧。

输入一个一元多项式,例如:-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,推荐大家看一下只是为了学习除虫技术么,嘿嘿嘿嘿。

第一次在博客上发文章试试看,写的不好大家包含哈。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有