又是一個(gè)單鏈表的實(shí)現(xiàn)(頭插法和尾插法)
作者: 鄭曉 分類: C/C++, 數(shù)據(jù)結(jié)構(gòu) 發(fā)布于: 2017-02-10 10:41 瀏覽:5,053 沒(méi)有評(píng)論
看了不少資料,之前一直糊涂,感覺(jué)剛剛弄明白,所以又寫了一遍單鏈表的實(shí)現(xiàn),包括頭插和尾插…C語(yǔ)言的指針果然水深啊。
#include
#include
//定義鏈表節(jié)點(diǎn)結(jié)構(gòu)
struct LinkedList {
int data;
struct LinkedList *next;
};
//定義一個(gè)指向struct LinkedList的指針的類型node
typedef struct LinkedList *node;
/**
* 創(chuàng)建一個(gè)新節(jié)點(diǎn)
* @return node
*/
node create_node() {
node tmp;
tmp = (node) malloc(sizeof(struct LinkedList));
tmp->next = NULL;
return tmp;
}
/**
* 尾插法 每次插入的數(shù)據(jù)放到鏈表結(jié)尾
*/
void add_node_to_tail(node head, int data) {
node tmp, p;
//創(chuàng)建一個(gè)新節(jié)點(diǎn) 并保存入數(shù)據(jù)
tmp = create_node();
tmp->data = data;
//如果是空表 把新節(jié)點(diǎn)直接放到頭節(jié)點(diǎn)之后
if(head->next == NULL) {
head->next = tmp;
} else {
//不是空表時(shí) 開始遍歷鏈表至尾端
p = head->next;
while(p->next!= NULL) {
p = p->next;
}
//把新節(jié)點(diǎn)放到尾端
p->next = tmp;
}
}
/**
* 頭插法 每次插入的數(shù)據(jù)放到鏈表開頭
*/
void add_node_to_head(node head, int data) {
node tmp, p;
//創(chuàng)建一個(gè)新節(jié)點(diǎn)
tmp = create_node();
tmp->data = data;
//如果是空表 把新節(jié)點(diǎn)直接放到頭節(jié)點(diǎn)之后
if(head->next == NULL) {
head->next = tmp;
} else {
//不是空表時(shí) 把新節(jié)點(diǎn)的next指向到原鏈表第一個(gè)元素
tmp->next = head->next;
//把頭節(jié)點(diǎn)指向到新節(jié)點(diǎn)
head->next = tmp;
}
}
int main(void) {
node listHead, p;
//創(chuàng)建一個(gè)頭節(jié)點(diǎn)
listHead = create_node();
//頭插法 新增數(shù)據(jù)
add_node_to_head(listHead, 10);
add_node_to_head(listHead, 20);
add_node_to_head(listHead, 30);
add_node_to_head(listHead, 40);
//尾插法 新增數(shù)據(jù)
add_node_to_tail(listHead, 100);
add_node_to_tail(listHead, 200);
//遍歷鏈表并打印元素值
p = listHead->next;
while(p) {
printf("%d\n", p->data);
p = p->next;
}
return 0;
}
本文采用知識(shí)共享署名-非商業(yè)性使用 3.0 中國(guó)大陸許可協(xié)議進(jìn)行許可,轉(zhuǎn)載時(shí)請(qǐng)注明出處及相應(yīng)鏈接。
本文永久鏈接: http://yjfs.org.cn/singly-linked-list-head-tail-insert.html