c簡單的單向鏈表
ps:list鏈表 node節點
在鏈表中節點就是一個個的結構體
堆空間由於在申請內存時,地址是隨機的,所以要用鏈表的方式將其連接起來,但是鏈表頭的地址要知道.
每個節點包含兩個部分:數據區和地址區,其中指向自身類型節點的指針叫做地址域,定義結構體時別忘了隨便給head附上NULL地址.(尾地址不用單獨定義,因為它是在節點內的)
由於最後一個節點之後沒有指向的下一個節點,所以其地址域為NULL,如果是空鏈表,就是只定義了一個結構體,什麽數據都沒有,這個時候把表頭的地址初始化定為NULL
節點的插入有頭插法和尾插法:
頭插法就是不斷地在頭部位置添加節點,如上圖也就是新添加的節點的地址域要指向原來的頭地址,新的頭地址要改為新插入的節點的地址.這樣剛好在添加第一個節點的時候,初始化的頭地址變為了第一個節點的地址域也就是NULL,也就是尾指針變為了NULL.調用鏈表中的數據時,要定義一個節點類型的指針,它指向要和頭地址的指向相同,然後利用它調用第一個節點,在將此節點的地址域賦給它,再次利用它調用下一個節點...只到它為NULL指針為止.
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node* pNext;
};
struct Node* pHead = NULL;
void AddHead(int data)
{
struct Node* p = (struct Node*)malloc(sizeof(struct Node));
p->data = data;
p->pNext = pHead;
pHead = p;
}
void Print()
{
struct Node* ptemp = pHead;
while (ptemp != NULL)
{
printf("%d ", ptemp->data);
ptemp = ptemp->pNext;
}
}
void main()
{
AddHead(1);
AddHead(2);
AddHead(3);
Print();
}
尾插法:尾插法相對來說比較麻煩,多了一個判斷是不是第一個節點的過程
#include<stdio.h> #include<stdlib.h> struct Node { int data; struct Node* pNext; }; struct Node* pHead = NULL; void AddHead(int data) { struct Node* p = (struct Node*)malloc(sizeof(struct Node)); p->data = data; p->pNext = pHead; pHead = p; } void AddTail(int data) { struct Node* p = (struct Node*)malloc(sizeof(struct Node)); p->data = data; if (pHead == NULL) pHead = p; else { struct Node* ptemp = pHead; while (ptemp->pNext != NULL) { ptemp = ptemp->pNext; } ptemp->pNext = p; } p->pNext = NULL; } void Print() { struct Node* ptemp = pHead; while (ptemp != NULL) { printf("%d ", ptemp->data); ptemp = ptemp->pNext; } } void main() { AddTail(1); AddTail(2); Print(); }
c簡單的單向鏈表