c语言顺序表的删除算法代码,用C语言实现顺序表的插入和删除算法

什么是线性表?

线性表是n个数据元素的有限序列。根据线性表的显现方式,线性表又分为顺序表(数据元素在内存中的存储空间是连续的)和链表(数据元素在内存中的存储空间是不连续的)。

线性表如何用C语言实现?线性表可以进行哪些操作?

在C语言中,线性表通过结构体的方式来实现。结构体中定义了线性表的存储空间地址,当前长度,和当前分配的存储容量。操作包含在指定位置插入某一元素、删除指定元素、查找指定的元素等。在这里重点介绍插入和删除算法。

下面就是关于这一部分内容的陈述。

线性表的C语言实现

需要先定义好的内容

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量

#define LISTINCREMENT 10 //线性表存储空间的分配增量

#define OK 1

#define ERROR 0

#define OVERFLOW -2typedefintStatus;

typedefint ElemType;

定义线性表

typedef struct{

ElemType*elem;intlength;intlistsize;

}SqList;

写一个函数,构造一个空的线性表L

Status InitList_Sq(SqList &L){

L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//malloc函数为分配一个内存空间

if(!L.elem) exit(OVERFLOW);//存储分配失败

L.length=0;//空表的长度为零

L.listsize=LIST_INIT_SIZE;//设置初始分配容量

returnOK;

}

顺序表的插入操作

Status ListInsert_Sq(Sqlist *L, inti, ElemType e)

{//在顺序线性表L中第i个位置之前插入新的元素e//i的合法值为1<=i<=ListLength_Sq(L) + 1

ElemType *newbase, *q, *p;if(i < 1 || i > L->length + 1) return ERROR;//i值不合法

if(L->length >= L->listsize) //当前存储空间已满,增加分配

{

newbase= (ElemType *)realloc(L->elem,

(L->listsize + LISTINCREMENT)*sizeof(ElemType));if(!newbase) return ERROR; //分配失败

L->elem = newbase; //新基址

L->listsize += LISTINCREMENT; //增加存储容量

}

q= &L->elem[i-1]; //q为插入位置

for(p = &L->elem[L->length-1]; p >= q; --p)*(p+1) = *p; //插入位置及之后的元素后移

*q = e; //插入e

L->length++; //表增长1

returnOK;

}//ListInsert_Sq

顺序表的删除操作

Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e)

{//在顺序线性表L中删除第i个元素,并用e返回其值//i的合法值为1<=i<=ListLength_Sq(L)

ElemType *p, *q;if(i < 1 || i > L->length + 1) return ERROR;//i 值不合法

p= &L->elem[i-1]; //p为被删除元素的位置

*e = *p; //被删除元素的值赋给e

q = &L->elem[i] + L->length - 1;//表尾元素的位置

for(++p; p <= q; p++) //++p为要移动元素的第一个

*(p-1) = *p; //元素左移

L->length--; //表长减一

returnOK;

}//ListDelete_Sq

从顺序表的插入和删除算法可以看出,顺序表的插入和删除操作是通过数据元素的移动来实现的,因此,线性表的插入和删除的算法时间复杂度都是O(n).此外,顺序表还要求系统分配连续的存储空间,这就给存储空间的分配提出了更高的要求,而且也容易造成存储空间的利用率不高等问题。正是由于顺序表种种的不方便,所以才引入了链表,链表的出现解决了很多顺序表解决不了的问题,最明显的变化就是元素存储空间不需要连续。当然,这需要借助指针来实现,这就引入了新的问题。总体而言,顺序表和链表各有优缺点,在选择时,要根据实际情况选择更加适合的数据结构。

原文:https://www.cnblogs.com/freeurmind/p/9911233.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值