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