線性表(list):是零個或多個資料元素的有限序列,它是最常用且最簡單的一種資料結構。
線性表概念
線性表元素的個數 n (n ≥ 0)定義為線性表的長度,當 n = 0 時,稱為空表。
在較複雜的線性表中,乙個資料元素可以由若干個資料項(item)組成,在這種情況下,常把資料元素稱為記錄(record),含有大量記錄的線性表又稱為檔案(file)。
線性表的常見操作有:建立和初始化、重置為空表、插入資料、刪除資料、合併線性表等。
當資料元素為非空有限集合時,線性結構具有如下特點:
1.存在唯一的乙個被稱為「第乙個」的資料元素。
2.存在唯一的乙個被稱為「最後乙個」的資料元素。
3.除第乙個之外,集合中的每個資料元素均只有乙個前驅。
4.除最後乙個之外,集合中的每個資料元素均只有乙個後繼。
線性表主要分為線性儲存結構和鏈式儲存結構
順序儲存結構
線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素,它的特點是邏輯關係上相鄰的兩個元素在物理位置上也相鄰。由於線性表的每個資料元素的型別都相同,所以我們常用一維陣列來實現順序儲存結構。
通過以下三個屬性來描述順序儲存結構:
1.儲存空間的起始位置:即陣列 data,它的儲存位置就是儲存空間的儲存位置
2.線性表的最大儲存容量:陣列長度 maxsize
3.線性表的當前長度:length
要注意區分資料長度和線性表長度這兩個概念,資料的長度即陣列的長度,是存放線性表的儲存空間的長度,儲存分配後這個量就一般是不變的;而線性表長度是線性表中資料元素的個數,是會隨著線性表的插入和刪除操作進行相應變化的。所以,線性表的長度應該小於等於陣列長度。
下面沒有用js的陣列方法實現順序儲存結構
list =[1
,2,3
,4,5
]function
insert
(data,index)
else
list[index]
= data
}return list
}function
get(index)
else}}
}function
dele
(index)
else
if(index <
list.length -1)
} list.length--
return list;
}console.
log(
insert(10
,1))
//[1, 10, 2, 3, 4, 5]
console.
log(
dele(1
))//[1, 2, 3, 4, 5]
console.
log(
get(10)
)//索引錯誤
console.
log(
get(1)
)//2
鏈式儲存結構
鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素,這組儲存單元可以是連續的,也可以是不連續的,這意味著這些資料元素可以存在記憶體未被占用的任意位置。
線性列表
為了表示每個資料元素 ai 與其直接後繼資料元素 ai+1 之間的邏輯關係,對資料元素 ai 來說,除了儲存其本身的資訊之外,還需要儲存乙個指示其直接後繼的資訊(即直接後繼的儲存位置)。我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱做指標或鏈。這兩部分資訊組成資料元素 ai 的儲存映像,稱為結點(node)。
n 個結點(ai的儲存映像)鏈結成乙個鍊錶,即為線性表的鏈式儲存結構,因為此鍊錶的每個結點中只包含乙個指標域,我們又稱之為線性鍊錶或單鏈表。單鏈表正是通過每個結點的指標域將線性表的資料元素按其邏輯次序鏈結在一起。
我們把鏈結中第乙個結點的指標(即儲存位置)叫做頭指標;最後乙個結點的指標為「空」(通常用 null 或 ^ 符號表示)。
有時我們為了方便對鍊錶進行操作,會在單鏈表的第乙個結點前附設乙個結點,稱為頭結點,頭結點的資料域可以不儲存任何資訊,也可以儲存如線性表的長度等附加資訊,頭結點的指標域儲存指向第乙個結點的指標。
注意區別頭指標和頭結點:
頭指標:
頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標
頭指標具有標識作用,所以常用頭指標冠以鍊錶的名字
無論鍊錶是否為空,頭指標均不為空,頭指標是鍊錶的必要元素
頭結點:
頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其資料域一般無意義(也可存放鍊錶的長度)
有了頭結點,對在第一元素結點前插入結點和刪除第一結點,其操作與其他結點的操作就統一了
頭結點不一定是鍊錶必須元素
下面是**實現
//結點類
varnode
=function()
//鍊錶類
varlinklist
=function()
return count;
}//在從左到右第i個結點後插入結點,0表示在頭插入
varinsert
=function
(node,index)
let newnode =
newnode()
; newnode.data = node;
let p = first;
for(
let i=
0;i)else
} newnode.next = p.next;
p.next = newnode;
return;}
//尾插法插入結點
varpush
=function
(node)
p.next = newnode;
}//刪除尾結點
varpop
=function()
prenode.next =
null
;return p.data;
}//頭插法插入結點
varunshift
=function
(node)
//刪除頭結點
varshift
=function
(node)
//從頭數刪除索引為i的結點,0表示刪除第乙個結點
varremove
=function
(index)
if(index <0)
let p = first,prenode =
null
;for
(let i=
0;i<=index;i++
)else
} prenode.next = p.next;
return p.data;
}//獲取鍊錶陣列
vargetlist
=function()
}return arr;
}return
}var list =
newlinklist()
;list.
push(0
);list.
push
("id");
list.
push(2
);list.
unshift(-
1);list.
insert(-
2,0)
;console.
log(list.
getlist()
);console.
log(
"pop:"
,list.
pop())
;console.
log(
"shift:"
,list.
shift()
);console.
log(
"remove:"
,list.
remove(0
));console.
log(
"lenght:"
,list.
length()
);console.
log(list.
getlist()
);
線性表概念
線性表的抽象資料型別包括 資料物件集合 和基本操作集合 資料物件集合定義了線性表的資料元素及元素之間的關係,基本操作集合定義了在資料物件上的一些基本操作。1.資料物件集合 線性表的資料物件集合為,每個元素的型別均為datatype,其中除了第乙個元素a1,每乙個元素都有唯一的前驅元素。除了最後乙個元...
線性表基本概念與實現
線性表基本概念與實現 1.線性表的定義 線性表是具有相同特性資料元素的乙個有限序列 2.線性表的邏輯特性 只有乙個表頭元素,只有乙個表尾元素,表頭元素沒有前驅,表尾元素沒有後繼,除表頭和表尾元素之外,其他元素只有乙個直接前驅,也只有乙個直接後繼。3.線性表的儲存結構 順序儲存結構 順序表 鏈式儲存結...
線性表實現
僅由乙個結構體組成,定義及實現如下所示 struct order list typedef struct order list list 指向該結構體的指標 初始化 list initial 查詢元素x的下標 intfind list l,elementtype x 在位置p前插入元素x bool ...