前言:
前些日子终于下定决心将C语言进阶教程学完了,哈哈哈哈哈哈。不怕你们笑话,这是一年时间终于把C语言看完了,作为一个计算机专业的学生实在是感到惭愧。那么,之后就要重新认识自己,重新规划目标,开始努力。很显然,现阶段我开始了数据结构的学习,参考课程是来自比特就业课的数据结构课程文档和中国大学慕课上浙江大学的数据结构课程(主)//这课程太np了,我的原创水平实在无法超越;。过段时间也会把进阶C语言的一些内容更新到博客上,嗯......就这样。
线性表://内容使用一维数组及单向链表实现,总体内容也是对其的各种操作,较为简单,可自行跳过......
多项式的表示:
Example:一元多项式及其运算:
有一个一元多项式:
//这烦人的水印;
可以使用什么方法在计算机中表示出来?
数组or顺序储蓄结构:
首先分析多项式的关键数据——多项式的系数 'n' 和各项的系数 ‘ai’ 及指数 ‘i' 。那么最为简单直接的方法就是拿数组 arr[i] 表示,数组每一位元素的下标就是 ’i' 的值//与 n 相同;,数组中存放各项的系数 ‘ai' 即可。若要实现两个多项式相加,则将两个数组对应元素相加即可。
//此方法简单粗暴,但存在很大的局限性;
好的,那么正如问题中所表示的一个多项式,在储存时难道要定义一个2000*sizeof(arr[0])大小的数组吗?那......如果更大的呢?所以自然是完全不行的。为了使用数组应对这种问题,所以就不能在数组中表示 ’0‘ 项。那很显然只需要再加一个数组,使用两个数组来表示一个多项式的系数 ai 和指数 i 即可。 //这应该是结构数组;
当执行相加运算时只需要将指数相同的每一项相加即可。如若出现只存在于一个多项式的额...指数 i ,则将其直接拷贝至结果数组的相应位置即可。
链表:
那,在理解了数组的处理方法之后,链表的操作就更容易理解了。因为链表的每个结点可以储蓄多项式中的一个非零项,包括系数和指数在内。//准确的说叫两个数据域和一个指针域。
线性表:
//无聊的定义
“线性表(Linear List)”:由同类型数据元素构成有序序列的线性结构; 表中元素个数称为线性表的长度; 线性表没有元素时,称为空表; 表起始位置称表头,表结束位置称表尾;
数据对象集:线性表是 n (≥0)个元素构成的有序序列( a1 , a2 , ...,an );
操作集:线性表L 属于 List,整数i表示位置,元素X 属于 ElementType。
线性表基本操作主要有:
//顺序储蓄的实现:“一个带数组的结构”
此实现方式需使用结构体对以前的数组方式进行优化,通过如下方式构建。使用 Last 表示最后一个元素的位置//没有元素返回 ’-1‘。问题依旧是上面的问题,解决方法也与上文相同,只不过用起来更方便。
主要操作的实现:
初始化中没有元素返回 ‘-1’;查找中以遍历的方式查找。
插入元素时需要将对应位置及之后的所有元素向后移动才可插入。
删除操作与插入类似,需要将删除位置及之后的所有元素向前移动。
对于处理 ‘0’ 项的方法依旧是使用两个数组,只不过这两个数组都被存放在了同一结构中。
//线性表的链表实现:
首先,链表是不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建 立起数据元素之间的逻辑关系。那么进行有关操作时不需要移动数据元素,只需要修改“链”。
主要操作的实现:
通过遍历单向链表求的表长。
OK,还是遍历单向链表。
//注意:修改指针的两个步骤的顺序不能改变,因为单向链表中只存放下一个结点的指针,而不存放上一个结点的指针,会使链表断开且出现野指针。删除操作同理。
广义表:更复杂的链表 //麻了
//概念:
广义表是线性表的推广 对于线性表而言, n个元素都是基本的单元素; 广义表中,这些元素不仅可以是单元素也可以是另一个广义表。
Example:表示二元多项式。
多重链表:由广义表引出,为树、图学习做铺垫
多重链表:链表中的节点可能同时隶属于多个链 多重链表中结点的指针域会有多个,如前面例子包含了Next和 SubList两个指针域; 但包含两个指针域的链表并不一定是多重链表,比如在双向链表 不是多重链表。
//先上一张图,哈哈哈哈;
//题目:
这种事情,不是数组就是链表了呗,此处可以采用一种典型的多重链表——十字链表来存储稀疏矩阵。
只存储矩阵非0元素项 结点的数据域:行坐标Row、列坐标Col、数值Value 每个结点通过两个指针域,把同行、同列串起来; 行指针(或称为向右指针)Right ;列指针(或称为向下指针)Down
与广义表相同使用一个标识域Tag来区分头结点和非0元素结点;头节点的标识值为“Head”,矩阵非0元素结点的标识值为“Term”。
//啊!我似乎看到我将来为一大堆数据丝缕缠留的情况了,呜呜呜~~