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


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

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

    1. typedef struct LNode *List; //指向LNode的指针,这是typedef的,你可以随时声明,而不加typedef只是创建一个
    2. struct LNode{    //结构体成员
    3.     ElementType Data[MAXSIZE];    //数组
    4.     int Last;  
    5. };
    6. struct LNode L;    //声明实例
    7. List PtrL;    //声明PtrL指针变量

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

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

        ​1>初始化

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

        ​2>查找

    1. int Find(ElementType X, List PtrL)
    2. {
    3. int i = 0;
    4. while(i <= PtrL->Last && PtrL -> Data[i] != X) //Last 是链表中最后一个元素的索引而不是元素个数,因为结构体中的Last声明过
    5. i++;
    6. if(i > PtrL -> Last)
    7. return -1;
    8. else return i;
    9. }

        ​3>插入

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

    1. void Insert(ElementType X,int i,List Ptrl)
    2. {
    3. int j;
    4. if(PtrL -> Last == MAXSIZE -1){
    5. print("表满");
    6. return;
    7. }
    8. if(i < 1 || i > PtrL ->Last + 2){
    9. printf("位置不合法");
    10. return;
    11. }
    12. for(j = Ptrl -> Last;j >= i-1;j- -)
    13. PtrL -> Data[j+1] = PrL -> Data[j]; //循环把j位置的元素给到j+1位置的元素
    14. PtrL -> Data[i-1] = X; //把i-1位置的元素替换成X
    15. PtrL -> Last++; //Last+1
    16. return
    17. }

        ​4>删除

        ​先删除、再移动

    1. void Delete(int i ,List PtrL)
    2. {
    3. int j;
    4. if(i < 1 || i > PtrL -> Last + 1){
    5. printf("不存在第%d个元素",i);
    6. return;
    7. }
    8. for(j=i ; j <= PtrL -> Last; j++)
    9. PtrL-> Data[j-1] = PtrL -> Data[j]; //循环把i+1位置的元素向左移动
    10. PtrL -> Last- -;
    11. return;
    12. }

    2:链式存储实现

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

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

    1. typedef struct LNode *List;
    2. struct LNode{
    3. ElementType Data;
    4. List Next;
    5. };
    6. struct LNode L;
    7. List PtrL;

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

        ​1>求表长

    1. int Lenth(List PtrL) //只知道链表的头指针,单向链表
    2. {
    3. List p = PtrL; //临时指针P指向链表头
    4. int j = 0;
    5. while(p){ //p指针不结束
    6. p = p -> Next; //指向下一个
    7. j++;
    8. }
    9. return j;
    10. }

        ​2>查找

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

    1. List FindKth(int K,List PtrL)
    2. ​{
    3. ​ List p = PtrL;
    4. int i = 1;
    5. while(p != NULL && i < K){
    6. p = p-> Next;
    7. i++;
    8. }
    9. if(i == K) return p; //找到第K个,返回指针
    10. else return NULL; //没找到返回空
    11. }

        ​3->插入

        ​①s指向新节点

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

    image.png

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

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

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

    1. List Insert(ElementaType X ,int i , List PtrL) //在i位置插入元素X
    2. {
    3. List p ,s; //两个临时指针p,s
    4. if(i == 1){ //如果在表头插入
    5. s = (List)malloc(sizeof(struct LNode)); //(List) 将 malloc 返回的指针转换为 List 类型的指针,指向struct的指针
    6. s -> Data = X;
    7. s -> Next = PtrL; // 把原来的头指针给新元素的尾指针
    8. return s;
    9. }
    10. p = FindKth(i-1 , PtrL); //查找位于i-1位置的元素,把指向该位置的指针赋值给p
    11. if(p == NULL){
    12. printf("参数i错误");
    13. return NULL;
    14. }
    15. else{
    16. s = (List)malloc(sizeof(struct LNode));
    17. s -> Data = X;
    18. s -> Next = p -> Next; //s是新元素
    19. p -> Next = s;
    20. return PtrL;
    21. }

        ​4->删除

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

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

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

        ​④释放s空间

    1. List Delete(int i ,List PtrL)
    2. {
    3. List s, p;
    4. if( i == 1){
    5. s = PtrL;
    6. if(PtrL != NULL) PtrL = PtrL -> Next //从链表中删除s
    7. else return NULL;
    8. free(s); //释放s空间
    9. return PtrL;
    10. }
    11. p = FindKth(i-1 , PtrL); //查找i-1个节点
    12. if(p = = NULL){
    13. printf("第%d个节点不存在",i-1);return NULL;
    14. }else if( p -> Next == NULL){
    15. printf("第%d个节点不存在",i);return NULL;
    16. }else{
    17. s = p -> Next;
    18. p -> Next = s -> Next;
    19. free(s);
    20. return PtrL;
    21. }

  • 相关阅读:
    Elasticsearch配置文件
    基于STC15单片机两路ADC测量串口显示-proteus仿真-源程序
    车道线检测laneatt算法实战CULane Datasets、Tusimple数据集——安装运行训练步骤
    其他算法和思想的题目
    Java——迷你图书管理器(JDBC+MySQL+Apache DBUtils)
    jQuery
    手把手教你如何搭建性能测试环境
    LeetCode 2525. 根据规则将箱子分类:优雅解法?
    mac 切换java jdk版本 java8 java11
    Mongoose模块
  • 原文地址:https://blog.csdn.net/leikang111/article/details/137969045