学习来自浙大陈越,何钦铭老师
目录
2022.10.15
线性结构
线性表及其实现
多项式的引入
如何对多项式进行运算
顺序表表示
把指数部分和系数组成结构,然后存储


链表表示
每个节点存储多项式的非零项,包括系数指数和一个指针域


typedef struct polyNode *polynomial;
struct polyNode {
int coed;
int expon;
polynomial link;
}
结构体知识补充
//来自菜鸟教程
struct tag {
member-list
member-list
member-list
...
} variable-list ;
tag 是结构体标签。
member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef struct
{
int a;
char b;
double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
指向结构的指针
您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
struct Books *struct_pointer;
现在,您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示:
struct_pointer = &Book1;
为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:
struct_pointer->title;
线性表(List)
定义:
同类型数据元素构成的有序序列的线性结构;
基本操作:
List MakeEnpty() 初始化空表L;
ElementType Findth(int K ,List l) 根据位序,返回相应元素;
int Find (ElementType X,List L)查找;
void insert(ElementType X, int i,List L)插入;
Void Delete(int i,List L)删除;
int length(List L)返回长度;
线性表的顺序存储实现

- 初始化
- 查找
- 插入
- 删除
//建立空表
List MakeEnpty(){
List Ptrl;
Ptrl=(Lisr)malloc(sizeof(struct LNode ));
Ptrl->Last=-1;//last是最后一个元素
return Ptrl;
}
//查找元素X
//查找成功平均(n+1)/2 ,时间复杂度为O(n);
int Find (ElementType X,List L)
{
int i;
while(i<=Ptrl->Last&& Ptrl->Data[i]!=X) //小于顺序表长度并且没有找到等于X的元素
{
i++;
}
if(i>Ptrl->last) return -1; //没找到返回-1;
else return i; //找到返回存储位置
}
//插入,在第i个位置插入一个值为的X元素
//把i后面的移动一位,并且从最后开始移动,再插入
//平均移动次数 n/2,时间复杂度为O(n)
void insert(ElementType X, int i,List L){
int j;
if(Ptrl->last==MAXSIZE-1)
{
//表满
return;
}
if(i<1||i>Ptrl->Last+2)
{
//位置不合法
return;
}
for(j=Last-1;j>=i-1;j--)
{
Ptrl->Data[j+1]=Ptrl->Data[j];
Ptrl->Data[i-1]=X;
Ptrl->Last++;
return;
}
}
//删除,删除第i元素
Void Delete(int i,List L)
{
int j;
if(i<1||i>Ptrl->Last+1)
{
//位置不合法
return;
}
for(j=i;j<=Ptrl->Last;j++)
{
Ptrl->Data[j-1]=Ptrl->Data[j];
Ptrl->Last--;
}
}
补充:malloc
//malloc动态存储
用法:
int* arr = (int*)malloc(sizeof(int) * N)
//sizeof(int) 代表数组中每个元素的类型
//N 代表数组的元素个数
//malloc的意义是向堆区要一块sizeof(int) * N 这么大的空间
//同时搭配free释放空指针
free():将申请来的空间的首地址还给“系统”,只要申请到了空间就一定要归还
链式存储与查找

//求表长
//时间复杂度为O(n)
int length(List Ptrl)
{
List p=Ptrl;//p指向表的第一个节点
int j=0;
while(p)
{
p=p->next;
j++; //p指向第j个元素
}
return j;
}
//查找
//按序号查找
List FindKth(int K ,List Ptrl){
int i=1;
List p=Ptrl;
while(p!=NULL&&i<K){
p=p->Next;
i++;
}
if(i==k)
returm p;
else return NULL;
}
//按值查找
List Find(ElementType x ,List Ptrl){
List p=Ptrl;
while(p!=NULL&&p->Data!=x){
p=p->Next;
}
return p;
}
插入
- 先构造一个新节点s;
- 找到需要插入的位置i,并把i-1节点用p指向;
- 修改指针,进行插入
- p的下一个节点指向新插入的节点s
- s的下一个节点指向原来p的下一个节点

//插入
//在i-1个节点后插入一个值为x的新节点
List insert(ElementType x ,int i,List Ptrl){
List s,p;
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){
return NULL;
//没有查到插入数据
}
else{
s=(List)malloc(sizeof(struct LNode))
s->Data=x;
s->next=p->next;
p->next=s;
return Ptrl;
}
}
删除
- 找到需要删除的第i'个位置,并把p指向i-1;
- 用s指向要被删除的结点i;
- 修改指针,删除s所指的结点;
- 最后释放s的节点空间

//删除
//删除表第i个元素
List Delect(nt i,List Ptrl){
List s,p;
//删除位置在第1个位置
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){
return NULL;
//第i个节点不存在
}
else if(p->next==NULL{
return NULL;
//第i个节点不存在
})
else{
s=p->next;
p->next=s->next;
free(s)
return Ptrl;
}
}
本文详细介绍了线性表的基本概念及其两种主要实现方式——顺序存储和链式存储。通过具体的代码示例,展示了如何进行初始化、查找、插入、删除等基本操作。此外,还讨论了多项式运算的实现方法。

847

被折叠的 条评论
为什么被折叠?



