数据结构之一元多项式

  先声明,高手勿喷,本人菜鸟,Rose不仅是正在学习数据结构的新手而且是第一次写技术性的博客文章。

  上个星期完成了老师布置的作业———《数据结构》的顺序表和一元多项式,本打算前两天写关于顺序表的博客文章,但后来想了想,还是写这个链表的吧。当你们按照书上的代码敲上去vc或者其他编译器时候,是不是发现无法通过,在这里提示一下各位,我们书上虽然写着数据结构(c语言版),但是这里面的伪代码涉及到了引用“&”,这是c里面没有的,而是c++的概念,因此,我们在为工程添加file时候,必须是cpp源文件。由于觉得代码篇幅较短,所以没有把文件分开来写,下次的作业,Rose会采用分开来写的方(即是头文件+实现源文件+主函数源文件)。

好吧,废话多了点,进入正题,先来看看头部定义。

#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;
typedef int ElemType;

typedef struct DulNode
{
ElemType exp; //指数
ElemType coef;//系数*注:在是头结点,coef则记录了该表的结点数
struct DulNode *prior;//前驱指针
struct DulNode *next;//后继指针
}DulNode,*DulLinkList;

必须包含的头文件就不多说了,这篇文章,我会贴出这个宏定义,而后就不在贴出,在Rose的代码中,只定义了这几个宏,然而你们会发现在其他的资料还有个infeasible -2,这个看你的需要了。还有自定义的2个类型(int),Status、ElemType,以后看到这个标识符(identifier)就知道是什么了吧。接下来定义的就是双向表形式的存储结构了。注释清楚,不用多说了。

下面看看函数声明部分,这次的程序有18个函数:

Status Create(DulLinkList &L);//建表
Status Destroy(DulLinkList &L); //销毁
Status CleanUp(DulLinkList &L); //清空,注意是并不释放对象内存,而是把头结点置空
Status Insert(DulLinkList &L); //提供给用户的插入界面
Status Insert(DulLinkList &L,int index,ElemType coef,ElemType exp);//重载Insert(),在Add()里面调用
Status BubbleSort(DulLinkList &L); //不合适||-_,
Status SimplySort(DulLinkList &L); //不合适||-_,
void QuickSort(DulLinkList &L,int low,int high); //快排适用于链表结构
Status DoDataExchange(DulNode *S,DulNode *R); //数据交换
Status Delete(DulLinkList &L); //提供给用户的删除界面
Status Delete(DulLinkList &L,int item); //重载Delete(),在Add()里面调用
Status Add(DulLinkList &L1,DulLinkList L2); //2个多项式相加得到L1,并销毁L2
Status Find(DulLinkList L,ElemType &coef,ElemType &exp);//查找某项,并返回系数和指数
Status Show(DulLinkList L); //打印输出表达式
void DrawMenu(); //画菜单
int DataCmp(int a,int b); //两个数比较,若a大则返回1,若相等返回0,否则返回-1
int Partition(DulLinkList &L,int low,int high); //划分

这些函数有几个是重载的,专门给自己定义的函数调用,并非提供给用户界面的,所以我都有注释着重载,对于重载的概念,没学过c++的,我在简要说一下,重载某个函数的要求就是该函数与某函数同名,但参数必须不同(可以是个数不同,可以是个数相同,而某个类型不同)。在这里我不会对每个函数都去解释,Rose相信各位都能懂,不过有些注意的地方,还是说说把,而且也是自己碰到过的问题,就是排序问题,对于链表的排序,Rose发现原来不是像顺序表那样可以随机交换数值那么简单,所以当时,编完两个排序算法(冒泡和选择)也觉得奇怪了,不能正确排序。于是乎Rose又写了第三个排序算法,快排,然后,还是没成功,发现排序结果只完成了一趟,就是把Partition()把数据划分了一趟,这个问题我也思考着,究竟是该用数值进行交换呢,还是指针进行呢。对于链表这种不能随机存取的结构,我们显然不能直接数值交换,怎么样实现排序,我们需要用2个指示指针来完成,当第一个指针指示某结点,而另一个指针需要指向下一个结点,不过,我们又该怎样去实现这个算法。推荐看看http://blog.csdn.net/wumuzi520/article/details/8078322。如果不用快排也可以,当然,其他排序算法,Rose会在后面需要的时候再进行补充。

好吧,晚了,明早还有课,就写到这把,大概就讲了编译注意的事情和某些书上没有的定义一般都是int以及链表排序遇到的一些问题。

另外这里是我自己写好的源码:

1.第一次作业,顺序表:

http://download.csdn.net/detail/u011440667/7056761

2.这次作业,一元多项式:

http://download.csdn.net/detail/u011440667/7068929

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值