c語言的鍊錶基本操作。
學習 c 語言的開始,我們最早接觸的資料型別是陣列,它有兩個特點:
順序儲存所有的元素,連續占用記憶體空間;
建立陣列時需要事先知道儲存元素的個數,確定陣列的長度;
查詢元素複雜度是 o(1)o(1),刪除和插入的複雜度是 o(n)o(n)。
陣列元素非常適合元素個數基本保持不變的場景,特別便於查閱操作,但是如果資料儲存的元素個數經常發生變化,操作起來複雜度就很高,因此急需一種資料結構便於插入和刪除,鍊錶就很合適。
乙個鍊錶的示意圖如下所示
鍊錶在記憶體中不是連續的順序儲存的,鍊錶包括表頭,表尾和中間結點。
表頭是特殊的中間結點,它的資料域可以包括表的長度或者什麼都沒有,但是指標域必須指向單鏈表的第乙個中間結點的位置
表尾也是特殊的中間結點,資料域可以儲存資料,因為已經沒有後繼結點,指標域為空
單鏈表和陣列相比的優勢體現在如下兩個方面:
空間儲存更靈活,單鏈表不需要連續占用記憶體空間,因為每個結點都知道它的後繼結點在記憶體中的位置,所以不需要連續儲存;
空間申請更靈活,可以使用動態記憶體分配,在程式執行時候按需申請記憶體大小,避免陣列申請過大造成的浪費。
空間釋放和增加更靈活,刪除乙個元素僅僅需要將該元素的前置元素指標指向它的後繼結點,釋放該結點即可,增加元素只需要更改指標指向即可,複雜度是 o(1)o(1)
但是,單鏈表的劣勢也很明顯,單鏈表中的元素僅僅知道後繼結點的位置,如果需要查詢某個元素,只能從頭結點開始乙個乙個地去遍歷,而不像陣列直接給出下標一步就能定位到,因此單鏈表的查詢複雜度是 o(n)o(n)。
假定單鏈表的資料元素的資料型別是elemtype
,那單鏈表可以定義如下
typedef struct node node;
typedef struct node * linklist;
建立有兩種方法,頭插法和尾插法,第一種是保持新插入的元素始終在表的第乙個元素,第二個保持新插入的元素始終在表的最後乙個元素。
/*頭插法建立鍊錶*/
void createlisthead(linklist *l, int n)
}
尾插法**如下
/*尾插法建立鍊錶*/
void createlisttail(linklist *l, int n)
r->next = null;
}
工作的基本原理就是工作指標後移,這個技巧也是單鏈表操作的基礎和關鍵。
/* 單鏈表已經存在,用e返回l中的第i個元素的值*/
status getelem(linklist l, int i, elemtype *e)
if(!p || j > i)
return error;
*e = p->data;
return ok;
}
/* 單鏈表已經存在,在第i個元素位置插入新的元素e,l的表長加1*/
status listinsert(linklist *l, int i, elemtype e)
if(!p || j > i)
return error;
s = (linklist)malloc(sizeof(node));
s->data = e;
s->next = p->next;
p->next = s;
return ok;
}
/* 單鏈表已經存在,刪除鍊錶l的第i個元素,並用e返回其值,表長減1*/
status listinsert(linklist *l, int i, elemtype *e)
if(!p || j > i)
return error;
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return ok;
}
/*順序鍊錶l已經存在,將l重置為空表*/
status clearlist(linklist *l)
(*l)->next = null;
return ok;
}
單鏈表基本操作
include include include include includeusing namespace std typedef struct node node,plinklist plinklist createfromhead node pstnode node malloc sizeof...
單鏈表基本操作
單鏈表的初始化,建立,插入,查詢,刪除。author wang yong date 2010.8.19 include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist...
單鏈表基本操作
include using namespace std define namelenth 20 define ok 0 define error 1 typedef struct flagnode node 生成結點 inline node newnode 銷毀化煉表 void destroylin...