线性表
一.顺序表
1.顺序表的定义与基本使用
/*基本定义*/
#define Maxsize maxlen //maxlen表示线性表可能的最大数据元素数目
typedef int elmentype //elemtype表示数据元素类型,此处定义为int
typedef struct
{
elemtype data[Maxsize]; //存放线性表元素的数组
int len; //表示线性表的长度
}sqlist;
/*两种使用方法*/
sqlist L;//第一种使用方法,L就是顺序表
L.data[i]//顺序表中的第i个元素
L.len//顺序表的长度
sqlist *sq;//第二种使用方法, 定义指向顺序表的指针
sq=(sqlist *)malloc(sizeof(sqlist));//因为是指针,所以需要开辟空间
sq->data[i];//顺序表中的第i个元素
sq->len;//顺序表的长度
2.顺序表的基本操作
构造一个空的顺序线性表
void initlist(sqlist *L)
{
L-> len=0; }
//算法时间复杂度:O(1)
插入算法
思路步骤(4)
1.判断线性表的存储空间是否已满,若已满,则进行“溢出”处理(判满)
2.检查i值是否超出允许的范围(1≤i≤len+1),若超出,则进行“超出”处理(判超)
3.如果上述条件都允许,则将最后一个元素到第i个元素依次向后移动一个位置(移动)
4.将新的数据元素写到第i个位置上,线性表长度+1(写入)
int insert(sqlist *L,int i,elemtype x)//将x插入第i个位置
{
int j;
if(L->len==Maxsize)//顺序表长度等于存储最大长度则满
{
printf("溢出!\n");
return 0;
}
else if(i<1||i>L->len+1)//判断i是否超出范围
{
printf("插入位置不正确\n");
return 0;
}
else//把第i个元素和它后面的元素后移
{
for(j=L->len;j>i-1;j--)
L->data[j]=L->data[j-1];
L->data[i-1]=x;//把新元素写入下标为i-1的位置
L->len++;//顺序表长度+1
return(1);
}
//算法的最坏情况(插入第一个位置 i=1)时间复杂度:O(n)
//算法的最好情况(插入最后一个位置 i = L->len+1) 时间复杂度:O(1)
删除算法
思路步骤(3)(类似插入)
判断i值是否超出允许的范围(1≤i≤len),若是,则进行“超出范围”处理;
否则,保存第i个元素的值;
将第i个元素后的所有元素依次向前移动一个位置;
线性表长度减1,删除成功
int delete(sqlist *L,int i)//将x插入第i个位置
{
int j