目录
1、问题引入:如何表示多项式:
方法一: 数组分量对应多项式各项:
A[ i ]=表示第 i 项数的系数,下表表示次数
?缺点:数组不能太大,浪费空间
方法二: 顺序存储结构表示非零项,
相加过程:从头开始,比较两个多项式当前对应项的指数,返回指数大的,如果两指数相等,则返回系数和。类似归并排序的那种思路。
方法三: 链表结构存储非0项。
2、线性表 :
由同类型数据元素构成有序序列的线性结构
len(List)=元素个数
没有元素时,为空表
表头 // 表尾
2.1主要操作实现:
typedef struct LNode *List;
struct LNode
{
ElementType Data;
List Next;
};
struct Lnode L;
List PtrL; //指针
/*
访问下标为i的元素:L.Data[i]
线性表的长度:L.Last+1
*/
2.1.1初始化(建立空的顺序表):
List MakeEmpty()
{
List PtrL;
PtrL = (List) malloc(sizeof(struct LNode));
PtrL.Last = -1;
return PtrL;
}
2.1.2查找(平均时间复杂度O(n/2))
int Find(ElementType X,List PtrL)
{
int i=0;
while( i<=PtrL.Last &&PtrL.Data[i]!=X)
i++;
if(i > PtrL.last) return -1;
/*List 长度为(List.last+1),因为是数组,所以下标最多为List.last*/
else return i;
}
2.1.3 插入(倒着移动)
void Insert(ElementType X,int i,List PtrL)
{
int j;
if(PtrL.Last == MAXSIZE-1)
{
printf("表满");
return ;
}
if( i <1 || i > PtrL.Last+2 )
{
printf("位置不合法");
return ;
}
for(j = PtrL.Last;j>=i-1;j--)//倒着来添加
{
PtrL.Data[j+1] =PtrL.Data[j];
}
PtrL.Data[i-1]=x;
PtrL.Last++;
return ;
}
}
2.1.4删除
void Delete(ElementType X,int i,List PtrL)
{
int j;
if( i <1 || i > PtrL.Last+1 ) //一共有Last+1个元素,但是下标只在Last
{
printf("不存在");
return ;
}
for(j = i;j<=PtrL.Last;j++)//倒着来添加
{
PtrL.Data[j-1] = PtrL.Data[j];
}
PtrL.Last--;
return ;
}
}
2.2线性表的链式存储实现
不要求逻辑上相邻的两个元素物理上也相邻。
2.2.1求表长(O(N))
int Length(List PtrL)
{
List p=PtrL;
int j=0;
while(P)
{
p=p.Next;
j++;
}
return j;
}
2.2.2查找
//按序号找
List FindKth(int K,List PtrL)
{
List p=PtrL;
int i=1;
while(p!=Null && i<k)
{
p=p.Next;
i++;
}
if(i==k) return p;//返回指针类型 所以函数类型为List
return NULL;
}
//按元素找
List Find(ElementType X,List PtrL)
{
List p=PtrL;
While(p!=NUMLL &&p.Data!=X)
{
p = p.Next;
}
if(p.Data==X)return P;
return NULL;//表示没有这个值。。。
}
2.2.3插入
List Insert(ElementType X,int i,List PtrL)
{
List p,s;
if(i==1)
{
s=(List)malloc(sizeof(struct Lnode)); //申请
s.Data =X;
s.Next = PtrL;
return s;
}
p = FindKth(i-1,PtrL);
if(p==Null)
{
printf("参数错误");
return NULL;
}
else
{
s = (List)malloc(sizeof(struct LNode));
s.Data = X;
s.Next =p.Next;// i指向i+1
p.next =s;//i-1指向i
return PtrL;
}
2.2.4:删除
List Delete(int i,List PtrL)
{
List p,s;
if(i==1)
{
s=PtrL; //申请
if (PtrL!=NULL) PtrL =PtrL.Next;
else return NULL;
free(s);
return PtrL;
}
p = FindKth(i-1,PtrL);
if(p==Null)
{
printf("第%d结点不存在",i-1);
return NULL;
}
else if (p.Next ==NULL)
{
printf("第%d个结点不存在",i);
return NULL;
}
else
{
s = p.Next;
p.Next =s.Next;
free(s);
return PtrL;//返回的是修改后的整体的列表
}
2.3总结:
顺序查找第k个元素,O(1)借助下表表示顺序
链式查找为O(k);链式不借助下标表示顺序
3.问题引入:如何表示二元多项式
3.1广义表
广义表是线性表的推广,对于Data,不仅仅是简单类型,还可以是指针等类型
3.2多重链表
结点的指针域会有多个(但包含两个指针域的链表不一定是多重链表,比如双向链表)
可以用来存储‘稀疏二维数组’//行列式