双向链表增删改查C语言代码,C语言中双向链表的增删改查输出源文件代码
C
/* 雙向線性鏈表
*
* LIST
* +------+------+
* +------ | head | tail | ------+
* | +------+------+ |
* | |
* V LIST_NODE V
* +------+ +------+ +------+
* | data | | data | | data |
* +------+ +------+ +------+
* | NULL |
* +------+ +------+ +------+
* | next | -> | next | -> ... -> | NULL |
* +------+ +------+ +------+
*/
#include
#include
#include "double_link_list.h"
/* 創(chuàng)建節(jié)點 */
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;
}
/* 銷毀節(jié)點 */
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;
}
/* 創(chuàng)建 */
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;
}
/* 刪除所有匹配數(shù)據(jù) */
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*
總結(jié)
以上是生活随笔為你收集整理的双向链表增删改查C语言代码,C语言中双向链表的增删改查输出源文件代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 简历html步骤,HTML 和 CSS
- 下一篇: 行测-常识积累(2)
