C C 鍊錶詳解

2021-09-29 15:43:35 字數 4643 閱讀 8107

前言:該文章內容的第一大塊是單獨功能的講述,比如鍊錶的插入,刪除,查詢等操作; 第二大塊是整個鍊錶的乙個完整操作示例。這兩個模組沒有任何關聯,以防誤解

1、準備內容

#include#include#include
(2)結構體我們鍊錶需要儲存的資料

typedef struct node

person;

接下來我們就建立乙個以person為基礎的鍊錶,首先編寫乙個建立鏈結的函式。

(3)建立鍊錶的函式

person * creatlist()

return head;

}

緊接著我們再編寫乙個列印鍊錶的函式,這樣在視覺上就能直接看出來鍊錶有沒有問題,豈不是很悠哉。

(4)列印鍊錶的函式

void show(person *head)

printf("***********************************= \n");

}

基本工作處理完了,下面我們就要真刀真槍的走一遭了。

2、操作實現

(1)建立鍊錶在main函式中建立乙個鍊錶head1,我們之後的操作都是基於該鍊錶。

person *head1 = (person*)malloc(sizeof(person));  

head1 = creatlist(); //建立鍊錶1

show(head1); //列印鍊錶

此時,如果**沒有符號或語句的問題,應該都能輸出正確的鍊錶。下面就講述不同的操作功能。

(2)查詢元素節點

我們用searchnode函式封裝該方法,通過name來查詢我們需要的節點:

person* searchnode(person *head, char *_name)

p = p->next;

}return p;

}

之後,在main函式中呼叫該方法,引數「name」是你要查詢的內容,可不能直接copy哈,比如你要查詢的名字叫"jack",就需要將引數name寫成jack

person *search = searchnode(head1, (char*)"name");  

if (search != null)

else

(3)查詢中間元素節點

person * centerlist(person *head)

p = head;

for (int i=0; i<(cout/2); i++)

return p;

}

之後,我們在main函式中呼叫該方法,並輸出:

person *center = centerlist(head1); 

printf("name is %s, age is %d \n",center->name, center->age);

(4)插入元素節點到指定位置

我們用insertnode函式封裝該方法,下述**中的strcmp(p->name, 「name」)中的「name」,就是你要指定的位置。

void insertnode(person *head)

p = p->next;

}

}

之後,在main函式中呼叫該方法:

insertnode(head1);

show(head1); //列印一下鍊錶,看看我們是否插入成功

(5)刪除指定元素節點

我們用deletenode函式封裝該方法

person* deletenode(person *head, char *_name)

while (s != null)

p = s;

s = s->next;

}return head;

}

mian函式中直接呼叫, 引數name是你要刪除的元素:

head1 = deletenode(head1, (char*)"name");

show(head1); //列印一下,看看成功了沒有

(6)判斷鍊錶是否有環定義兩個指標,往同乙個方向移動,乙個移動速度快,乙個移動速度慢(比如第乙個指標每次移動乙個節點,第二個指標每次移動兩個節點)。如果鍊錶有環,則兩個指標會在某一節點相遇。

void annularlist(person *head)

else

else}}

}

只需要在main函式中呼叫一下就行:

annularlist(head1)
(7) 刪除整個鍊錶

void deletaall(person *head)

free(p);

p = null;

head = null;

}

main中呼叫一下就好了,引數記得傳head1

好了,第一部分單獨功能的描述已經完畢了。接下來,我們再大幹一場。自古講究和為貴,我們就融合兩個鍊錶,讓它們成為一家。

前言:該部分和第一大塊沒有關聯,請不要誤解。

說明:已知兩個有序鍊錶,自定義函式把這兩個鍊錶合併成乙個依然有序的鍊錶。

注意:以下**,可以按序全部拷貝到開發工具中(有時會遇到版本相容性問題)。

1、引入標頭檔案必不可少

#includeusing namespace std;
2、我們先定義乙個node結構體,包括資料 和 指向下乙個節點的指標。

typedef struct nodenode;
3、準備工作結束了,我們需要先寫乙個建立鍊錶的函式(在main函式中呼叫,樣式在第5條)。

node* creadlist(node *head)

p2->next = null;

return head;

};

4、當然,建立鍊錶之後,我們總要輸出一下,看看自己建立的鍊錶是否合法。

再編寫乙個列印鍊錶的函式(在main函式中呼叫,樣式在第5條)。

void printlist(node *head)

cout<5、好了,我們在main函式中除錯一下,看看我們建立的鍊錶能否正常執行。

int main(int argc, const char *ar**)

可以發現,咱們的鍊錶已經成功了,這很好。

6、接下來就是激動人心的時刻了,合併兩個鍊錶的方法我們直接奉上。這段邏輯部分乍一看可能有些迷糊。如果你理解起來有些困難,可以拿筆在紙上寫出兩個有序鍊錶,然後按照**步驟一步一步畫出來操作結果,這樣就很容易理解了,其實還是很簡單的。

node * unionlist(node* head1, node* head2)else if (head2 == null)

node *newhead = (node*)malloc(sizeof(node));

if(head1->data <= head2->data)else

node *p = newhead;

while (head1 != null && head2 != null) else

}if (head1 == null) else if(head2 == null)

return newhead;

}

7、最後,我們完善main函式。為了預防初學者迷糊,我們將全部的main函式**貼上。執行**之後,按照提示輸入鍊錶資料,我們就可以將兩個鍊錶合併成乙個有序鍊錶了。

int main(int argc, const char *ar**)

C C 中煉表操作

刷面試寶典和劍指offer過程中,鍊錶的操作是非常重要的一塊兒,這裡把遇到的問題彙總一下,值得注意的是,鍊錶的很多技巧都是通過前後指標實現的。如果知道鍊錶的長度len,就比較容易了,倒數第k個節點就是正數第len k 1個節點,直接遍歷就行了。如果len是未知的,當讓也可以先遍歷一次整個鍊錶數出長度...

C C 鍊錶構建 遍歷

1 鍊錶的概述 簡單構建 遍歷 無頭鍊錶 pragma warning disable 4996 include include include 定義乙個使用者物件 struct user 準備四個user物件 user us 4 查詢鍊錶中id為1的物件 user find user head,i...

Linked List 鍊錶詳解

linked list basics linked list problems 我覺得這兩篇講linked list的文章寫的非常非常好,所以在部落格裡自己寫一下,也算是溫習鞏固資料結構的知識了 本文結合乙個實際的例子來解釋什麼是linked list,如何使用linked list 不過在解釋li...