最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux中的內(nèi)核鏈表實例詳解

 更新時間:2017年08月07日 08:30:54   作者:菜頭大大  
這篇文章主要介紹了Linux中的內(nèi)核鏈表實例詳解的相關資料,鏈表中一般都要進行初始化、插入、刪除、顯示、釋放鏈表,尋找節(jié)點這幾個操作,需要的朋友可以參考下

Linux中的內(nèi)核鏈表實例詳解

鏈表中一般都要進行初始化、插入、刪除、顯示、釋放鏈表,尋找節(jié)點這幾個操作,下面我對這幾個操作進行簡單的介紹,因為我的能力不足,可能有些東西理解的不夠深入,造成一定的錯誤,請各位博友指出。

A、Linux內(nèi)核鏈表中的幾個主要函數(shù)(下面是內(nèi)核中的源碼拿出來給大家分析一下)

1)初始化:

#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)  // ptr為struct list_head,其中包括兩個指針next和prev,這里已經(jīng)可以看出內(nèi)核鏈表是雙向循環(huán)鏈表

 

2)尾部插入:

static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
} //尾部插入,傳入的參數(shù)是新節(jié)點中的兩個指針和頭結點中的兩個指針

3)頭部插入函數(shù)

static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
} //頭插入函數(shù),傳入的參數(shù)是新節(jié)點中的兩個指針和頭結點中的兩個指針

 

4)刪除節(jié)點函數(shù)

static inline void list_del(struct list_head *entry)  //傳入要刪除節(jié)點中的指針域
{
__list_del(entry->prev, entry->next);//兩個參數(shù)分別為所刪除節(jié)點前一個節(jié)點和后一個節(jié)點
entry->next = (void *) 0;//刪除節(jié)點后置為空
entry->prev = (void *) 0;
}

 

5)顯示函數(shù)(如果要打印出鏈表中的信息的話要自己寫成打印的函數(shù),比如printf,因為這個其實是一個遍歷的函數(shù),沒有顯示的功能)

#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))

/* 這個函數(shù)用于遍歷鏈表
pos為節(jié)點指針,
head是頭結點中的兩個指針的地址
member為各節(jié)點中的指針域
*/

6)刪除鏈表

#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)

//這里面的pos和n都是list_head指針,n指針是用于在刪除時不讓鏈表斷鏈

 

7)尋找節(jié)點(這也是用的內(nèi)核中的遍歷函數(shù))

#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))

 

B.下面來段代碼給大家看看具體的運用方法


#include"kernel.h"
#include<errno.h>
#include<stdio.h>
#include<stdlib.h>

typedef struct list_node
{
int data;
struct list_head list;//節(jié)點的指針域是被封裝在struct list_head這個結構體內(nèi)
//這個結構體中包括struct list_head *next,*prev
}*node,node1;


node init_head(node head)//初始化空鏈表
{
head = (node)malloc(sizeof(node1));//為節(jié)點分配空間
if(head == NULL)
{
perror("head");
return NULL;
}
INIT_LIST_HEAD(&(head->list));//#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)//調(diào)用內(nèi)核中的初始化函數(shù),傳入的參數(shù)是
//節(jié)點的中兩個指針,即struct list_head結構體中的兩個指針
return head;
}

node insert_tail(node head,int data)//尾部插入函數(shù)
{
node new = (node)malloc(sizeof(node1));//為新節(jié)點分配空間
if(new == NULL)//判斷一下分配空間是否成功
{
perror("new:");
return NULL;
}
new->data = data;
list_add_tail(&(new->list),&(head->list));//調(diào)用內(nèi)核中的從尾部插入的函數(shù),傳入的參數(shù)為新節(jié)點中的兩個指針
//和頭結點中的兩個指針
return 0;
}

 

head_insert_node(node head,int data)//頭插入函數(shù)
{
node new;//創(chuàng)建一個新節(jié)點
new = (node)malloc(sizeof(node1));//為新節(jié)點分配空間
if(new == NULL)//判斷一下分配空間是否成功
{
perror("new:");
return 0;
}
new->data = data;
list_add(&(new->list),&(head->list));//調(diào)用內(nèi)核中從頭插入的函數(shù),傳入的參數(shù)為新節(jié)點的兩個指針和頭結點的兩個指針
return 0;
}

node search_node(node head,int data)//尋找節(jié)點函數(shù)
{
node p = NULL;
list_for_each_entry(p,&(head->list),list) //內(nèi)核中的遍歷函數(shù)
{
if(p->data == data) //p即為需要找的節(jié)點
{
printf("found the data:%d\n",p->data);
goto OK;
}
}

puts("not found the data!");
return NULL;

OK:
return p;
}

int show_node(node tmp)
{
if(tmp == NULL)
{
puts("tmp is NULL!");
return -1;
}
printf("the data is %d\n",tmp->data);
return 0;
}

int delete_node(node head,int data)
{
node p = NULL;
list_for_each_entry(p,&(head->list),list)
{
if(p->data == data)
{
printf("found the data which you want to delete!\n");
goto f;
}
}

f:
list_del(&(p->list));
free(p);
return 0;
}

int show_list(node head)
{
node p = NULL;
list_for_each_entry(p,&(head->list),list)
{
printf("data:%d\n",p->data);
}
return 0;
}


