文章目录
线性表采用顺序存储的方式称为顺序表
顺序表的基本概念
线性表
- 是一个线性结构
#define MAXSIZE 100
typedef int datatype; //typeof给int取名叫datatype
typedef struct{ //结构体
datatype a[MAXSIZE]; //这里以数组的形式储存,后期可修改其类型
int size; //上面MAXSIZE是数组最大内存,这里size表示元素个数
}sequence_list //自定义名字
顺序表的初始化—置空表
void init(sequence_list *slt) //*slt结构体类型的指针
{
slt->size=0; //借助指针访问对象,即(*slt)size
}
在顺序表后部进行插入操作
void append(sequence_list *slt,datatype x)//末尾想要添加一个数
{
if(slt->size==MAXSIZE)
{printf("顺序表是满的");exit(1);}
//exit(1)指的是整个程序直接退回操作系统
slt->a[slt->size]=x;//最后一个单元格放x
slt->size=slt->size+1;//元素个数加1
}
注意:插入数据必须判断元素个数是否已满
打印顺序表的各结点值
void display(sequence_list *slt)
{
int i;
if(!slt->size)
printf("\n顺序表是空的")
else
for(i=0;i<slt->size;i++)
printf("%5d",slt->a[i]);
}
判断顺序表是否为空表
int empty(sequence_list *slt)
{
return (slt->size==0?1:0);
}
查找顺序表中值为x的结点
int find(sequence_list *slt,datatype x)
{
int i=0;
while(i<slt->size&&slt->a[i]!=x)
i++;
return(i<slt->size?i:1);
}
取得顺序表中第i个结点的值
datatype get(sequence_list *slt,int i)
{
if(i<0||i>slt->size){
printf("指定顺序表不存在");exit(1);
}
else
return slt->a[i];
顺序表插入
void insert (sequence_list *list,datatype x,int position)
{
int i;
if(list->size==MAXSIZE)
{printf("\n顺序表是满的,没法插入!");exit(1);}
if(position<0||position>slt->size)
{ptintf("\n插入的位置不存在");exit(1);}
}
for(i=slt->size;i>position;i--) slt->a[i]=slt->a[i-1];
slt->a[position]=x;slt->size++;
}
顺序表的删除
void dele (sequence_list,int position)
{
int i;
if(slt->size==0)
{printf("\n顺序表是空的");exit(1);}
if(position<0||position>=slt->size) //最大下标
{printf("\n指定删除位置不存在");exit(1);}
for(i=position;i<slt->size-1;i++) set->a[i]=slt->a[i+1];
slt->size--;
}
课后答疑
- 等概率情况下平均移动次数(等差数列)
查询 (n+1)/2 删除 (n-1)/2 插入 n/2
注意:算完总共次数记得/变化后的总个数 - exit(1) 描述算法不多(因为执行后退出程序回到系统,这个程序就废了)。所以我们做题可以用return等
- 上面写的顺序表插入代码,可以这么改
void insert (sequence_list *list,datatype x,int position)
{
int i;
if(list->size==MAXSIZE)
{printf("\n顺序表是满的,没法插入!");exit(1);}
if(position<0||position>slt->size)
{ptintf("\n插入的位置不存在");exit(1);}
}
//for(i=slt->size;i>position;i--) slt->a[i]=slt->a[i-1];
for(i=slt->size-1;i>=position;i--) slt->a[i+1]=slt->a[i];
slt->a[position]=x;slt->size++;
}
- 为什么是void append(squenerce_list *slt),而不是(squenerce_list *slt)?
因为 *slt 是地址传递,传的是结构体本身
没有 * 是单向传递,是一个复制结构
-
注意:这里是指次数,而不是时间复杂度。时间复杂度是O(n)