数据结构:双向链表
2019-04-20 17:07
232 查看
doublyinkedlist.h
#ifndef DOUBLYLINKEDLIST_H #define DOUBLYLINKEDLIST_H typedef struct node *link; struct node { unsigned char item; link prev, next; }; link make_node(unsigned char item); void free_node(link p); link search(unsigned char key); void insert(link p); void delete(link p); void traverse(void (*visit)(link)); void destroy(void); void enqueue(link p); link dequeue(void); #endif
doublylinkedlist.c
#include <stdlib.h> #include "doublylinkedlist.h" struct node tailsentinel; struct node headsentinel = {0, NULL, &tailsentinel}; struct node tailsentinel = {0, &headsentinel, NULL}; static link head = &headsentinel; static link tail = &tailsentinel; link make_node(unsigned char item)//创建结点 { link p = malloc(sizeof *p); p->item = item; p->prev = p->next = NULL; return p; } void free_node(link p)//释放结点 { free(p); } link search(unsigned char key)//查询 { link p; for (p = head->next; p != tail; p = p->next) { if (p->item == key) return p; } return NULL; } void insert(link p)//插入结点 { p->next = head->next; head->next->prev = p; head->next = p; p->prev = head; } void delete(link p)//删除结点 { p->prev->next = p->next; p->next->prev = p->prev; } void traverse(void (*visit)(link))//遍历链表 { link p; for (p = head->next; p != tail; p = p->next) { visit(p); } } void destroy(void)//销毁链表 { link q, p = head->next; head->next = tail; tail->prev = head; while (p != tail) { q = p; p = p->next; free_node(q); } } void enqueue(link p)//入队 { insert(p); } link dequeue(void)//出队 { if (tail->prev == head) { return NULL; } else { link p = tail->prev; delete(p); return p; } }
main.c
#include <stdio.h> #include "doublylinkedlist.h" void print_item(link p) { printf("%d\n", p->item); } int main(void) { link p = make_node(10); insert(p); p = make_node(5); insert(p); p = make_node(90); insert(p); p = search(5); delete(p); free_node(p); traverse(print_item); destroy(); p = make_node(100); enqueue(p); p = make_node(200); enqueue(p); p = make_node(250); enqueue(p); while (p = dequeue()) { print_item(p); free_node(p); } return 0; }
相关文章推荐
- 数据结构之双向链表,头部插入数据
- 数据结构实验之链表九:双向链表
- 数据结构之双向链表
- 看数据结构写代码(7)具有实用意义的双向链表
- 数据结构实验之链表九:双向链表
- 数据结构实验之链表九:双向链表
- 数据结构中双向链表的基本操作(源代码)
- 数据结构之静态链表和双向循环链表
- 数据结构--双向循环链表实践
- 数据结构之双向链表(SplDoublyLinkedList)
- 数据结构与算法----双向链表
- 数据结构实验之链表九:双向链表
- 数据结构课程设计-----用C#实现双向链表
- 数据结构(4):双向链表的基本操作
- 数据结构之双向循环链表
- 数据结构与算法之双向链表
- 数据结构实验之链表九:双向链表
- 数据结构课程设计_双向循环链表
- [数据结构(ywm版)] 异或指针双向链表
- 数据结构之双向链表的Java实现