int delete_list(node head)//刪除鏈表函數(shù)
{
node p,q;
list_for_each_entry_safe(p,q,&(head->list),list)//這是內(nèi)核中的安全刪除函數(shù)
{
list_del(&(p->list));
free(p);
}

list_del(&(head->list));
free(head);
return 0;
}
int main(int argc,char **argv)
{
node head;
node tmp;
head = init_head(head);//初始化空鏈表函數(shù)
insert_tail(head,45);//從末尾插入函數(shù)
insert_tail(head,55);
insert_tail(head,65);

head_insert_node(head,75);//從頭插入函數(shù)
show_list(head); //顯示鏈表函數(shù) 

tmp = search_node(head,55);//尋找結點函數(shù)
show_node(head);
delete_node(head,55);
//show_list(head);
delete_list(head);//刪除鏈表函數(shù)
return 0;
}

以上就是Linux中的內(nèi)核鏈表實例詳解的實例如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • Shell基本運算符的實現(xiàn)

    Shell基本運算符的實現(xiàn)

    Shell支持多種運算符,主要包括算數(shù)運算符,關系運算符,布爾運算符,字符串運算符,文件測試運算符,下面我們就介紹一下這些運算符的用法
    2023-05-05
  • 深入淺出Shell編程 Shell變量介紹

    深入淺出Shell編程 Shell變量介紹

    先不要管Shell的版本,來看看Shell 變量,在Shell中有三種變量:系統(tǒng)變量,環(huán)境變量,用戶變量。其中用戶變量在編程過程中使用最多,系統(tǒng)變量在對參數(shù)判斷和命令返回值判斷會使用,環(huán)境變量主要是在程序運行的時候需要設置。
    2013-01-01
  • Shell腳本實現(xiàn)獲取網(wǎng)頁快照并生成縮略圖

    Shell腳本實現(xiàn)獲取網(wǎng)頁快照并生成縮略圖

    這篇文章主要介紹了Shell腳本實現(xiàn)獲取網(wǎng)頁快照并生成縮略圖,本文獲取網(wǎng)頁快照使用phantomjs、生成縮略圖使用ImageMagick,需要的朋友可以參考下
    2015-02-02
  • Linux命令每天必學(55)之traceroute命令

    Linux命令每天必學(55)之traceroute命令

    這篇文章主要介紹了Linux命令每天必學(55)之traceroute命令的相關資料,需要的朋友可以參考下
    2015-11-11
  • Linux使用Split命令分割文件與合并的操作方法

    Linux使用Split命令分割文件與合并的操作方法

    Linux split是一個命令行工具,用于將文件分割成多個較小的文件,它可以按照文件大小、行數(shù)或者指定的分割符來進行分割,本文給大家介紹了Linux使用Split命令分割文件與合并的操作方法,需要的朋友可以參考下
    2024-03-03
  • linux 中的ls命令參數(shù)詳解及l(fā)s命令的使用實例

    linux 中的ls命令參數(shù)詳解及l(fā)s命令的使用實例

    這篇文章主要介紹了linux 中的ls命令參數(shù)詳解及l(fā)s命令的使用實例,需要的朋友可以參考下
    2017-08-08
  • 檢查 Bash 中是否存在輸入?yún)?shù)的問題

    檢查 Bash 中是否存在輸入?yún)?shù)的問題

    這篇文章主要介紹了檢查 Bash 中是否存在輸入?yún)?shù),通過本文向您展示如何檢查輸入?yún)?shù)是否存在或現(xiàn)有參數(shù)的數(shù)量,需要的朋友可以參考下
    2023-06-06
  • 關于Linux之grep查找文本時匹配反斜杠\轉義問題

    關于Linux之grep查找文本時匹配反斜杠\轉義問題

    在Linux系統(tǒng)中,當文本中有反斜杠?,?需要使用grep查找出帶有反斜杠的內(nèi)容,接下來通過本文給大家講解Linux之grep查找文本時匹配反斜杠\轉義問題,需要的朋友可以參考下
    2022-10-10
  • Linux實現(xiàn)定時備份MySQL數(shù)據(jù)庫并刪除30天前的備份文件

    Linux實現(xiàn)定時備份MySQL數(shù)據(jù)庫并刪除30天前的備份文件

    這篇文章主要介紹了Linux實現(xiàn)定時備份MySQL數(shù)據(jù)庫并刪除30天前的備份文件,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • linux find命令之exec簡單概述

    linux find命令之exec簡單概述

    這篇文章主要為大家詳細介紹了linux find命令之exec的簡單使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評論

旺苍县| 辉县市| 鸡东县| 上犹县| 乐昌市| 东海县| 墨江| 冀州市| 堆龙德庆县| 石渠县| 十堰市| 宝清县| 安宁市| 甘谷县| 井研县| 永胜县| 平定县| 阜南县| 临颍县| 黔南| 济宁市| 汉沽区| 大洼县| 方正县| 房山区| 邢台县| 左权县| 阳高县| 塔城市| 临泉县| 桃园市| 普格县| 吉水县| 平陆县| 盐津县| 漳平市| 桦甸市| 山丹县| 将乐县| 区。| 岚皋县|