顺序表的基本操作

顺序表的基本操作

ListInster(&L,i,e): 插入操作--在表的第i个位置上插入e元素

假设在顺序表中插入元素c在第2个位置 即找到脚标为1的地址插入后面的元素依次往后移。

#define MaxSize 10 //定义最大长度

typedef struct{

EleType data[MaxSize];//用静态数组存放元素,使用静态方式实现

int length;   //顺序表的当前长度

} sqlList; //顺序表的类型定义

void ListInsert(SqList &L,int i, int e){   /

for(int j=L.length;j>=i;j--) //i元素后面的元素后移

L.data[j] = L.data[j-1];   //将前一个元素放到后一个元素

L.data[i-1] =e;  //在i处插入e

L.length++;  //长度加1

}

// 1 这里注意i的合法值

优化判断条件

bool ListInsert(SqList &L,int i, int e){

if(i<1 || i>l.length+1)// 插入位置小于1或者大于表长度输出错误

return flase;

if(l.length>=MaxSize) // 表长度大于最大长度输出错误 存储空间满

return false;

for(int j=L.length;j>=i;j--) //i元素后面的元素后移

L.data[j] = L.data[j-1];   //将前一个元素放到后一个元素

L.data[i-1] =e;  //在i处插入e

L.length++;  //长度加1

return true;

}

int main(){

SqList L;  //声明一个顺序表

InsertList(L); //初始化顺序表

.

. //插入元素

.

ListInsert(L,4,3); //位置4插入3

return 0;

}

时间复杂度

for:  关注最深层循环语句的执行次数与问题规模n的关系

最好情况 插入表尾,不需要移动

             i=n+1  循环0次  时间复杂度:O(1)

最坏情况 插入表头,n个元素全部移动

             i= 1       循环n次 时间复杂度:O(n)

平均情况 任意位置的插入概率相同 i = 1.2.3.4.....,length+1 的概率是 p = 1/n+1

             平均循环次数;n/2

             平均时间复杂度:O(n/2) =O(n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序是一种线性,它的基本操作包括初始化、插入、删除、查找、遍历等。下面是顺序基本操作的实现方法: 1. 初始化:顺序的初始化包括动态分配内存空间和初始化头信息。具体实现方法如下: ``` Status InitList(SqList &L) { L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; } ``` 2. 插入:在顺序的第i个位置插入元素x,需要将第i个位置及其后面的元素依次后移一位,然后将x插入到第i个位置。具体实现方法如下: ``` Status ListInsert(SqList &L, int i, ElemType x) { if (i < 1 || i > L.length + 1) return ERROR; if (L.length >= L.listsize) { ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISINCREMENT) * sizeof(ElemType)); if (!newbase) exit(OVERFLOW); L.elem = newbase; L.listsize += LISINCREMENT; } ElemType* q = &(L.elem[i - 1]); for (ElemType* p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p; *q = x; ++L.length; return OK; } ``` 3. 删除:删除顺序的第i个元素,需要将第i+1个位置及其后面的元素依次前移一位,然后将长减1。具体实现方法如下: ``` Status ListDelete(SqList &L, int i) { if (i < 1 || i > L.length) return ERROR; ElemType* p = &(L.elem[i - 1]); ElemType* q = L.elem + L.length - 1; for (++p; p <= q; ++p) *(p - 1) = *p; --L.length; return OK; } ``` 4. 查找:查找顺序中值为x的元素,需要依次遍历顺序中的每个元素,直到找到值为x的元素或者遍历完整个顺序。具体实现方法如下: ``` int LocateElem(SqList L, ElemType x) { int i; ElemType* p = L.elem; for (i = 1; i <= L.length; ++i, ++p) if (*p == x) return i; return 0; } ``` 5. 遍历:遍历顺序中的每个元素,可以使用for循环或者while循环实现。具体实现方法如下: ``` void ListTraverse(SqList L) { int i; ElemType* p = L.elem; for (i = 1; i <= L.length; ++i, ++p) printf("%d ", *p); printf("\n"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值