zoukankan      html  css  js  c++  java
  • 线性表 初始化 插入 删除 的操作

    #include <stdio.h>
    #include <stdlib.h>
    
    #define LEN sizeof(ElemType)
    
    #define OK 1
    #define TRUE 1
    #define ERROR -1
    #define FALSE -1
    #define OVERFLOW -2
    
    typedef int ElemType
    typedef int Status
    const LIST_INIT_SIZE=100;//表初始分配空间
    const LIST_INCREMENT=10;//空间分配增量
    typedef struct { //封装一个线性表 为SqList
        ElemType *elem;//存储空间,存放头地址,也可表示数组的名字 或地址  或第一个元素
        int length;//线性表当前长度    
        int listSize;//当前存储容量
        int LIST_INCREMENT;//可增加存储容量
    } SqList; 
    
    Int ListEmpty(SqList L){ //判断线性表L是否为空
        if L.length=0 return TURE;
        else return FALSE;
    }
    
    int ListLength_Sq(SqList L){ //求线性表的长度
        return L.length;
    }
    
    
    Status InitList_Sq(SqList &L){ //初始化空的线性表,&L 引用参数表示会修改值
        //构造空表
        L.elem =(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配内存,返回void*指针,类型强转一下
        if(!L.elem) exit(OVERFLOW);//OVERFLOW是返回到OS的
        L.length=0;
        L.listSize=LIST_INIT_SIZE;
        return TRUE;
    }//InitList_Sq
    
    Status ListInser_Sq(SqList &L,int i,ElemType e){ //插入线性表,i是下标+1表示序号,E是插入值
        if( i<1 || i>L.length) return FALSE;//i的合法值为1<=i<=ListLength_Sq(L)
        if(L.length>=L.listSize){ //当前存储空间已满,(realloc就是)增加内存分配,函数realloc()
            // void* realloc(void* ptr, unsigned newsize);  给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度.
            newbase =(ElemType *)realloc(L.elem,L.(LIST_INIT_SIZE+LIST_INCREMENT)*sizeof(ElemType)); 
            if(!newbase) exit(OVERFLOW);//存储分配失败
            L.elem = newbase;//新的地址
            L.listSize += LIST_INCREMENT;//增加存储容量        
        }
        q = &(L.elem[i-1]);//q为插入位置
        for(p=&(L.elem[L.length-1]); p>=q; --p) { //插入位置及其之后的元素右移
            *(p+1) = *p;
        }
        *q = e;//插入e 的值
        ++L.length;//表长度+1
        return TRUE;
    }//ListInser_Sq
    
    Status ListInser_Sq_Se(SqList &L,int i,ElemType e){ //插入线性表 简化写法 使用指针 不要新开辟内存
        if( i<1 || i>L.length ) return FALSE;//i的合法值为1<=i<=ListLength_Sq(L)
        if(L.length>=L.listSize) exit(OVERFLOW);//超出存储空间,报错退出
        q = &(L.elem[i-1]);//q为插入位置
        for(p=&(L.elem[L.length-1]); p>=q; --p) { //插入位置及其之后的元素右移,p=&(L.elem[L.length-1]表示最末尾的指针,
            *(p+1) = *p;
        }
        *q = e;//插入e 的值
        ++L.length;//表长度+1
        return TRUE;
    }
    
    Status ListDelete_Sq(SqList &L,int I,ElemType &e){ //删除线性表中的第i个元素
        //删除L中第i个元素,后面的元素前移
        if((i<1)||(i>L.length)) return FALSE;
        p=&L.elem[i-1];//p表示删除的地址
        e=*p;//返回e的值
        q=L.elem+L.length-1;//q存放的是线性表内最后位置的指针
        for(++p;p<=q;++p) { //后面的元素前移,先++p是因为p的位置是删除的位置,所以从删除位置的右边+1算起
            *(p-1)=p;//删除的位置 后面的元素前移
        }
        --L.length;
        return TRUE;
    }
    
    Int CompareArray(SqList A,SqList B){ //比较数组大小的方法
        j=0;//计数器
        while(j<A.length && j<B.length)
        {
            if(A.elem[j]<B.elem[j]) return -1;
            else if(A.elem[j]>B.elem[j]) return 1;
            else j++;
        }
        if(A.length==B.length) return 0;
        else if(A.length<B.length) return -1;
        else return 1;
    }//CompareArray
  • 相关阅读:
    js创建form添加input项目并提交表单
    DataTable 修改列名 删除列 调整列顺序
    文件夹右键出取得管理员所有权选项
    c#多线程
    js用计时器加载大量dom
    c# 将html添加进剪贴板(带格式)
    landa语法
    c# @符号后面对 双引号转义
    asp.net web api CORS
    IIS中发布网站的问题
  • 原文地址:https://www.cnblogs.com/blacop/p/6426881.html
Copyright © 2011-2022 走看看