單向鏈表是鏈表中的一種,其特色是鏈表的連接方向是單向的,對鏈表的訪問要經過從頭部開始,依序往下讀取。固然,日後對數據結構的深刻學習,還會涉及到雙向鏈表、循環鏈表等線性表,我在這裏就再也不解釋了。數據結構
鏈表主要是由結點一個個相繼串起來的,其中每個結點又被分爲兩個部分:(data)數據域、(next)指針域。學習
單向鏈表的形式:ui
那麼,既然咱們知道了單鏈表的元素是什麼樣了,以及單鏈表的形式是如何了,咱們就能夠開始動手實現簡單的增、刪、查、改。spa
首先,要學會鏈表的建立,建立無非也就是增長:3d
須要說明的是,爲了不二重指針的操做,便於各位的理解,我這裏用的是頭結點來保存指向第一個結點的地址,也就是我捨去了頭結點的數據域,以它的next指向一個新的結點,如上圖的單向鏈表的形式指針
//兩個參數 一個是頭結點,一個是 要插入的結點
//頭結點:它的next指向的纔是一個新的結點開始
void addNode(listNode * head, listNode * q) {
listNode * p = head->next;
if (head->next == NULL)
{
head->next = q;
}
else
{
while (p->next != NULL)
{
p = p->next;
}
p->next = q;
}
}
複製代碼
鏈表的刪除:這裏的刪除,指的是刪除其中的某個結點,既然要刪除某個結點,那麼即是要遍歷出符合給定條件的就把它刪除。code
void deleteNode(listNode * head, int data) {
listNode * p = head->next, *q = head;
//若是是空的 能夠返回一個提醒也能夠不處理
while (p)
{
if (p->data == data)
{
q->next = p->next;
free(p);
break;
}
q = p;
p = p->next;
}
}
複製代碼
查、改的操做在這裏我就不細說了,由於,這個實現起來就是一個循環,而後再判斷每個數據域是否與你要查找的一致...cdn
最後,我以一個總體的程序結束這篇博客:blog
#include <stdio.h>
#include <stdlib.h>
struct listNode {
int data;
struct listNode * next;
};
typedef struct listNode listNode;
void addNode(listNode * head, listNode * q);
void deleteNode(listNode * head, int data);
int main() {
listNode head,*q,*p;
head.next = NULL;
int i;
//鏈表的建立
for (i = 1; i < 6; i++)
{
q = (listNode *)malloc(sizeof(listNode));
if (!q) exit(0);
q->data = i;
q->next = NULL;
addNode(&head, q);
}
p = head.next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
deleteNode(&head, 2); //刪除數據域爲 2 的結點
p = head.next;
//遍歷輸出
while (p)
{
printf("%d ", p->data);
p = p->next;
}
//釋放整個鏈表的內存空間
p = head.next;
q = &head;
while (p)
{
q->next = p->next;
free(p);
p = q->next;
}
return 0;
}
//兩個參數 一個是頭結點,一個是 要插入的結點
//頭結點:它的next指向的纔是一個新的結點開始
void addNode(listNode * head, listNode * q) {
listNode * p = head->next;
if (head->next == NULL)
{
head->next = q;
}
else
{
while (p->next != NULL)
{
p = p->next;
}
p->next = q;
}
}
void deleteNode(listNode * head, int data) {
listNode * p = head->next, *q = head;
//若是是空的 能夠返回一個提醒也能夠不處理
while (p)
{
if (p->data == data)
{
q->next = p->next;
free(p);
break;
}
q = p;
p = p->next;
}
}
複製代碼
運行結果:內存
若是您喜歡的話,記得點個贊哇!!!Thanks.