数据结构PT1——线性表/链表

1:顺序存储实现(数组实现)

Data: a1 a2 .....ai ai+1 .... an ....

cpp 复制代码
typedef struct LNode *List; //指向LNode的指针,这是typedef的,你可以随时声明,而不加typedef只是创建一个
struct LNode{    //结构体成员
    ElementType Data[MAXSIZE];    //数组
    int Last;  
};
struct LNode L;    //声明实例
List PtrL;    //声明PtrL指针变量

访问第i个元素:L.Data[i]或者Ptr->Data[i]

线性表长度:L.Last+1或者PtrL->Last+1

​1>初始化

cpp 复制代码
List MakeEmpty()    //返回List指针
{
    List Ptrl;
    Ptrl = (List)malloc(sizeof(struct LNode));    //动态创建LNode,需要指向该结构的指针
    Ptrl->Last = -1;    //通常通过判断或者使得Last = -1,来使得一个新的空链表时初始化
    return Ptrl;
}

​2>查找

cpp 复制代码
int Find(ElementType X, List PtrL)
{
    int i = 0;
    while(i <= PtrL->Last    &&    PtrL -> Data[i] != X)    //Last 是链表中最后一个元素的索引而不是元素个数,因为结构体中的Last声明过
        i++;
    if(i > PtrL -> Last)
    return -1;
    else return i;
 }

​3>插入

​先移动、再插入,比如在i位置插入x元素,要把i-1后面的元素全部向右移动一位

cpp 复制代码
void Insert(ElementType X,int i,List Ptrl)
{
    int j;
    if(PtrL -> Last == MAXSIZE -1){
        print("表满");
        return;
    }
    if(i < 1 || i > PtrL ->Last + 2){
        printf("位置不合法");
        return;
    }
    for(j = Ptrl -> Last;j >= i-1;j- -)
        PtrL -> Data[j+1] = PrL -> Data[j];    //循环把j位置的元素给到j+1位置的元素
    PtrL -> Data[i-1] = X;    //把i-1位置的元素替换成X
    PtrL -> Last++;    //Last+1
    return
}

​4>删除

​先删除、再移动

cpp 复制代码
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];    //循环把i+1位置的元素向左移动
    PtrL -> Last- -;
    return;
}

2:链式存储实现

不要求逻辑相邻的两个元素物理上也相邻,通过"链"建立起元素上的逻辑关系

它的元素定义如下:它不再使用数组和int类型的末尾元素,而是Data和Next

cpp 复制代码
typedef struct LNode *List;
struct LNode{
    ElementType Data;
    List Next;
};
struct LNode L;
List PtrL;

链表由多个这样的"元素"连接而成,PtrL是指向该元素的指针,Next是指向下一个元素的指针,简单来说,Ptrl就是头指针,Next是尾指针

​1>求表长

cpp 复制代码
int Lenth(List PtrL)    //只知道链表的头指针,单向链表
{
    List p = PtrL;    //临时指针P指向链表头
    int j = 0;
    while(p){        //p指针不结束
        p = p -> Next;    //指向下一个
        j++;
    }
    return j;
}

​2>查找

按序号查找:FindKth; ​(查找位于第K号的元素)

cpp 复制代码
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;    //找到第K个,返回指针
    else return NULL;    //没找到返回空
}

​3->插入

​①s指向新节点

​②p指向链表的第i-1个节点

​找到修改指针,插入节点

③​把s指针赋给p指针的下一位,p -> Next = s;

​④把p的下一位赋值给s的下一位

cpp 复制代码
List Insert(ElementaType X ,int i , List PtrL)    //在i位置插入元素X
{
    List p ,s;    //两个临时指针p,s
    if(i == 1){  //如果在表头插入
        s = (List)malloc(sizeof(struct LNode));    //(List) 将 malloc 返回的指针转换为 List 类型的指针,指向struct的指针
        s -> Data = X;
        s -> Next = PtrL;    //    把原来的头指针给新元素的尾指针
        return s;
    }
    p = FindKth(i-1 , PtrL);    //查找位于i-1位置的元素,把指向该位置的指针赋值给p
    if(p == NULL){
        printf("参数i错误");
        return NULL;
    }
    else{
        s = (List)malloc(sizeof(struct LNode));    
        s -> Data = X;        
        s -> Next = p -> Next;    //s是新元素
        p -> Next = s;
        return PtrL;
}

​4->删除

​①找到i-1个节点,用p指向

​②用s指向要被删除的节点(p的next)

​③修改指针,删除s指向节点

​④释放s空间

cpp 复制代码
List Delete(int i ,List PtrL)
{
    List s, p;
    if( i == 1){
        s = PtrL;
        if(PtrL != NULL) PtrL = PtrL -> Next    //从链表中删除s
        else return NULL;
        free(s);    //释放s空间
        return PtrL;
        }
        p = FindKth(i-1 , PtrL);    //查找i-1个节点
        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;
}
相关推荐
别NULL3 小时前
机试题——疯长的草
数据结构·c++·算法
ZSYP-S4 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
唐叔在学习4 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA4 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
武昌库里写JAVA7 小时前
浅谈怎样系统的准备前端面试
数据结构·vue.js·spring boot·算法·课程设计
S-X-S7 小时前
代码随想录刷题-数组
数据结构·算法
l138494274518 小时前
每日一题(4)
java·数据结构·算法
kyrie_sakura8 小时前
c++数据结构算法复习基础--13--基数算法
数据结构·c++·算法
XWXnb68 小时前
数据结构:顺序表
数据结构·算法
橘颂TA8 小时前
【C++】数据结构 顺序表的实现(详解)
开发语言·数据结构·c++·算法