日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双向链表增删改查C语言代码,C语言中双向链表的增删改查输出源文件代码

發布時間:2023/12/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双向链表增删改查C语言代码,C语言中双向链表的增删改查输出源文件代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C

/* 雙向線性鏈表

*

* LIST

* +------+------+

* +------ | head | tail | ------+

* | +------+------+ |

* | |

* V LIST_NODE V

* +------+ +------+ +------+

* | data | | data | | data |

* +------+ +------+ +------+

* | NULL |

* +------+ +------+ +------+

* | next | -> | next | -> ... -> | NULL |

* +------+ +------+ +------+

*/

#include

#include

#include "double_link_list.h"

/* 創建節點 */

static LIST_NODE* create_node (int data, LIST_NODE* prev,

LIST_NODE* next) {

LIST_NODE* node = malloc (sizeof (LIST_NODE));

node->data = data;

node->prev = prev;

node->next = next;

return node;

}

/* 銷毀節點 */

static LIST_NODE* destroy_node (LIST_NODE* node, LIST_NODE** prev) {

LIST_NODE* next = node->next;

if (prev)

*prev = node->prev;

free (node);

return next;

}

/* 創建 */

LIST* list_create (void) {

LIST* list = malloc (sizeof (LIST));

list->head = NULL;

list->tail = NULL;

return list;

}

/* 銷毀 */

void list_destroy (LIST* list) {

list_clear (list);

free (list);

}

/* 追加 */

void list_append (LIST* list, int data) {

list->tail = create_node (data, list->tail, NULL);

if (list->tail->prev)

list->tail->prev->next = list->tail;

else

list->head = list->tail;

}

/* 前插 */

bool list_insert (LIST* list, size_t pos, int data) {

LIST_NODE* find = NULL;

for (find = list->head; find; find = find->next)

if (! pos--) {

LIST_NODE* node = create_node (data, find->prev, find);

if (node->prev)

node->prev->next = node;

else

list->head = node;

node->next->prev = node;

return true;

}

return false;

}

/* 隨機訪問 */

int* list_at (LIST* list, size_t pos) {

LIST_NODE* find = NULL;

for (find = list->head; find; find = find->next)

if (! pos--)

return &find->data;

return NULL;

}

/* 刪除 */

bool list_erase (LIST* list, size_t pos) {

LIST_NODE* find = NULL;

for (find = list->head; find; find = find->next)

if (! pos--) {

LIST_NODE* prev = NULL;

LIST_NODE* next = destroy_node (find, &prev);

if (prev)

prev->next = next;

else

list->head = next;

if (next)

next->prev = prev;

else

list->tail = prev;

return true;

}

return false;

}

/* 刪除所有匹配數據 */

void list_remove (LIST* list, int data) {

LIST_NODE* find = NULL, *next = NULL;

for (find = list->head; find; find = next) {

next = find->next;

if (find->data == data) {

LIST_NODE* prev = NULL;

LIST_NODE* next = destroy_node (find, &prev);

if (prev)

prev->next = next;

else

list->head = next;

if (next)

next->prev = prev;

else

list->tail = prev;

}

}

}

/* 清空 */

void list_clear (LIST*

list) {

while (list->head)

list->head = destroy_node (list->head, NULL);

list->tail = NULL;

}

/* 大小 */

size_t list_size (LIST*

總結

以上是生活随笔為你收集整理的双向链表增删改查C语言代码,C语言中双向链表的增删改查输出源文件代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。