C语言数据结构----顺序表
顺序表定义及初始化算法
用一维数组表示顺序表的数据存储区域,且数组容量足够大(data[0]~data[MAXSIZE])。
用一个变量last来记录当前线性表中最后一个元素在数组的位置,last充当指针作用。
将数据域data[MAXSIZE]与last封装为结构体
typedef struct
{
int data[MAXSIZE]; //以int型为例
int last;
}SeqList;
SeqList *l;
指针变量l,通过"l=(SeqList*)malloc(sizeof(SeqList));"操作来获得顺序表的存储空间。
malloc函数动态分配内存给顺序表,malloc函数返回void*,因此返回空间的大小与传递给malloc的类型相同。x=(type*)malloc(sizeof(type));
初始化算法
SeqList *start()//返回值为SeqList指针
{
SeqList *l;
l=(SeqList*)malloc(sizeof(SeqList));
l->last=-1;
return l;
}
插入与删除运算
在表长为n的线性表第i个位置插入X。
1>将a[i-1]~a[n-1]依次后移
2>在a[i-1]插入X
3>修改last使其依然指向最后一个元素
int Insert (SeqLIst *l,int i,int x)//插入运算
{
int j;
if(l->last==MAXSIZE-1)
{
printf("表满不能插入");
return -1;
}//检查表满
else if(i<1||i>l->last+2)
{
printf("位置错误");
return 0;
}//检查位置合法性
for(j=l->last;j>=i-1;j--)
l->data[j+1]=l->data[j];//从后向前依次后移
l->data[i-1]=x;
l->last++;
return 1;
}
线性表删除第i个元素
1>将a[i]~a[n-1]依次前移
2>修改last指针指向最后元素
int Delete(SeqList*l,int i)//删除运算
{
int j;
if(i<1||i>l->last+1)
{
printf("不存在第i个元素");
return 0;
}//检查表空及删除位置
for(j=i-1;j<=l->last;j++)
l->data[j]=l->data[j+1];
l->last--;
}
按值查找
在顺序表中找到元素x,并返回其下标,若没有返回-1
int location(SeqList *l,int x)
{
int i=0;
while(i<=l->last&&l->data[i]!=x)//超出表长或找到x
i++;
if(i>l->last)
return -1;
else
return i;//返回x的下标
}
性能分析
插入运算
插入位置i取值范围1<=i<=n+1,设每个位置插入概率相同即P=1/(n+1)。
从i到n+1共需移动n-i+1个长度。则平均移动数据元素的次数
E=∑ P*(n-i+1)= n/2; //i从1~n+1求和
时间复杂度O(n)=n;
删除运算
删除位置i:1<=i<=n;P=1/n;
第i个元素后共有n-i个元素,所以共移动n-i次,平均移动数据次数
E=∑ P*(n-i); //i从1~n求和
时间复杂度O(n)=n;
按值查找
查找到的位置i:1<=i<=n;p=1/n;则平均比较次数
E=1/n*∑ i=(n+1)/2;//i从1~n求和;
时间复杂度O(n)=n;