1. 程式人生 > >c簡單的單向鏈表

c簡單的單向鏈表

是不是 .cn int 指針 include 什麽 都沒有 ima list

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簡單的單向鏈表