陣列和鍊錶的區別:
陣列:一次性分配一塊連續的儲存區域。
優點:隨機訪問元素效率高
缺點:1) 需要分配一塊連續的儲存區域(很大區域,有可能分配失敗)
2) 刪除和插入某個元素效率低
鍊錶:無需一次性分配一塊連續的儲存區域,只需分配n塊節點儲存區域,通過指標建立關係。
優點:1) 不需要一塊連續的儲存區域
2) 刪除和插入某個元素效率高
缺點:隨機訪問元素效率低
問題1:請問結構體可以巢狀本型別的結構體變數嗎?
問題2:請問結構體可以巢狀本型別的結構體指標變數嗎?
鍊錶分為:靜態鍊錶和動態鍊錶
靜態鍊錶和動態鍊錶是線性表鏈式儲存結構的兩種不同的表示方式:
靜態鍊錶
typedef
struct stu
stu;
void
test()
; stu s2 =
; stu s3 =
; s1.next =
&s2;
//s1的next指標指向s2
s2.next =
&s3;
s3.next =
null
;//尾結點
stu *p =
&s1;
while
(p !=
null
)}
動態鍊錶typedef
struct stustu;
void
test()
//釋放節點空間
p = s1;
stu *tmp =
null
;while
(p !=
null
)}
帶頭和不帶頭鍊錶
單向鍊錶、雙向鍊錶、迴圈鍊錶
單向鍊錶:
雙向鍊錶:
迴圈鍊錶:
使用結構體定義節點型別:
typedef
struct _linknode
link_node;
編寫函式:link_node* init_linklist()
建立帶有頭結點的單向鍊錶,迴圈建立結點,結點資料域中的數值從鍵盤輸入,以 -1 作為輸入結束標誌,鍊錶的頭結點位址由函式值返回.
typedef
struct _linknodelink_node;
link_node*
init_linklist()
head->data =-1
; head->next =
null
;//儲存當前節點
link_node* p_current = head;
int data =-1
;//迴圈向鍊錶中插入節點
while(1
)//給新節點分配記憶體
link_node* newnode =
(link_node*
)malloc
(sizeof
(link_node));
if(newnode ==
null
)//給節點賦值
newnode->data = data;
newnode->next =
null
;//新節點入鍊錶,也就是將節點插入到最後乙個節點的下乙個位置
p_current->next = newnode;
//更新輔助指標p_current
p_current = newnode;
}return head;
}
編寫函式:void foreach_linklist(link_node* head)
順序輸出單向鍊錶各項結點資料域中的內容:
//遍歷鍊錶
void
foreach_linklist
(link_node* head)
//賦值指標變數
link_node* p_current = head->next;
while
(p_current !=
null
)printf
("\n");
}
編寫函式: void insert_linklist(link_node* head,int val,int data).
在指定值後面插入資料data,如果值val不存在,則在尾部插入。
//在值val前插入節點
void
insert_linklist
(link_node* head,
int val,
int data)
//兩個輔助指標
link_node* p_prev = head;
link_node* p_current = p_prev->next;
while
(p_current !=
null
) p_prev = p_current;
p_current = p_prev->next;
}//如果p_current為null,說明不存在值為val的節點
if(p_current ==
null
)//建立新的節點
link_node* newnode =
(link_node*
)malloc
(sizeof
(link_node));
newnode->data = data;
newnode->next =
null
;//新節點入鍊錶
newnode->next = p_current;
p_prev->next = newnode;
}
編寫函式: void remove_linklist(link_node* head,int val)
刪除第乙個值為val的結點.
//刪除值為val的節點
void
remove_linklist
(link_node* head,
int val)
//輔助指標
link_node* p_prev = head;
link_node* p_current = p_prev->next;
//查詢值為val的節點
while
(p_current !=
null
) p_prev = p_current;
p_current = p_prev->next;
}//如果p_current為null,表示沒有找到
if(p_current ==
null
)//刪除當前節點: 重新建立待刪除節點(p_current)的前驅後繼節點關係
p_prev->next = p_current->next;
//釋放待刪除節點的記憶體
free
(p_current)
;}
編寫函式: void destroy_linklist(link_node* head)
銷毀鍊錶,釋放所有節點的空間.
//銷毀鍊錶
void
destroy_linklist
(link_node* head)
//賦值指標
link_node* p_current = head;
while
(p_current !=
null
)}
C C 學習筆記 C提高 位運算
可以使用c對變數中的個別位進行操作。您可能對人們想這樣做的原因感到奇怪。這種能力有時確實是必須的,或者至少是有用的。c提供位的邏輯運算子和移位運算子。在以下例子中,我們將使用二進位制計數法寫出值,以便您可以了解對位發生的操作。在乙個實際程式中,您可以使用一般的形式的整數變數或常量。例如不適用0001...
C C 學習筆記 04 傳統鍊錶
在任何乙個工程中專案中,都免不了要對資料進行有組織的運算,這些組織方式,最終的目的是要讓我們處理資料更加高效。不同的資料組織方式,會有不同的特性,這些特性對於某些運算還說是非常關鍵的,但也可能是毫不敏感的。因此我們的任務就是使用恰當的資料組織方式 即資料結構 來處理對某方面運算敏感的資料,讓程式整體...
C雙向鍊錶學習筆記
c雙向鍊錶學習筆記 語言 c語言 編譯環境 vc6.0 今天學習了kenneth a.reek著的 c和指標 一書,從中學習到了新知識,也發現了新問題,在這裡做一下記錄 首先先看一下 include includetypedef struct node node node rootp int dll...