1. 程式人生 > >資料結構與演算法之線性表簡單定義(順序結構儲存查,增,刪)

資料結構與演算法之線性表簡單定義(順序結構儲存查,增,刪)

線性表(List)

由零個或多個數據元素組成的有限序列,它是一個序列,也就是說元素之間是有個先來後到的,若元素存在多個,則第一個元素無前驅,最後一個元素無後繼,其他元素有且只有一個前驅和後繼,另外,線性表強調是有限的,事實上無論計算機發展多強大,它處理的元素都是有限的。

用數學語言來:

線性表記為(a1,a2,.......,ai-1,ai,ai+1,......,an)

則ai-1是ai的前驅,ai+1是ai的後繼。n=0是,稱為空表

抽象資料型別

抽象:是指抽取事物具有的普遍性的本質,它要求抽出問題的特徵而忽略非本質的細節,是對具體事務的一個概括,抽象是一種思考問題的方式,隱藏了繁雜的細節。

InitList(*L):(始化操作,建立一個空的線性表L;

ListEmpty(L):判斷線性表是否為空表,若線性表為空表,反思true,否則返回false

ClearList(*L):清空線性表

GetElem(L,i,*e):線性表L中的第i個元素值返回給e;

LocalElem(L,e):線上性表L中查詢與給定值e相等的元素,查詢成功,返回該元素在表中序號,否則,返回0失敗

ListInsert(*L,i,e):線上性表L中第i個位置插入新元素e;

ListDelete(*L,i,*e):刪除線性表中第i個位置的元素,並用e返回其值

ListLength(L):返回線下表L的元素個數

對於不同的應用,線性表的基本操作是不同的,上述操作是最基本的,對於實際應用中涉及的關於線性表更多複雜操作,我們可以用這些基本操作組合實現。

這裡舉個例子,就是把A線性表和B線性表實現並集

//La線性表A,Lb線性表B
var uniconL(List *La, i, List Lb) 
{
	//先取到兩個線性表的元素個數
	int La_len, Lb_len, i;
	ElemtType e;
	La_len = ListLength(*La);
	Lb_len = ListLength(Lb);
	//迴圈比較,把A和B中相同覆蓋,不同的則新增進來
	for (i = 1; i < Lb.len; i++) 
	{
		GetElemt(Lb, i, &e);//在Lb中的第i個位置查出元素放入e中
		if (!LocalLost(*La, e))//元素e在La中不存在
		{
			ListInsert(*La, ++La_len, e);//把e新增到La中
		}
	}
}

-------------------------------------------------------------------------線性表的順序儲存--------------------------------------------------------------------

定義一個線性表結構

#define MAXSIZE 20
typedef int ElemType;
typedef Student
{
	ElemType data[MAXSIZE];//線性表最大長度
	int length;//線性表的實際長度
}Slist;

線性表中查詢元素

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Stu;
//Stu:是函式的型別,其值是函式返回值,如OK、ERROR等
//初始條件:L是存在的,也就是  1<= i <= ListLength(L)
//操作:用e返回L中查詢到的第i給元素

Stu GetElem(Slist L, i, ElemType *e)
{
	if (L.length == 0 || i < 1 || i >L.length)
	{
		return ERROR;
	}
	*e = L.data[i - 1]; //線性表是從1算起的,所以取線性表第i個元素對應陣列的下標需要-1
	return OK;
}

線性表中插入元素

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Stu;
//Stu:是函式的型別,其值是函式返回值,如OK、ERROR等
//初始條件:L是存在的,也就是  1<= i <= ListLength(L)
//操作:將e插入L中的 i 位置

Stu ListInsert(Slist *L, i, ElemType e)
{
	int m;
	if (L->length == MAXSIZE || i < 1 || i > L->length+1)
	{
		return ERROR;
	}
	if (i <= L->length)
	{
		//將要插入的元素都向後移動一個位置
		for (m = L->length; m >= i - 1; m--)
		{
			L->data[m + 1] = L->data[m];
		}
	}
	L->data[m - 1] = e;//將新元素插入
	L->length++;
	return OK;
}

線性表中刪除元素

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Stu;
//Stu:是函式的型別,其值是函式返回值,如OK、ERROR等
//初始條件:L是存在的,也就是  1<= i <= ListLength(L)
//操作:將L中的第i個元素刪除,並用e返回其值

Stu ListDelete(Slist *L, i, ElemType *e)
{
	int m;
	if (L->length == 0 || i < 1 || i > L->length)
	{
		return ERROR;
	}

	*e = L->data[i - 1]; //被刪除的元素

	if (i < L->length)
	{
		//將要插入的元素都向前移動一個位置
		for (m = i; m < L->length; m++)
		{
			L->data[m - 1] = L->data[m];
		}
	}

	L->length--;
	return OK;
}

相關推薦

資料結構演算法線性簡單定義順序結構存查

線性表(List) 由零個或多個數據元素組成的有限序列,它是一個序列,也就是說元素之間是有個先來後到的,若元素存在多個,則第一個元素無前驅,最後一個元素無後繼,其他元素有且只有一個前驅和後繼,另外,線性表強調是有限的,事實上無論計算機發展多強大,它處理的元素都是有限的。

資料結構演算法線性相關程式

1.從有序表中刪除所有值重複的元素,使所有值均不同 #include<stdio.h> #define MaxSize 50 #define Elemtype int typedef struct{ Elemtype data[MaxSize]; int

資料結構演算法線性——刪除重複元素

線性表是一種隨機存取的結構,和連結串列不同,連結串列順序存取的結構。但是,線性表是一種順序儲存的結構,而連結串列是鏈式儲存結構。兩者都是線性的,但區別不同。   進入主題: 1.假如有一串資料元素,要求刪除其中的重複元素。 首先想到的是用兩層迴圈,第一層從第一個元素開始,第

資料結構演算法線性結構

開發十年,就只剩下這套架構體系了! >>>   

數據結構線性代碼實現順序鏈式存靜態鏈選自大話數據結構

新元素 error 失敗 尾插法 後繼 順序存儲 %d 帶表頭 tle 一,線性表順序存儲 #include <stdio.h> #include <string.h> #include <ctype.h> #i

資料結構演算法美》專欄閱讀筆記2——線性

換個方式來寫筆記,最近啃完了《Thinking in Java》,想要在看專欄的時候多做點擴充套件性的東西,比如把難撩的泛型加進來做實現,程式碼還是要寫起來才曉得怎麼寫更酷。總之最近看書的過程中、搜尋答案的過程中發出了很多“哇~超厲害!超酷!我也要這樣棒棒噠!”的嘆聲。新的開始,

JavaScript 資料結構演算法美 - 線性陣列、棧、佇列、連結串列

前言 基礎知識就像是一座大樓的地基,它決定了我們的技術高度。 我們應該多掌握一些可移值的技術或者再過十幾年應該都不會過時的技術,資料結構與演算法就是其中之一。 棧、佇列、連結串列、堆 是資料結構與演算法中的基礎知識,是程式設計師的地基。 筆者寫的 JavaScript 資料結構與演算法之美 系列用

資料結構演算法美專欄學習筆記-線性排序

線性排序 線性排序的概念 線性排序演算法包括桶排序、計數排序、基數排序。 線性排序演算法的時間複雜度為O(n)。 線性排序的特點 此3種排序演算法都不涉及元素之間的比較操作,是非基於比較的排序演算法。 對排序資料的要求很苛刻,重點掌握此3種排序演算法的適用場景。   桶排序 演算法

資料結構演算法順序C語言實現

順序表等相關概念請自行查閱資料,這裡主要是實現。 注: 1.順序表C語言實現; 2.按較簡單的方式實現,主要幫助理解,可在此基礎上修改,更加完善; 3.提供幾個簡單函式,可自行新增功能; 4.可用C++封裝,得知STL中vector原理。    順序表容量。 #def

java資料結構演算法順序連結串列深入分析

關聯文章:   資料結構與演算法這門學科雖然在大學期間就已學習過了,但是到現在確實也忘了不少,因此最近又重新看了本書-《資料結構與演算法分析》加上之前看的《java資料結構》也算是對資料結構的進一步深入學習了,於是也就打算寫一系列的資料結構的博文以便加

JavaScript 資料結構演算法美 - 非線性中的樹、堆是幹嘛用的 ?其資料結構是怎樣的 ?

1. 前言 想學好前端,先練好內功,內功不行,就算招式練的再花哨,終究成不了高手。 非線性表(樹、堆),可以說是前端程式設計師的內功,要知其然,知其所以然。 筆者寫的 JavaScript 資料結構與演算法之美 系列用的語言是 JavaScript ,旨在入門資料結構與演算法和方便以後複習。 非線性表

資料結構演算法美專欄學習筆記-排序(上

排序方法 氣泡排序、插入排序、選擇排序、快速排序、歸併排序、計數排序、基數排序、桶排序。   複雜度歸類 氣泡排序、插入排序、選擇排序 O(n^2) 快速排序、歸併排序 O(nlogn) 計數排序、基數排序、桶排序 O(n)     演算法的執行效率 1. 最

資料結構學習筆記線性

一、概念 什麼是線性表呢? 一個簡單的理解如下: 線性表是由稱為元素(Element)的資料項組成的一種有限且有序的序列 其中,這裡有一個需要注意的地方: 有序是指線性表中的每個元素都有自己的位置,而不是指線性表中的元素按某種順序排列 二、抽象資料型別定義 要給資料結構定

資料結構演算法美專欄學習筆記-排序(下

分治思想 分治思想 分治,顧明思意就是分而治之,將一個大問題分解成小的子問題來解決,小的子問題解決了,大問題也就解決了。 分治與遞迴的區別 分治演算法一般都用遞迴來實現的。分治是一種解決問題的處理思想,遞迴是一種程式設計技巧。   歸併排序 演算法原理 歸併的思想 先把陣列從中間分

資料結構演算法美專欄學習筆記-排序優化

選擇合適的排序演算法 回顧   選擇排序演算法的原則 1)線性排序時間複雜度很低但使用場景特殊,如果要寫一個通用排序函式,不能選擇線性排序。 2)為了兼顧任意規模資料的排序,一般會首選時間複雜度為O(nlogn)的排序演算法來實現排序函式。 3)同為O(nlogn)的快排和歸併排序相比,

