1. 程式人生 > >線性表資料結構型別定義及相關操作總結

線性表資料結構型別定義及相關操作總結

1、順序儲存結構(如陣列)

定義:

#define MAXSIZE 20
typedef struct{
	int data[MAXSIZE]; //假設這裡是整型
	int length;  //線性表長度
};

讀取其中某個元素:假設線性順序表已存在,讀取其中第i個元素,其值返回到e中

#define ERROR 0
#define OK 1   //定義返回狀態
int GetElem(Squlist L, int i, int *e){
	if (L.length == 0 || i<1 || i>L.length)  //該元素不存在或者超出表範圍或者表為空則讀取失敗
		return ERROR;
	*e = L.data[i - 1];
	return OK;  //讀取成功
};
插入操作:在第i個元素前面插入元素e
int ListInsert(Squlist *L, int i, int e){
	int k;
	if (L->length == MAXSIZE) //表格是否滿
		return ERROR;
	if (i<1 ||i>length+1)  //插入i不在範圍內
		return ERROR;
	if (i <= L->length)
	{
		for (k = length - 1; k >= i - 1; k--) 
			L->data[k + 1] = L->data[k];
	}
	   L->data[i] = e;
           length++;
	   return OK;
	
};
刪除操作:刪除第i個元素並返回其值e
int ListDelete(Squlist *L, int i, int *e){
	int k;
	if (L->length == 0)      //表格為空
		return ERROR;
	if (i<1 || i>L->length)  //刪除位置不正確
		return ERROR;
	if (i <= L->length){
		*e = L->data[i - 1];
		for (k = i; k < L->length - 1;k++)
			L->data[i - 1] = L->data[i];
		L->length--;
		return OK;
	}

}

總結特點:查詢元素方便(時間複雜度O(1)),插入和刪除元素複雜(時間複雜度O(n))

2、鏈式儲存結構(連結串列)
單鏈表的定義:
typedef struct Node {         //定義連結串列中的節點
	int data; //假設資料為整型
	struct Node *next;
};
typedef struct Node  *Linklist;  //定義一個連結串列型別的指標
連結串列讀取:讀取第i個數,其值返回e中
#define ERROR 0;
#define OK  1;
int GetElem(Linklist L, int i, int *e){
	int j=1;
	Linklist p;
	p = L->next;   //表示p指向了L->next,理解這點很重要
	while (p && j < 1){
		p = p->next;
		j++;
	}
	if (!p || j > i)
		return ERROR; 
	&e = p->data;
	return OK;
}

連結串列整表建立:頭插法

