當前位置:首頁 » 網路管理 » 什麼線性表適合插入刪除
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

什麼線性表適合插入刪除

發布時間: 2023-02-06 06:57:06

① 假設線性表採用順序表為存儲結構,其插入與刪除在什麼位置最快

都是在末尾插入和刪除最快
如果插入在中間甚至在表頭,那樣要後移插入位置後面的所有結點一個單位,而如果是在表尾插入的話,只需要直接添加一個結點即可。
刪除同理,如果我們是在中間刪除,要將刪除位置後面的結點都前移一個單位,而如果是在表尾刪除的話,只需要將最後一個刪除點即可。
順序存儲結構最耗時的是移動結點的操作。

② 線性表的創建,刪除插入等操作

線性表的操作類似於數組,都是連續存儲,所以相關的操作也是類似。

插入:在第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++;
}