線性表資料結構型別定義及相關操作總結
1、順序儲存結構(如陣列)
定義:
#define MAXSIZE 20
typedef struct{
int data[MAXSIZE]; //假設這裡是整型
int length; //線性表長度
};
讀取其中某個元素:假設線性順序表已存在,讀取其中第i個元素,其值返回到e中
插入操作:在第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個元素並返回其值eint 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; };
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,沒有直