目录
一、线性表及其实现
1、多项式的表示
【例】一元多项式及其运算
一元多项式:
主要运算:多项式相加、相减、相乘等
【分析】多项式的关键数据:
多项式项数n
各项系数及指数i
方法1:顺序存储结构直接表示
数组各分量对应多项式各项:
a[i]:项xi的系数ai
例如:
表示成:
两个多项式相加:两个数组对应分量相加
方法2:顺序存储结构表示非零项
每个非零项 涉及两个信息:系数
和指数 i
可以将一个多项式看成是一个 二元组的集合。
用结构数组表示:数组分量是由系数 、指数 i 组成的结构,对应一个非零项
例如: 和
相加过程:可以从头开始,比较两个多项式当前对应项的指数
方法3:链表结构存储非零项
链表在每个结点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指数域
结点:
Struct PolyNode
{
int coef;
int expon;
Polynomial link;
}
PolyNode* Polynomial;
【链表存储形式】
2、什么是线性表
-
线性表(Linear List):由同类型数据元素构成有序序列的线性结构
-
表中元素个数称为线性表的长度
-
线性表没有元素时,称为空表
-
表起始位置称为表头,表结束位置称为表尾
-
-
线性表的抽象数据类型描述
-
类型名称:线性表(List)
-
数据对象集:线性表时
个元素构成的有序序列
-
操作集:线性表
,整数i表示位置,元素
,线性表基本操作主要有:
-
1、List MakeEmpty():初始化一个空线性表L;
-
2、ElementType FindKth(int K, List L):根据位序K,返回相应元素;
-
3、int Find(ElementType X, List L):在线性表L中查找X的第一次出现位置;
-
4、void Insert(ElementType X, int i, List L):在位序i前插入一i个新元素X;
-
5、void Delete(int i, List L):删除指定位序i的元素;
-
6、int Length(List L):返回线性表L的长度n。
-
-
3、线性表的顺序存储实现
利用数组的连续存储空间顺序存放相信白哦的各元素
sruct LNode
{
ElementType Data[MAXSIZE];
int Last;
}
LNode L;
LNode* PtrL = &L;
访问下标为 i 的元素:L.Data[i] 或 PtrL->Data[i]
线性表的长度: L.Last+1 或 PtrL->Last+1
主要操作的实现
3.1初始化(建立空的顺序表)
LNode* MakeEmpty()
{
LNode* PtrL = new LNode(sizeof(struct LNode));
PtrL->Last = -1;
return PtrL;
}
3.2查找
int Find(ElementType X, List PtrL)
{
int i = 0;
while (i <= PtrL->Last && PtrL->Data[i] != X)
{
i++;
}
//如果没有找到,返回-1
if (i > PtrL->Last)
{
return -1;
}
else if
{
//找到后返回存储位置
return i;
}
}
查找成功的平均次数为(n+1)/2,平均时间性能为O(n)。
3.3插入
第 个位置上插入一个值为X的新元素
void Insert(ElementType X, int i, List PtrL)
{
if (PtrL->Last == MAXSIZE - 1)
{
cout << "表满" << endl;
return;
}
if (i < 1 || i > PtrL->Last + 2)
{
cout << "位置不合法" << endl;
return;
}
for (int j = PtrL->Last; j >= i - 1; j--)
{
PrtL->Data[j + 1] = PtrL->Data[j];
PrtL->Data[i - 1] = X;
PrtL->Last++;
return;
}
}
平均移动次数为n/2,平均时间性能为O(n)。
3.4删除
删除表的第 个位置上的元素
void Delete(int i, List PtrL)
{
if (i < 1 || i > PtrL->Last + 1)
{
cout << "不存在该元素" << endl;
return;
}
for (int j = i; j <= PtrL->Last; j++)
{
PtrL->Data[j - 1] = PtrL->Data[j];
PtrL->Laast--;
}
return;
}
平均移动次数为(n-1)/2,平均时间习能为O(n)。
4、线性表的链式存储实现
不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。
故插入、删除不需要移动数据元素,只需要修改“链”。
struct LNode
{
ElementType Data;
List Next;
}
LNode L;
LNode* PtrL = &L;
主要操作的实现:
4.1求表长
int Length(LNode* PtrL)
{
LNode* p = PtrL;
int j = 0;
while (p)
{
p = p->Next;
j++;
}
return j;
}
时间性能为O(N)。