資料結構演算法美專欄學習筆記-陣列

什麼是陣列 陣列(Array)是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。 線性表 線性表就是資料排成像一條線一樣的結構。 常見的線性表結構:陣列,連結串列、佇列、棧等。 非線性表有:二叉樹、圖、堆等。 連續的記憶體空間和相同型別的資料 優點:兩限制使得

資料結構演算法美專欄學習筆記-複雜度分析

複雜度分析 什麼是複雜度分析 資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。 複雜度描述的是演算法執行時間(或佔用空間)與資料規模的增長關係

資料結構演算法美專欄學習筆記-二分查詢(下)

四種常見的二分查詢變形問題 查詢第一個值等於給定值的元素 //查詢第一個等於給定值的元素 public static int BSearch2(int[] a, int n, int value){ //定義陣列頭尾索引 int low = 0, high = n - 1;

資料結構演算法美專欄學習筆記-跳錶

跳錶的概念 對連結串列建立n級索引,例如每兩個結點提取一個節點到上一層,稱之為索引層。 圖中的down表示down指標,指向下一級結點   跳錶的時間複雜度 跳錶的高度 跳錶的高度是log2n。 跳錶的時間複雜度 跳錶中查詢某個資料的時間複雜度是O(logn)。  

資料結構演算法美專欄學習筆記-雜湊演算法

雜湊演算法的定義和原理 將任意長度的二進位制串對映為固定長度的二進位制串。 這個對映的規則就是雜湊演算法,而通過原始資料對映之後得到的二進位制串就是雜湊值。 設計一個優秀的雜湊演算法需要滿足: 從雜湊值不能反向推匯出原始資料(所以雜湊演算法也叫單向雜湊演算法); 對輸入資料非常敏感,哪怕原始