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;

猜你喜欢

转载自blog.csdn.net/qq_42929814/article/details/86532573