void CreatLinklist(Linklist L, int n){
	Linklist p;
	int i;
	srand(time(0)); //初始化隨機數種子
	L = (Linklist)malloc(sizeof(Node));
	L->next = NULL;     //建立帶頭結點的連結串列
	for (i = 0; i < n; i++){
		p = (Linklist)malloc(sizeof(Node));
		p->data = rand() % 100 + 1;//隨機生成100以內的數字
		p->next = L->next;
		(->next = p;       //插入到表頭
	}	
}
連結串列的插入:在第i個元素前面插入元素e
int LinklistInsert(LinkList L, int i, int e){
	int j;
	Linklist s, p;
	p = L;
	while (p && j < i){     //先找到插入的位置
		p = p->next;
		j++;
	}
	if (!p || j > i)
		return ERROR;
	s = (Linklist)malloc(sizeof(Node));
	s->data = e;
	s->next = p->next;     //插入連結串列s到p的後繼
	p->next = s;
	return OK;
}

連結串列的刪除:刪除第i個元素,返回其值到e中

int LinklistDelete(Linklist L, inti, int *e){
	int j = 1;
	Linklist p, q;
	p = L;
	while (p && j < i){
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i)
		return ERROR;
	q = p->next;
	p->next = q->next;     //將q的後繼賦值給p
	*e = q->data;
	free(q);              //系統回收此節點,釋放記憶體
	return OK;
}
整個連結串列的刪除:
int CleatLinklist(Linklist L){
	Linklist p, q;
	p = L->next;
	while (p){
		q = p->next;
		free(q);
		p=q
	}
	L->next = NULL;    //頭結點指標域為空
	return OK;
}
總結連結串列的特點,可以看到每次讀取一個數的時候,都要從表頭一直讀下去,複雜度為O(n),但是插入和刪除時,找到特定位置後,再執行的時間複雜度為O(1)

3、迴圈連結串列

把單鏈表的終端節點指標域指向頭結點,就形成了迴圈連結串列,可方便進行連結串列全部結點的遍歷。判斷的方法就是看p->next是否為頭結點來結束迴圈

4、雙向連結串列

和單向連結串列區別僅在於多了一個prior指標指向前面的結點,因此插入和刪除操作也就多了幾個關於prior的步驟

定義

typedef struct Node {         //定義連結串列中的節點
	int data; //假設資料為整型
	struct Node *next;
	struct Node *prior;
};

單鏈表翻轉

思路是每次翻轉連結串列,把原始連結串列的第一個元素後面的那個元素放到表頭

LinkList ReverseLinkedList(LinkList L)
{
    Node   *first = NULL;  //指向原始連結串列最開始的第一個資料
    Node   *behind = NULL; //每次新生成連結串列時,指向原始連結串列最開始的第一個資料的下一個資料
 
    if (L == NULL)
    {
        return NULL;
    }
    first = L->next;
    while (first->next != NULL)
    {
        behind = first->next;
        first->next = behind->next;
        behind->next = L->next;
        L->next = behind;
    }
    return L;
}



相關推薦

線性資料結構型別定義相關操作總結

1、順序儲存結構(如陣列) 定義: #define MAXSIZE 20 typedef struct{ int data[MAXSIZE]; //假設這裡是整型 int length; //線性表長度 }; 讀取其中某個元素:假設線性順序表已存在,讀取其中第i個元素

線性資料結構解讀(五)雜湊結構-HashMap

    前面的部落格中,我給大家分析過陣列和連結串列兩種線性表資料結構。陣列儲存區間連續,查詢方便,但是插入和刪除效率低下;連結串列儲存區間離散,插入刪除方便,但是查詢困難。大家肯定會問,有沒有一種結構,既能做到查詢便捷,又能做到插入刪除方便呢?答案就是我們今天

線性資料結構解讀(六)鏈式雜湊結構-LinkedHashMap

    上一篇文章我和大家一起解讀了HashMap的原理原始碼,各位童鞋可以點選連結檢視線性表資料結構解讀(五)雜湊表結構-HashMap     這次我們一起來看一下LinkedHashMap,它保

資料結構之連結串列基本操作總結

題意:  如何找到環的第一個節點? 分析:  1)先判斷是否存在環 使用兩個指標slow,fast。兩個指標都從表頭開始走,slow每次走一步,fast每次走兩步,如果fast遇到null,則說明沒有環,返回false;如果slow==fast,說明有環,並且此時fast超了s

數據結構-線性的鏈式存儲相關算法(一)(C語言實現)

存儲位置 lib 方法 lis 逆序 順序 程序 查詢 c語言 鏈表的簡單介紹 為什麽需要線性鏈表 當然是為了克服順序表的缺點,在順序表中,做插入和刪除操作時,需要大量的移動元素,導致效率下降。 線性鏈表的分類 按照鏈接方式: 按照實現角度: 線性鏈表的創建和簡單遍歷

資料結構中的線性及其結構

線性表(linear list) )      線性表是n個型別相同資料元素的有限序列,通常記作(a 0 , a 1 , …a i-1 , a i , a i+1 …,a n-1 )。 1.相同資料型別 線上性表的定義中,我們看到從a 0 到a n-

Java資料結構-陣列解析類封裝自定義陣列實現

概念: 陣列是Java資料結構中最基本的資料,是儲存 一組長度固定的 同資料型別的集合。 優點: 插入快:對於無序陣列,只需要在陣列末尾增加資料即可。但對於有序陣列,需要查詢到固定的位置,再插入資料,相對無序陣列 結構簡單 缺點: 根據元素值查

資料結構—二叉樹相關概念經典面試題

二叉樹概念 一棵二叉樹是結點的有限集合,該集合或者為空, 或者是由根結點加上兩棵分別稱為左子樹和右子樹的二叉樹構成 二叉樹的特點: 每個結點最多有兩棵子樹,即二叉樹不存在度大於2的結點 二叉樹的子樹有左右之分,其子樹的次序不能顛倒 滿二叉樹、完全二叉樹

