3 2 2 單鏈表的讀取 插入和刪除

2021-08-16 06:39:50 字數 2107 閱讀 4850

1、單鏈表的讀取

演算法思路:

(1) 宣告乙個結點 p 指向鍊錶第乙個結點(這裡是儲存資料的第乙個節點,不是頭結點),初始化 j 從 1 開始;

(2) 當 j < i 時,就遍歷鍊錶,讓 p 的指標向後移動,不斷指向下一結點, j 累加 1;

(3) 若到鍊錶末尾 p 為空,則說明第 i 個元素不存在;

(4) 否則查詢成功,返回結點 p 的資料 。

**:

status getelem(linklist *l, int i, elemtype *e)

if (!p || j>i)/*貌似出現不了j>i的情況。。。;超出範圍時,p=null*/

return error;

*e = p->data;

return ok;

}

注:由於單鏈表的結構中沒有定義表長,所以不能事先知道要迴圈多少次,因此也就不方便使用 for 來控制迴圈。其主要核心思想就是 「工作指標後移』 ,這其實也是很多演算法的常用技術。

2、單鏈表的插入

演算法思路:

(1) 宣告一結點 p 指向鍊錶第乙個結點(這裡是頭結點),初始化 j 從 1 開始;

(2) 當 j < i 時,就遍歷鍊錶,讓 p 的指標向後移動,不斷指向下一結點, j 累加 1;

(3) 若到鍊錶末尾 p 為空,則說明第 i 個元素不存在;

(4) 否則查詢成功,在系統中生成乙個空結點 s;

(5) 將資料元素 e 賦值給 s->data ;

(6) 單鏈表的插入標準語旬 s->next=p->next; p->next=s ;

(7) 返回成功 。

邏輯圖:

s = (linklist)malloc(sizeof(node));/*因為s是插入的新節點,所以要為它分配記憶體空間,區別於

其他函式的臨時節點,臨時節點不需要分配空間*/

s->data=e;

s->next = p->next;

p->next = s;

return ok;

}3、單鏈表的刪除

演算法思路:

宣告一結點 p 指 向鍊錶第乙個結點 , 初始化 j 從 1 開始;

當j < i時,就遍歷鍊錶, 讓 p 的指標向後移動,不斷指向下乙個結點,j累加1;

若到鍊錶末尾 p 為空,則說明第 i 個元素不存在;

4 . 否則查詢成功,將欲刪除的結點 p-> next 賦值給 q ;

5 . 單鏈表的刪除標準語句 p->next=q->next;

6 . 將 q 結點中的資料賦值給 e, 作為返回;

7 . 釋放 q 結點;

8 . 返回成功。

邏輯圖:

//s = (linklist)malloc(sizeof(node));/*臨時節點,不需要分配記憶體*/

s = p->next;

*e = s->data;

p->next = s->next;

free(s);

return ok;

}4、單鏈表結構與順序儲存結構優缺點

單鏈表的讀取,插入和刪除。

include include define true 1 define false 0 define status int typedef struct datatype typedef struct node node typedef struct node linklist 單鏈表的讀取 用e...

單鏈表的讀取插入刪除

1單鏈表的讀取 宣告乙個指標p指向鍊錶中的第乙個結點,初始化j從1開始 當jstatus getelem linklist l,int i,elemtype e if p j i return error e p data return ok 2 單鏈表的插入 宣告乙個指標p指向鍊錶中的頭結點,初始...

單鏈表的插入和刪除

常見的資料結構只有兩種 1 陣列 2 鍊錶 陣列中的元素是連續儲存的,而鍊錶的元素則可以不連續,只需要有指標指向下乙個元素即可。因此鍊錶適合儲存插入刪除比較頻繁的一組資料。另外鍊錶的儲存空間是動態的,不必預先分配指定的空間大小。下面介紹鍊錶的幾種常見操作。首先先定義乙個鍊錶 struct linkl...