資料結構 | 線性表

Leon Devine發表於2019-04-12

定義

線性表(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;
}
複製程式碼

相關文章