單向連結串列是連結串列中的一種,其特點是連結串列的連結方向是單向的,對連結串列的訪問要通過從頭部開始,依序往下讀取。當然,往後對資料結構的深入學習,還會涉及到雙向連結串列、迴圈連結串列等線性表,我在這裡就不再解釋了。
連結串列主要是由結點一個個相繼串起來的,其中每一個結點又被分為兩個部分:(data)資料域、(next)指標域。
- 資料域(data):主要是儲存的是關於結點的資訊
- 指標域(next):儲存的是下一個結點的地址
單向連結串列的形式:
那麼,既然我們知道了單連結串列的元素是什麼樣了,以及單連結串列的形式是如何了,我們就可以開始動手實現簡單的增、刪、查、改。
首先,要學會連結串列的建立,建立無非也就是增加:
- 如果連結串列為空,那麼建立連結串列並且將增加的這個結點作為第一個結點
- 如果連結串列不為空,那麼就直接遍歷插到尾部
需要說明的是,為了避免二重指標的操作,便於各位的理解,我這裡用的是頭結點來儲存指向第一個結點的地址,也就是我捨去了頭結點的資料域,以它的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;
}
}
複製程式碼
連結串列的刪除:這裡的刪除,指的是刪除其中的某個結點,既然要刪除某個結點,那麼便是要遍歷出符合給定條件的就把它刪除。
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;
}
}
複製程式碼
查、改的操作在這裡我就不細說了,因為,這個實現起來就是一個迴圈,然後再判斷每一個資料域是否與你要查詢的一致...
最後,我以一個整體的程式結束這篇部落格:
#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.