顺序存储结构-数组

  • 目录
  • 顺序存储结构-数组

顺序存储结构-数组

顺序存储结构:数据元素、内存地址连续。

数组就是常见的顺序存储结构。

//list
#include 
#include 
//
//类型,地址为data,大小为data的类型*size一片连续的空间
typedef struct node{
    int * data;//数据实际存放的位置
    int size;//存取的 是 data 指向 实际存储空间的  个数    size * sizeof(int)
    int last;//表示 最后一个元素在哪里  -1恰好能表示为空
}list_t;

//创建
list_t* create_list( int size)
{
    if(size<=0||size>1024)
    {
        return NULL;
    }
    list_t* list=malloc(sizeof(list_t));
    //malloc  返回  void *  -》 list_t *  无类型 赋值给有类型  则
    //隐式转换   成  list_t *
    //
    //在  windows 环境下 编译出错   需要强制转换  
    //    list_t* list=(list_t *)malloc(sizeof(list_t));
    //
    list->size=size;

    list->data=malloc(sizeof(int)*size);//给 空间内的   类似数组 赋予 空间

    list->last=-1;//初始化 last为空
    //  .  是结构体变量 访问 变量内的成员
    //  ->  是结构体指针 访问 变量内的成员

    return list;//返回一个  list_t 类型空间的首地址  
}
//判空
int isnull(list_t* list)
{
    if(list==NULL)
        return 0;
    // NULL    -->    (void *)0
    // 不能用0 地址访问 结构体 成员
    // 使用时 会导致 段错误  

    /*
    if(list->last==-1)
        return 1; //真
    else 
        return 0;  //假
    */
    return list->last==-1;//== 判断  
}

//判满
int isfull(list_t* list)
{
    if(list==NULL)
        return 0;

    return list->last==list->size-1;
}

//增
int insert_head_list(list_t* list,int data)
{
    //1 判断实施条件
    if(list==NULL||isfull(list))
        return -1;

    //2 挪
    int i;
    for(i=list->last;i>=0;i--)
    {

        list->data[i+1]=list->data[i];  //挪动数据   腾地方
    }

    //3 放入数据
    list->data[0]=data;

    //4 last++
    list->last++;

    return 0;
}
//删
int delete_head_list(list_t* list)
{
    //1  判断实施条件
    if(list==NULL||isnull(list))
        return -1;

    //2  挪  盖
    int i;
    for(i=0;i<list->last;i++)
    {
        list->data[i]=list->data[i+1];
    }

    //3
    list->last--;
    return 0;
}

//查
int locate_list(list_t* list,int data)
{

    if(list==NULL||isnull(list))
        return -1;

    int i;
    //遍历
    for(i=0;i<=list->last;i++)
    {
        if(list->data[i]==data)
            return i;
        //如果当前位置上的元素 与查找元素相同  则返回位置
    }

    return -1;//始终未找到时 返回 -1;
}
//改
int change_index_list(list_t* list,int index,int data)
{
    if(list==NULL||isnull(list)||index<0||index>list->last)
        return -1;


    list->data[index]=data;

    return 0;

}
//打印
int print_list(list_t* list)
{
    if(list==NULL||isnull(list))
        return -1;

    int i;

    for(i=0;i<=list->last;i++)
    {
        printf("%3d ", list->data[i]);
    }
    printf("\n");


    return 0;


}
//指定位置 插入
int insert_index_list(list_t* list,int index,int data)
{
    //1 判断实施条件
    if(list==NULL||isfull(list)||index<0||index>list->last+1)
        return -1;

    //2 挪
    int i;
    for(i=list->last;i>=index;i--)
    {

        list->data[i+1]=list->data[i];  //挪动数据   腾地方
    }

    //3 放入数据
    list->data[index]=data;

    //4 last++
    list->last++;

    return 0;
}

//指定位置 删除
int delete_index_list(list_t* list,int index)
{
    //1  判断实施条件
    if(list==NULL||isnull(list)||index<0||index>list->last)
        return -1;

    //2  挪  盖
    int i;
    for(i=index;i<list->last;i++)
    {
        list->data[i]=list->data[i+1];
    }

    //3
    list->last--;
    return 0;
}

//逆打印
int re_print_list(list_t* list)
{
    if(list==NULL||isnull(list))
        return -1;

    int i;

    for(i=list->last;i>=0;i--)
    {
        printf("%3d ", list->data[i]);
    }
    printf("\n");

    return 0;
}
//长度
int length_list(list_t* list)
{
    if(list==NULL||isnull(list))
        return 0;

    return list->last+1;
}
//清空
int clear_list(list_t* list)
{
    if(list==NULL)
        return -1;

    list->last=-1;
    return 0;

}

//销毁
int destroy_list(list_t* list)
{
    if(list==NULL)
        return -1;

    free(list->data);

    free(list);



    return 0;
}

int main(int argc, const char *argv[])
{

    if(argc<2)
    {
        printf("please input no\n");
        return -1;


    }
//    printf("sizeof long long:%d\n",sizeof(long long));
    list_t* list=create_list(atoi(argv[1]));

    //ato   ascii  to int 

    int i;

    for(i=1;i<=30;i++)
    {
        if(insert_head_list(list,i*10)==0)
            print_list(list);

    }

    if(0==change_index_list(list,locate_list(list,150),666))
        print_list(list);


    if(insert_index_list(list,locate_list(list,666),150)==0)
        print_list(list);

    if(delete_index_list(list,locate_list(list,666))==0)
        print_list(list);


    re_print_list(list);


    printf("length_list :%d\n",length_list(list));

    clear_list(list);


    printf("length_list :%d\n",length_list(list));

    destroy_list(list);
#if 0
    for(i=1;i<=30;i++)
    {
        if(delete_head_list(list)==0)
            print_list(list);

    }
#endif

    return 0;
}

你可能感兴趣的:(顺序存储结构-数组)