大話資料結構讀書筆記艾提拉總結 查詢演算法 和排序演算法比較好 第1章資料結構緒論 1 第2章演算法 17 第3章線性 41 第4章棧與佇列 87 第5章串 123 第6章樹 149 第7章圖 21

大話資料結構讀書筆記艾提拉總結   查詢演算法 和排序演算法比較好     第1章資料結構緒論 1 第2章演算法 17 第3章線性表 41 第4章棧與佇列 87 第5章串 123 第6章樹 149 第7章圖 211

資料結構線性順序結構c語言實現程式碼

#include<stdio.h> #include<stdlib.h> typedef int ElementType; typedef struct LNode * PtrToLNode; struct LNode{ ElementType D

線性-順序結構存儲

nbsp emp function locate amp pty return 容易 pre 線性表反映數據之間的關系是一對多一的關系,每個節點都有唯一的前驅,唯一的後繼。它可以采用順序存儲,也可以采用鏈式存儲。本章寫的是順序存儲的實現。 class sqList {

python基礎學習二 數據結構之list相關基本操作

意思 指定位置 blog div 基礎 我們 clas 位置 列表 list是py內置的一種數據類型,list就是列表的意思,list就是一種有序的數據集合,可以隨時增加和刪除list的元素。 生活中,比如我們要列出全班同學的名字,就可以用list來表示 >>

資料結構與演算法內功修煉之——為什麼學習資料結構和演算法如何高效的學習資料結構和演算法

什麼是資料結構和演算法 用一句話總結資料結構和演算法,資料結構和演算法是用來儲存資料和處理資料的;其中的儲存指的是通過怎樣的儲存結構來儲存資料,而處理就是通過怎樣的方式或者方法處理資料 為什麼學習資料結構和演算法 寫出更加高效能的程式碼 演算法,是一種解決問題的思路

[資料結構]Trie簡介Python實現

Trie簡介及Python實現 Trie簡介 Python實現 Trie簡介 Trie即字首樹或字典樹,利用字串公共字首降低搜尋時間。速度為 O

(二)go的基礎資料結構型別

1.go的常量 package main import "fmt" /* 常量是指程式執行時不可改變的值,常量必須初始化值。定義常量既可以指定型別,編譯器也可以在常量初始化時做型別判斷。 並且在函式程式碼塊中定義常量,不被使用也不會出現編譯錯誤。 在常量組中,如果不指定型別和常量值,那麼常量的型別

L4.六.資料結構型別轉換md

(瞭解)資料結構型別轉換===## (常用)數字、字串轉換int('1') → 1float('2.5') → 2.5str(1) → '1'## (瞭解)列表、字典、元祖、字串字典轉字串student_dict = {'name':'小明','age':7,'sex':'male'}str(s

Java實現單鏈相關操作

單鏈表是一種鏈式存取的資料結構,用一組地址任意的儲存單元存放線性表中的資料元素。連結串列中的資料是以結點來表示的。 每個結點的構成:元素(資料元素的映象) + 指標(指示後繼元素儲存位置), 元素就是儲存資料的儲存單元, 指標就是連線每個結點的地址資料。

資料結構:棧應用

  棧的定義:      棧是隻能在一端進行資料插入和刪除的線性表。 棧的性質:      後進先出(FILO),後面進去的元素,先出來,先進去的元素後出來 棧的操作:      棧的操作很簡單,就是

可空型別 int??相關運算子

int?可空型別 值型別不能為null,所以出現了int?為可空型別,此時可以為Null int與int?不能直接進行運算,必須用顯示轉換或者int?.value才可以進行運算 int? op1 = 5; int op2 = 6; //op1不能為null,否則會報錯 int op3 = (

線性-順序結構

應昨天,今天學習線性表的順序結構 什麼是線性表:線性表是一種典型的線性結構,是由n個元素組成的有限序列,比如字母表,點名冊 對於一個非空的線性表,邏輯結構特徵如下 有且僅有一個開始節點a1,沒有直接前趨節點,有且僅有一個直接後繼節點a2 有且僅有一個結束節點an,沒有直