一 顺序表的定义: 即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。
二 顺序表类型定义:
#define listsize 100 //定义表空间大小
typedef int datatype;//假设为int类型
typedef struct {
datatype data[listsize];
int length;//顺序表的大小
}seqlist
注意:
① 用向量这种顺序存储的数组类型存储线性表的元素外,顺序表还应该用一个变量来表示线性表的长度属性,因此用结构类型来定义顺序表类型。
② 存放线性表结点的向量空间的大小listsize应仔细选值,使其既能满足表结点的数目动态增加的需求,又不致于预先定义过大而浪费存储空间。
③ 由于c语言中向量的下标从0开始,所以若l是seqlist类型的顺序表,则线性表的开始结点a1和终端结点an分别存储在l.data[0]和l.data[l.length-1]中。
④ 若l是seqlist类型的指针变量,则a1和an分别存储在l->data[0]和l->data[l->length-1]中。
三 顺序表的运算
①表的初始化
<pre name="code" class="cpp">void initlist(seqlist *l)
{
l->length = 0;//顺序表的初始化即就是讲表的长度置为0
}
②求表长
void listlength(seqlist *l)
return l->length ;//只需要返回length即可
③取表中第i个结点
datatype getnode(seqlist *l,int i)
{//取表中第i个结点返回l->data[i-1]即可
if(i<1||l->length-1)
error("position error");
else
return l->data[i];
④查找x是否在表中
int findnode(seqlist *l,int x)
int i,p;
for(i=0;i<l->length;i++)
{
p = l->data[i];//取表中第一个节点
if(p!=x)
{
i++;
}
else break;
if(i==length-1)
printf("sorry not fonud!");
return 0;
}
}
printf("the position is %d",i+1);
return 1
⑤将数据x插入到第i个位置上
void insertlist(seqlist *l,datatype x,int i)
int j;
if(i<1||i>l->length+1)
if(l->length>=listsize)
error("overflow")//表空间溢出
for(j=l->length-1;j>=i-1;i--)
l->data[j+1] = l->data[j]; //全体后移
l->data[i-1] = x; //插入数据
l->length++; //表长增加
四 算法分析
① 问题的规模
表的长度l->length(设值为n)是问题的规模。
② 移动结点的次数由表长n和插入位置i决定
算法的时间主要花费在for循环中的结点后移语句上。该语句的执行次数是n-i+1。
当i=n+1:移动结点次数为0,即算法在最好时间复杂度是0(1)
当i=1:移动结点次数为n,即算法在最坏情况下时间复杂度是0(n)
③ 移动结点的平均次数eis(n)
其中:
在表中第i个位置插入一个结点的移动次数为n-i+1
pi表示在表中第i个位置上插入一个结点的概率。不失一般性,假设在表中任何合法位置(1≤i≤n+1)上的插入结点的机会是均等的,则
p1=p2=…=pn+1=1/(n+1)
因此,在等概率插入的情况下,
即在顺序表上进行插入运算,平均要移动一半结点。
转载:http://blog.csdn.net/xsf50717/article/details/39895835