2.1.1多项式的表示
f(x)=a0+a1x+…+a[n-1]*x^(n-1)+ a[n]*x的n次方
如何表达 :A[i]
指数i
多项式项数n
顺序存储结构
1.直接表示
令n=i
问题:表示x+x^345的空间资源过于浪费
2.只表示非零项,将多项式项数看成二元表(n,A[i])
用结构数组表示:数组分量是由指数,系数组成的结构
3.运算方便
按照指数大小有序存储
链表结构储存非零项
链表包括每个结点储存多项式中的一个非零项;包括系数和指数两个数据域和一个指针域
typedef struct PolyNode *Polynomial;
struct PolyNode{
int A;
int n;
Polynomial link;
}
线性表描述
线性表利用数组的连续存储空间顺序存放线性表的各元素
typedef struct LNode* List;
struct LNode{
ElementType Data[MAXSIZE];
int Last
};
struct LNode L;
List PtrL;
访问下标为i的元素:L.Data[i],PtrL->Data[i]
线性表的长度:L.Last+1;/PtrL->Last+1
额外补充
摘自:
https://blog.csdn.net/Poo_Chai/article/details/100605509
typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型=struct Student
stu2必须先 stu2 s2;
然后 s2.a=10;
主要操作的实现
补充:malloc是动态内存分配函数。
a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a
1.初始化
List MakeEmpty()
{
List ptrL;
ptrL = (List)malloc(sizeof(stuct LNode));
ptrL->Last = -1;
return ptrL
}
2.查找元素位置
int Find(ElementType h,List ptrL){
int i = 0;
while(i <= ptrL->Last && h!=ptrL->Data[i]){
i++;
}
if (h!=ptrL->Data[i])
return i;//找到后返回存储位置
else
return -1;
}
3.插入(第i(1<=i<=n+1)个位置上插入一个值为x的新元素)
从最后一个开始往后挪
void Insert(ElementType X,int i, List PtrL){
{
int j ;
//表满
if(PtrL->Last = Maxsize-1)
return;
//满足(1<=i<=n+1)
if(i<1 && i>PtrL->Last)
return;
//交换
for(j = Maxsize+1;j>i; j--){
PtrL->Data[j+1]=PtrL->Data[j];
PtrL->Data[i]=X;
PtrL->Last++;
return;
}
}
4.删除第i(1<=i<=n)个位置上的元素
注意第i个位置和数组从零开始
void Delete(int i,List PtrL)
{
//检验空表和位置的合法性
int j;
if(i<1||i>PtrL->Last+1){
printf("不存在第%d个元素",i);
return;
}
for(j = i;j<=ptrL->Last; j++){
PtrL->Data[j-1]=PtrL->Data[j];
PtrL->Last--;
return;
}
}
链式存储结构
不要求逻辑上相邻的两个元素物理上也相邻;通过‘链’建立逻辑关系
typedef struct Lnode* List;
struct Lnode{
ElementType Data;
List Next;
}
struct Lnode L;
List PtrL;
求长度
int Length(List PtrL)//List PtrL为头指针
{
List p = PtrL;
int j =0;
while(p){
p=p->next;
j++;
}
return j;
}
查找
1.按序号查找
List FindKth(int K ,List PtrL)
{
List p = PtrL;
int i = 1;
while (p!=null && K<i)
{
p=p->next;
i++;
}
if(K = i) return p;
else return null;
}
按值查找
List FindKth(ElementType X ,List PtrL){
List p = PtrL;
while(p!=null && X!=p->Data)
{
p=p->next;
}
return p ;
}
3.插入(在第i-1(1<=i<=n+1)个结点后插入一个值为x的新节点)
1.先造一个新节点,用s指针指向
2.p指向第i-1个节点
3.将新节点尾部接p->next
4.p指向s
List Insert(ElementType X,int i,List PtrL)
{ List p,s;
if(i==1){
s = (List)malloc(sizeof(struct LNode));
s->next= PtrL;//PtrL头指针
s->data=X;
return s;
}
p=FindKth(i-1,PtrL);//查找第i-1个结点
if(p==null){
return null;
}
else{
s = (List)malloc(sizeof(struct LNode));
s->data = X;
s-> next = p->next;
p->next = s;
return PtrL;
}
}
4.删除(删除链表的第i (1<i<n)个位置上的结点)
List Delete (int i,List PtrL)
{
List p,s;
if (i==1){
s=PtrL;
if(PtrL = null) return null;//先检查PtrL头结点是否为空
else PtrL = PtrL->next;
free(s);
return PtrL;
}
p=FindKth(i-1,PtrL);//查找第i-1个结点
if(p==null) return null;
elseif(p->next=null) return null;
else{
s = p->next;
p->next = p->next->next;
free(s);
return PtrL;
}
}