顺序存储结构-数组
顺序存储结构:数据元素、内存地址连续。
数组就是常见的顺序存储结构。
//list
#include <stdio.h>
#include <stdlib.h>
//
//类型,地址为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;
}
发表回复