① 假设线性表采用顺序表为存储结构,其插入与删除在什么位置最快
都是在末尾插入和删除最快
如果插入在中间甚至在表头,那样要后移插入位置后面的所有结点一个单位,而如果是在表尾插入的话,只需要直接添加一个结点即可。
删除同理,如果我们是在中间删除,要将删除位置后面的结点都前移一个单位,而如果是在表尾删除的话,只需要将最后一个删除点即可。
顺序存储结构最耗时的是移动结点的操作。
② 线性表的创建,删除插入等操作
线性表的操作类似于数组,都是连续存储,所以相关的操作也是类似。
插入:在第t个位置插入元素,需要将从第t个位置到第n个位置向后移动。
删除:删除第t个元素,从t+1位置元素往前移动
插入和删除都需要将元素移动,顺序存储结构线性表所需要的平均时间复杂度为O(n)。
下面是根据数据结构实现的代码;
#include
#include
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR 0;
#define OVERFLOW -2;
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *elem;//线性表的基地址
int Length;//长度
int Listsize;//当前分配的存储容量
}SqList;
Status InitList(SqList &L)//初始化线性表
{
L.elem = (ElemType*)malloc(100 * sizeof(ElemType));//分配内存
if (!L.elem) exit(-2);
L.Length = 0;
L.Listsize = 100;
return OK;
}
Status ListInsert(SqList &L,int i,ElemType e)//在顺序表第i个位置之前插入新的元素e
{
if (i 1 || i>L.Length + 1) return ERROR;//i值不合法
if (L.Length >= L.Listsize)//存储空间已满
{
ElemType *newbase = (ElemType*)realloc(L.elem, (L.Listsize + 10) * sizeof(ElemType));
if (!newbase)
{
exit(-2);
}
L.elem = newbase;
L.Listsize += 10;
}
ElemType *q = &(L.elem[i - 1]); //将L表中第i个元素的地址信息传递给指针q
for (ElemType *p = &(L.elem[L.Length - 1]); p >= q; --p)//p为末尾元素的地址
{
*(p + 1) = *p;
}
*q = e;
++L.Length;
return OK;
}
Status OutputList(SqList L)//输出线性表中的元素
{
int i = 0;
for (i ; i < L.Length ; i++)
{
printf("%d ", L.elem[i]);
}
return OK;
}
Status ListLength(SqList L)//返回线性表的表长
{
return L.Length;
}
Status GetElem(SqList L, int i, ElemType &e)//用e返回第i个元素的值
{
if (iL.Length) return ERROR;
e = L.elem[i-1];
return OK;
}
Status ClearList(SqList &L)//清除线性表的数据
{
L.Length = 0;
return OK;
}
Status DeleteList(SqList &L,int i,ElemType &e)//删除第i个元素,并用e返回其值
{
if (iL.Length) return ERROR;
e = L.elem[i - 1];//通过下标找到第i个元素的值
ElemType *p = &(L.elem[i - 1]);
ElemType *q = L.elem + L.Length - 1;
for (p; p
③ 如果要求频繁的对线性表进行插入和删除操作,则线性表应该采用( )存储结构。 A.散列B.顺序C.链式D.任意
用链式,不需要连续存储,插入和删除效率高
④ 若在线性表中经常涉及插入与删除操作,则采用以下哪种表进行元素存储比较好
proxy_temp_path /home/ctohome/proxy_temp_dir 1 2;
proxy_cache_path /home/ctohome/proxy_cache_dir levels=1:2 keys_zone=ctohome:50m inactive=1d max_size=30g;
server {
listen 210.175.52.111:80;
⑤ 如何建立一个顺序存储的线性表,实现线性表的插入、删除操作
顺序存储结构线性表基本操作 C语言实现
#include<stdio.h>
//以下为函数运行结果状态代码
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineLIST_INIT_SIZE100//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间分配增量
typedefintStatus;//函数类型,其值为为函数结果状态代码
typedefintElemType;//假设数据元素为整型
typedefstruct
{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量
}SqList;
//实现线性表的顺序存储结构的类型定义
//函数声明开始
StatusInitList_Sq(SqList&L);
voidDestroyList_Sq(SqList&L);
voidClearList_Sq(SqList&L);
voidListEmpty_Sq(SqListL);
StatusGetElem_Sq(SqListL,i,&e);
intLocateElem_Sq(SqListL,e,compare());
StatusPriorElem_Sq(SqListL,cur_e,&pre_e);
StatusNextElem_Sq(SqListL,cur_e,&next_e);
StatusListInsert_Sq(SqList&L,i,e);
StatusListDelete_Sq(SqList&L,i,&e);
ListTravel_Sq(SqListL,visit());
//函数声明结束
intmain(void)
{
return0;
}
//函数定义开始
///////////////////////////////////////
//函数名:InitList_Sq()
//参数:SqList*L
//初始条件:无
//功能:构造一个空线性表
//返回值:存储分配失败:OVERFLOW
//存储分配成功:OK
///////////////////////////////////////
StatusInitList_Sq(SqList*L)
{
L.elem=(ElemType*)malloc((LIST_INIT_SIZE*sizeof(ElemType));//分配空间
if(!L.elem)
exit(OVERFLOW);//若存储分配失败,返回OVERFLOW
L.length=0;//空表,长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量
returnOK;
}
///////////////////////////////////////
//函数名:DestroyList_Sq()
//参数:SqList*L
//初始条件:线性表L已存在
//功能:销毁线性表
//返回值:无
///////////////////////////////////////
voidDestroyList_Sq(SqList*L)
{
if(L->elem)
free(L->elem);//释放线性表占据的所有存储空间
}
///////////////////////////////////////
//函数名:ClearList_Sq()
//参数:SqList*L
//初始条件:线性表L已存在
//功能:清空线性表
//返回值:无
///////////////////////////////////////
voidClearList_Sq(SqList*L)
{
L->length=0;//将线性表的长度置为0
}
///////////////////////////////////////
//函数名:ListEmpty_Sq()
//参数:SqListL
//初始条件:线性表L已存在
//功能:判断线性表是否为空
//返回值:空:TRUE
//非空:FALSE
///////////////////////////////////////
StatusListEmpty_Sq(SqListL)
{
if(L.length==0)
returnTRUE;
else
returnFALSE;
}
///////////////////////////////////////
//函数名:ListLength_Sq()
//参数:SqListL
//初始条件:线性表L已存在
//功能:返回线性表长度
//返回值:线性表长度(L.length)
///////////////////////////////////////
StatusListLength_Sq(SqListL)
{
return(L.length);
}
///////////////////////////////////////
//函数名:GetElem_Sq()
//参数:SqListL,inti,ElemType*e
//初始条件:线性表L已存在,1<=i<=ListLength(L)
//功能:用e返回线性表中第i个元素的值
//返回值:(i<1)||(i>ListLength(L)):ERROR
//1<=i<=ListLength(L):OK
///////////////////////////////////////
StatusGetElem_Sq(SqListL,inti,ElemType*e)
{
if(i<1||i>L.length)
returnERROR;//判断i值是否合理,若不合理,返回ERROR
*e=L.elem[i-1];//数组中第i-1的单元存储着线性表中第i个数据元素的内容
returnOK;
}
///////////////////////////////////////
//函数名:LocateElem_Sq()
//参数:L,e,compare(ElemType1,ElemType2)
//初始条件:线性表L已存在,compare()为数据元素判定函数
//功能:返回顺序表L中第1个与e满足关系compare()的数据元素的位序
//返回值:若在L中存在于e满足关系compare()的元素:其位序
//若在L中不存在于e满足关系compare()的元素:0
///////////////////////////////////////
intLocateElem_Sq(SqListL,e,compare(ElemType1,ElemType2))
{
inti=1;//i的初值为第1元素的位序
intp=L.elem;//p的初值为第1元素的存储位置
while(i<=L.length&&!(*compare)(*p++,e))
++i;//依次进行判定
if(i<=L.length)
returni;//找到满足判定条件的数据元素为第i个元素
else
return0;//该线性表中不存在满足判定的数据元素
}
StatusPriorElem_Sq(SqListL,cur_e,&pre_e);
//见StatusNextElem_Sq(SqListL,cur_e,&next_e);
StatusNextElem_Sq(SqListL,cur_e,&next_e);
//我的思路是先用LocateElem_Sq()搜索cur_e的位序,
//再看是否大于等于length,
//若是,则返回OVERFLOW;否则返回后继
//这样也许有点麻烦?所以希望大家能够补充方案
//bywangweinoo1
///////////////////////////////////////
//函数名:ListInsert_Sq()
//参数:SqList*L,inti,ElemTypee
//初始条件:线性表L已存在,1<=i<=ListLength(L)+1
//功能:在线性表中第i个数据元素之前插入数据元素e
//返回值:失败:ERROR
//成功:OK
///////////////////////////////////////
StatusListInsert_Sq(SqList*L,inti,ElemTypee)
{
ElemType*j;
if(L->length==LIST_MAX_LENGTH)
returnERROR;//检查是否有剩余空间
if(i<1||i>L->length+1)
returnERROR;//检查i值是否合理
//将线性表第i个元素之后的所有元素向后移动
for(j=L->length-1;j>=i-1;i++)
L->elem[j+1]=L->elem[j];
L->elem[i-1]=e;//将新元素的内容放入线性表的第i个位置,
L->length++;
returnOK;
}
///////////////////////////////////////
//函数名:ListDelete_Sq()
//参数:SqList*L,inti,Elemtype*e
//初始条件:线性表L已存在,1<=i<=ListLength(L)
//功能:将线性表L中第i个数据元素删除
//返回值:失败:ERROR
//成功:OK
///////////////////////////////////////
intListDelete_Sq(SqList*L,inti,Elemtype*e)
{
if(IsEmpty(L))
returnERROR;//检测线性表是否为空
if(i<1||i>L->length)
returnERROR;//检查i值是否合理
*e=L->elem[i-1];//将欲删除的数据元素内容保留在e所指示的存储单元中
//将线性表第i+1个元素之后的所有元素向前移动
for(j=i;j<=L->length-1;j++)L->elem[j-1]=L->elem[j];
L->length--;
returnOK;
}
//函数定义结束
⑥ 顺序存储结构线性表的插入与删除
顺序表的插入与删除,其实都是一个查找和移动的过程。插入与删除分为
按位置和按值插入和删除。1)按位置比较简单,插入时,从表尾开始到要插入的位置,每个元素向后面移动一个位置,最后将要插入的值放入即可。删除的话,直接从要删除的后一个开始,所有元素向前移动一个位置即可。
2)按值删除,先需要查找,可以选择顺序查找,二分查找(有序表)等。找到后,记录位置,后面的操作与第一种情况一样。
插入算法:
void
inert(int
i,int
data,List
L)//要插入的位置,插入的数据,
{
int
start=i;
int
end=L.length-1;
for(int
i=end;i--;i>start)
L.data[i+1]=L.data[i]
L.data[i]=data;
L.length++;
}