C C 學習筆記 C提高 鍊錶

2021-10-03 15:32:23 字數 4485 閱讀 2075

陣列和鍊錶的區別:

陣列:一次性分配一塊連續的儲存區域。

優點:隨機訪問元素效率高

缺點: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...