C语言,链表
定義一個鏈表的節點
之前說到樹,里面也有一個節點,節點是用來存數據的,不管是樹還是其他什么數據結構,最終的目的都是用來處理數據的,所以節點里面包含兩個東西,一個是指針,指針可以指向其他位置,可以是下一個節點,可以是上一個節點,還有一個東西就是數據本身,我們用一個int來代表數據,如果是很復雜的數據,我們也可以用結構體表示。
typedef struct Node{int data;
struct Node * next;
}*p_Node;
定義一個鏈表頭結構體
鏈表頭也可以是一個節點,可以認為他就是一個指針,這個指針就指向這個鏈表的表頭,所以我們還是用上面的結構體來聲明這個頭節點,再換個名字就好了。
typedef struct head{p_Node root;
};
聲明一個鏈表頭
一個鏈表沒有頭是不行的,就像一個家庭沒有戶主是不行的,也像一個球隊,如果沒有隊長也是不行的,我們打正式比賽,還需要教練,但是正常一個球隊,我們必須有一個隊長,隊長非常重要,就像一個鏈表一樣,鏈表頭也是一樣的重要。
/*初始化一個鏈表*/struct head p_head;
/*鏈表為空,鏈表指向下一項為空,說明鏈表為空*/
p_head.root = NULL;
我們的鏈表頭是空的,沒有指向任何地方,這樣做有沒有問題?所以執行了那幾行代碼后,會變成這個樣子。這里提一下,可能很多初學者覺得這個有沒有問題,到底是不是這樣的,我們回顧聲明和定義,什么是聲明,什么是定義呢?聲明和定義的主要區別是有沒有分配內存空間,我們使用
struct head p_head;定義了一個指針,那么這個就需要分配內存空間。
向鏈表插入一個數據
插入數據的時候,因為我們需要該表頭指針的位置,所以會做的判斷,正常插入一個數據到鏈表里面去的時候,先是開辟一個節點,然后操作這個節點的next指針,然后讓鏈表的尾部指向這個節點。
鏈表源碼示例
#include "stdio.h"#include "stdlib.h"
typedef struct Node{
int data;
struct Node * next;
}*p_Node;
typedef struct head{
p_Node root;
};
/*直接做插入的動作,不給head 單獨分配內存*/
int list_insert(struct head * p_head,int data)
{
/*新建一個節點*/
p_Node pTemp = (p_Node)malloc(sizeof(struct Node));
/*把數據放入這個新建的節點里面*/
pTemp->data = data;
pTemp->next = NULL;
if(p_head->root == NULL)
{
p_head->root = pTemp;
printf("#1list_insert:%d\n",data);
return (0);
}else{
/*找到鏈表的尾部節點*/
p_Node pTemp1 = p_head->root;
while(pTemp1->next != NULL)
{
pTemp1 = pTemp1->next;
}
/*插入新節點*/
pTemp1->next = pTemp;
printf("#2list_insert:%d\n",data);
return (0);
}
}
int list_traverse(p_Node node)
{
if(node == NULL)
{
printf("list_traverse: pHead null \n");
return (-1);
}
p_Node pTemp1 = node;
while(pTemp1 != NULL)
{
printf("data:%d\n",pTemp1->data);
pTemp1 = pTemp1->next;
}
}
int main()
{
int i = 0;
printf("main Entering ...\n");
/*初始化一個鏈表*/
struct head p_head;
/*鏈表為空,鏈表指向下一項為空,說明鏈表為空*/
p_head.root = NULL;
/*像鏈表插入數據*/
for(i = 0;i< 10;i++)
{
list_insert(&p_head,i);
}
/*遍歷鏈表*/
list_traverse(p_head.root);
printf("main Exiting ...\n");
return (0);
}
執行結果
最后
用上面這個圖片來表示鏈表就很簡單了,我們后面還會看到循環鏈表,我們知道鏈表的尾部是指向NULL的,如果我們把最后的那個鏈表指向head,就是循環鏈表。
—————END—————
掃碼或長按關注
回復「?加群?」進入技術群聊
總結
- 上一篇: WMS软件哪个好?排名怎样
- 下一篇: 带你阅读linux内核源码:下载源码、编