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...