数据结构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;
}
相关推荐
wheeldown6 小时前
【数据结构】选择排序
数据结构·算法·排序算法
躺不平的理查德10 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
阿洵Rain10 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法
Leo.yuan10 小时前
39页PDF | 华为数据架构建设交流材料(限免下载)
数据结构·华为
半夜不咋不困11 小时前
单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构
数据结构·链表
忘梓.11 小时前
排序的秘密(1)——排序简介以及插入排序
数据结构·c++·算法·排序算法
y_m_h14 小时前
leetcode912.排序数组的题解
数据结构·算法
1 9 J14 小时前
数据结构 C/C++(实验三:队列)
c语言·数据结构·c++·算法
921正在学习编程14 小时前
数据结构之二叉树前序,中序,后序习题分析(递归图)
c语言·数据结构·算法·二叉树
毕竟秋山澪14 小时前
岛屿数量 广搜版BFS C#
数据结构·算法·宽度优先