数据结构Week2-1:线性表的顺式和链式表达

目录

1、问题引入:如何表示多项式:

2、线性表 :

 2.1主要操作实现:

2.2线性表的链式存储实现

2.3总结:

3.问题引入:如何表示二元多项式

3.1广义表

3.2多重链表


 

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多重链表

结点的指针域会有多个(但包含两个指针域的链表不一定是多重链表,比如双向链表)

可以用来存储‘稀疏二维数组’//行列式

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值