美文网首页
顺序存储基本操作2

顺序存储基本操作2

作者: 掖莯圷 | 来源:发表于2018-08-27 08:27 被阅读0次

    顺序存储结构的常见操作,使用c语言实现

    1、定义

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #define true 1
    #define false 0
    #define MaxSize 10 //定义顺序表的最大长度
    typedef int bool;
    typedef int ElemType ;
    //定义顺序表结构
    typedef struct _SeqList{
        ElemType *data;//指示动态分配数组的指针
        int size;// 顺序表的有效个数
    }SeqList;
    
    

    2、初始化

    /**
     * 功能:初始化链表
     * 返回值:如果成功,则返回链表的地址,如果失败退出
     */
     SeqList* InitList_Sq(){
        SeqList *pList=NULL;
        pList=(SeqList*)malloc(sizeof(SeqList));
        if(!pList){
            printf("分配内存空间失败!");
            exit(0);
        }
        pList->data=(ElemType*)malloc(sizeof(ElemType)*MaxSize);
        if(pList->data==NULL){
             printf("pList->data动态内存分配失败!\n");
             pList=NULL;
             free(pList);
             exit(0);
        }
        pList->size=0;
        printf("初始化成功\n");
        return pList;
     }
    

    3、判断空表

    /**
     * 功能:判断链表是否是空表
     * 参数:链表地址
     * 返回值:true 是  false 否
     */
    bool IsEmpty_Sq(SeqList *pList){
        if(pList==NULL){
            printf("错误:链表未初始化!");
            exit(0);
        }
        if(pList->size==0){
            return true;
        }
        return false;
     }
    

    4、判断是否已经满

    /**
     * 功能:判断链表是否是已满
     * 参数:链表地址
     * 返回值:true 是  false 否
     */
    bool IsFull_Sq(SeqList *pList){
        if(pList==NULL){
            printf("错误:链表未初始化!");
            exit(0);
        }
        if(pList->size==MaxSize){
            printf("链表空间已满\n");
            return true;
        }
        return false;
     }
    

    5、顺序表长度

      /**
     * 功能:获取链表长度
     * 参数:链表地址
     * 返回值:链表长度
     */
    int Length_Sq(SeqList *pList){
        if(pList==NULL){
            printf("错误:链表未初始化!");
            exit(0);
        }
        return pList->size;
     }
    

    6、插入操作


    image.png
      /**
     * 功能:向链表插入数据元素 前置条件:链表已初始化,1<=index<=pList->size+1
     * 参数:链表地址 下标  插入的元素
     * 返回值:链表长度
     */
    bool Insert_Sq(SeqList *pList,int index, ElemType e){
        //前置条件
        if(pList==NULL){
            printf("错误:链表未初始化!\n");
            return false;
        }
        if(IsFull_Sq(pList)){
            return false;
        }
        if(index<1||index>pList->size+1){
             printf("数组下标越界\n");
             return false;
        }
        //开始插入
        if(!IsEmpty_Sq(pList)){//空表只能插到1的位置
            if(index<pList->size+1){//将要插入的元素位置往后的元素往后移动 往最后面添加一个元素无需移动
                for(int i=pList->size-1;i>=index-1;i--){
                    pList->data[i+1]=pList->data[i];
                }
            }
        }
        pList->data[index-1]=e;
        pList->size++;//链表有效个数加1
        return true;
     }
    

    7、删除操作


    image.png
      /**
     * 功能:向链表删除数据元素 前置条件:链表已初始化,1<=index<=pList->size
     * 参数:链表地址 下标  删除的元素
     * 返回值:true 成功 false 失败
     */
    bool Delete_Sq(SeqList *pList,int index,ElemType *pVal){
        //前置条件
        if(pList==NULL){
            printf("错误:链表未初始化!\n");
            return false;
        }
        if(IsEmpty_Sq(pList)){
            printf("错误:链表为空,不能删除!\n");
            return false;
        }
        if(index<1||index>pList->size){
             printf("数组下标越界\n");
             return false;
        }
        printf("删除的元素为%d\n",pList->data[index-1]);
        *pVal=pList->data[index-1];
        //执行删除 index位置之后的向前移动一个位置
        for(int i=index-1;i<pList->size;i++){
            pList->data[i]=pList->data[i+1];
        }
        pList->size--;//链表有效个数减1
        return true;
     }
    

    8、查找元素

    /**
     * 功能:查找元素,返回下标
     * 参数:链表地址 元素
     * 返回值: 下标 -1 为查找不到
     */
    int Search_Sq(SeqList *pList,ElemType e){
        //前置条件
        if(pList==NULL){
            printf("错误:链表未初始化!\n");
            return -1;
        }
        if(IsEmpty_Sq(pList)){
            return -1;
        }
        for(int i=0;i<pList->size;i++){
            if(e==pList->data[i]){
                return i;
            }
        }
        return -1;
    
    }
    

    9、获取下标的元素

    /**
     * 功能:获取某个下标的元素
     * 参数:链表地址 下标
     * 返回值: 元素
     */
    int getElem(SeqList *pList,int index,ElemType *e){
        //前置条件
        if(pList==NULL){
            printf("错误:链表未初始化!\n");
            return false;
        }
        if(IsEmpty_Sq(pList)){
            printf("错误:链表为空,不能删除!\n");
            return false;
        }
        if(index<1||index>pList->size){
             printf("数组下标越界\n");
             return false;
        }
        return pList->data[index-1];
    
    }
    

    10、遍历

    /**
     * 功能:遍历链表
     * 参数:链表地址
     */
    void Show_Sq(SeqList *pList){
            //前置条件
        if(pList==NULL){
            printf("错误:链表未初始化!\n");
            return;
        }
        bool flag=true;
        printf("[");
        for(int i=0;i<pList->size;i++){
            if(flag){
                printf("%d",pList->data[i]);
                flag=false;
            }else{
                printf(",%d",pList->data[i]);
            }
        }
        printf("]\n");
    }
    

    相关文章

      网友评论

          本文标题:顺序存储基本操作2

          本文链接:https://www.haomeiwen.com/subject/fvxziftx.html