定義
線性表(linear list)是資料結構的一種,一個線性表是n個具有相同特性的資料元素的有限序列。
資料元素是一個抽象的符號,其具體含義在不同的情況下一般不同。
在稍複雜的線性表中,一個資料元素可由多個資料項(item)組成,此種情況下常把資料元素稱為記錄(record),含有大量記錄的線性表又稱檔案(file)。
特徵
1.集合中必存在唯一的一個“第一元素”。
2.集合中必存在唯一的一個 “最後元素” 。
3.除最後一個元素之外,均有唯一的後繼(後件)。
4.除第一個元素之外,均有唯一的前驅(前件)。
線性表
順序儲存
C語言實現
#include<stdio.h>
#define MaxSize 50
struct SqList{
int data[MaxSize]; //存放順序表的元素
int length; //存放順序表的長度
};
/*順序表的插入操作*/
bool InsertList(SqList&L,int i,int e)
{
//在順序表中第i個位置插入數值e
int j;
if(i<1 || i>L.length)
return false;
if(L.length>MaxSize)
return false;
for(j=L.length;j>=i;j--) //將第i個起得資料後移
L.data[j]=L.data[j-1];
L.data[j]=e;
L.length++;
return true;
}
/*順序表的刪除*/
bool DeleteList(SqList&L,int i)
{
/*單連結串列刪除操作*/
bool DeleteList(LinkList la,int i)
{
int j=1;
LinkList p=la,q;
while(p && j<i) //p指向第i-1個元素
{
p=p->next;
j++;
}
if(p==NULL || p->next==NULL) //表示不存在第i-1個和第i的元素
return false;
q=p->next;
p->next=q->next;
free(q);
return true;
}
//刪除順序表中第i個元素
int j;
if(i<1 || i>L.length)
return false;
for(j=i;j<L.length;j++)
L.data[j-1]=L.data[j];
L.length--;
return true;
}
/*順序表的按值查詢*/
int LocateElem(SqList&L,int e)
{
for(int i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}
/*順序表的輸出*/
void OutPutList(SqList&L)
{
for(int i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
int main()
{
SqList list;
int A[5]={1,4,7,2,10};
/*初始化順序表*/
for(int i=0;i<5;i++)
list.data[i]=A[i];
list.length=5;
OutPutList(list);
InsertList(list,3,12);
OutPutList(list);
DeleteList(list,3);
OutPutList(list);
printf("%d\n",LocateElem(list,10));
return 0;
}
//執行結果
//1 4 7 2 10 建立並輸出順序表
//1 4 12 7 2 10 在3的位置插入值為12的元素
//1 4 7 2 10 刪除第三個元素
//5 輸出值為10的元素的位置
//Press any key to continue
複製程式碼
javascript實現
// 將所有在陣列b中但不在陣列a的資料元素插入到a中
var a = [1, 2, 3, 4, 5];
var b = [1, 3, 5, 7, 9];
function union(a, b) {
var elem, equal;
for (var i = 0, bLen = b.length; i < bLen; i++) {
elem = b[i];
equal = false;
for (var j = 0, aLen = a.length; j < aLen; j++) {
if (elem === a[j]) {
equal = true;
break;
}
}
if (!equal) a.push(elem);
}
}
union(a, b);
console.log(a);
// [1, 2, 3, 4, 5, 7, 9]
// 時間複雜度:O(aLen * bLen)
複製程式碼
鏈式儲存
C語言實現
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<script type = "text/javascript">
var Node = function(newData){//建立節點物件
this.next = null;
this.data = null;
this.Init = function(){
this.data = newData;
};
this.Init();
}
//定義連結串列類
var List = function(){
this.head = null;
this.size = 0;
this.Init = function(){
this.head = null;
this.size = 0;
}
this.Init();
this.Insert = function(newData){//初始批量插入操作
this.size += 1;
var newNode = new Node(newData);
if(this.head == null){
this.head = newNode;
return;
}
var tempNode = this.head;
while(tempNode.next != null)
tempNode = tempNode.next;//找到連結串列尾部
tempNode.next = newNode;//將新元素插入到連結串列尾部
};
this.GetData = function(pos){//查詢操作
if(pos >= this.size || pos < 0)
return null;
else{
tempNode = this.head;
for(i = 0;i < pos;i++)
tempNode = tempNode.next; //找到所處位置
return tempNode.data;
}
};
this.Remove = function(pos){//移除某一位置節點
if(pos >= this.size || pos < 0)
return null;
this.size -= 1;
tempNode = this.head;
if(pos == 0){
this.head = this.head.next;
return this.head;
}
for(i = 0;i < pos - 1;i++){
tempNode = tempNode.next;
}
tempNode.next = tempNode.next.next;
return tempNode.next;
};
this.InsertBefore=function(data,pos){//從某一位置前插入節點
if(pos>=this.size||pos<0)
return null;
this.size+=1;
tempNode=this.head;
var newNode = new Node(data);//將資料創造節點
if(pos==0){
newNode.next=tempNode;
return newNode.next;
}
for(i=0;i<pos-1;i++){
tempNode=tempNode.next;//找到插入的位置
}
newNode.next=tempNode.next;//插入操作
tempNode.next=newNode;
return newNode.next;
};
this.Print = function(){//輸出
document.write("連結串列中元素: <br>");
tempNode = this.head;
while(tempNode != null){
document.write(tempNode.data + " ");
tempNode = tempNode.next;
}
document.write("<br>");
};
};
//執行測試:
var list = new List();
var array = new Array(1,2,3,4,5,6);
for(i = 0;i < array.length;i++){
list.Insert(array[i]);
}
list.Print();
document.write("查詢操作下標為4的元素: <br>");
var data= list.GetData(4);
document.write(data+"<br>");
document.write("刪除操作: <br>");
list.Remove(5);
list.Print();
document.write("插入操作: <br>");
list.InsertBefore(8,3);
list.Print();
document.write("連結串列大小: " + list.size);
</script>
</head>
<body>
</body>
</html>
複製程式碼
c語言實現
定義
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data; //連結串列資料
struct LNode* next; //連結串列指標
}LNode,*LinkList;
複製程式碼
插入
頭插法
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data; //連結串列資料
struct LNode* next; //連結串列指標
}LNode,*LinkList;
/*頭插法-建立單連結串列*/
LinkList HeadCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode)); //建立頭結點
la->next=NULL;
scanf("%d",&num);
while(num!=10)
{
LNode *p=(LinkList)malloc(sizeof(LNode));
p->data=num;
p->next=la->next;
la->next=p;
scanf("%d",&num);
}
return la;
}
複製程式碼
尾插法
/*尾插法-建立單連結串列*/
LinkList TailCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode));
la->next=NULL;
LinkList s,r=la;
scanf("%d",&num);
while(num!=10)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=num;
r->next=s;
r=s;
scanf("%d",num);
}
r->next=NULL;
return la;
}
複製程式碼
在連結串列中的i位置插入數值e
//在la連結串列中的i位置插入數值e
int j=1;
LinkList p=la,s;
while(p && j<i)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
if((s=(LinkList)malloc(sizeof(LNode)))==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
複製程式碼