• 线性表的顺序存储实现(一)顺序表


    静态分配存储空间

    定义

    #include <stdio.h>
    #include <stdlib.h>  // malloc 、free
    //***线性表的 顺序存储-> 顺序表的定义***
    
    
    //静态分配存储空间
    #define MaxSize 50
    
    typedef struct
    {
        int data[MaxSize];
        int length;  //数组当前元素个数
    }SqList;
    
    

    初始化

    void InitList(SqList &L)
    {
        L.length = 0;
        for(int i=0; i<MaxSize; i++)  // 可省略
        {
            L.data[i] = 0;
        }
    }
    

    //***插入操作
    bool ListInsert(SqList &L, int i, int e)
    {
        if (i < 1 || i > L.length + 1)           // 判断i的范围是否有效 不可插入无前驱也无后继的空位置
        {
            return false;
        }
        if (L.length >= MaxSize)                 // 空间已满无法插入
        {
            return false;    
        }
    
        for(int j = L.length; j >= i; j--)       // 第i位 及 之后元素后移
        {
            L.data[j] = L.data[j-1];
    
        }
    
        L.data[i-1] = e;                         // 在位置i 放入e
        L.length++;
        
        return true;
    }
    

    //***删除操作
    bool ListDelete(SqList &L, int i, int &e)  // 被删除元素赋值给e 并返回
    {
        if (i<1 || i>L.length)
        {
            return false;
        }
        e = L.data[i-1];
    
        for (int j=i; j<L.length; j++)  // 第i+1位 及 之后元素前移
        {
            L.data[j-1] = L.data[j];
        }
    
        L.length--;  // 线性表长度减少1
        return true;
    }
    

    //***按值查找
    int LocateElem(SqList L, int e)
    {
        int i;
        for(i=0; i<L.length; i++)
        {
            if(L.data[i] == e)
            {
                return i + 1; //  返回元素位序
            }
        }
    
        return 0;  // 查找失败
    }
    

    打印

    //***打印顺序表
    void PrintList(SqList L)
    {
        printf("the sqlist  Length is:%d\n", L.length);
    
        for(int i=0; i<L.length; i++)
        {
            printf("ID: %d L.data[%d] = %d \n", i+1, i, L.data[i]);
        }
    
        puts("\n");
    }
    

    动态分配存储空间

    定义

    #include <stdio.h>
    #include <stdlib.h>  // malloc 、free
    //***线性表的 顺序存储-> 顺序表的定义***
    
    //动态分配存储空间
    #define InitSize 100  // 默认的最大长度
    
    typedef struct  
    {
        int *data;   // 指向动态分配数组的指针
        int maxsize; // 顺序表最大容量
        int length;  // 顺序表当前长度
    }SeqList;
    
    

    初始化

    void InitList(SeqList &L)
    {
        L.data = (int *)malloc(InitSize*sizeof(int));
        L.length = 0;
        L.maxsize = InitSize;
    }
    
    

    动态扩展空间

    void IncreaseSize(SeqList &L, int len)        //增加动态数组长度 每次增加指定长度len
    {
        int *p = L.data;
        L.data = (int *)malloc((L.maxsize+len)*sizeof(int));
        
        for(int i=0; i<L.length; i++)
        {
            L.data[i] = p[i];                    // 将数据复制到新空间
        }
        L.maxsize = L.maxsize + len;             // 顺序表最大长度增加 len
        free(p);                                 // 释放原来的内存空间
    }
    
    

    //***插入操作
    bool ListInsert(SeqList &L, int i, int e)
    {
        if (i < 1 || i > L.length + 1)           // 判断i的范围是否有效 不可插入无前驱也无后继的空位置
        {
            return false;
        }
        if (L.length >= L.maxsize)                 // 空间已满无法插入
        {
            return false;    
        }
    
        for(int j = L.length; j >= i; j--)       // 第i位 及 之后元素后移
        {
            L.data[j] = L.data[j-1];
    
        }
    
        L.data[i-1] = e;                         // 在位置i 放入e
        L.length++;
        
        return true;
    }
    

    //***删除操作
    bool ListDelete(SeqList &L, int i, int &e)  // 被删除元素赋值给e 并返回
    {
        if (i<1 || i>L.length)
        {
            return false;
        }
        e = L.data[i-1];
    
        for (int j=i; j<L.length; j++)  // 第i+1位 及 之后元素前移
        {
            L.data[j-1] = L.data[j];
        }
    
        L.length--;  // 线性表长度减少1
        return true;
    }
    

    //***按值查找
    int LocateElem(SqList L, int e)
    {
        int i;
        for(i=0; i<L.length; i++)
        {
            if(L.data[i] == e)
            {
                return i + 1; //  返回元素位序
            }
        }
    
        return 0;  // 查找失败
    }//***按值查找
    int LocateElem(SeqList L, int e)
    {
        int i;
        for(i=0; i<L.length; i++)
        {
            if(L.data[i] == e)
            {
                return i + 1; //  返回元素位序
            }
        }
    
        return 0;  // 查找失败
    }
    

    打印

    //***打印顺序表
    void PrintList(SeqList L)
    {
        printf("the seqlist  Length is:%d\n", L.length);
    
        for(int i=0; i<L.length; i++)
        {
            printf("ID: %d L.data[%d] = %d \n", i+1, i, L.data[i]);
        }
    
        puts("\n");
    }
    
  • 相关阅读:
    第十二周学习进度条
    课堂练习四
    搜狗输入法
    第十一周学习进度条
    《代码大全(第二版)》阅读笔记01
    典型用户及用户场景描述
    第十周学习进度条
    团队冲刺第六天
    团队冲刺第五天
    团队冲刺第四天
  • 原文地址:https://www.cnblogs.com/hugboy/p/16257831.html
Copyright © 2020-2023  润新知