• 自己用C写的list双向链表


    自己用C写的list双向链表头文件

      1 #ifndef _LIST_H_
      2 #define _LIST_H_
      3 
      4 #include <stdlib.h>
      5 #include <stdio.h>
      6 #include <stdbool.h>
      7 
      8 typedef int DataType;
      9 struct node{
     10     DataType data;
     11     struct node * next;
     12     struct node * prev; 
     13 };
     14 
     15 typedef struct node Node;
     16 
     17 struct list{
     18     Node * root;
     19     Node * tail;
     20     size_t size;
     21 };
     22 
     23 typedef struct list List;
     24 
     25 void init(List * l);
     26 void destroy(List * l);
     27 size_t size(List * l);
     28 bool isEmpty(List * l);
     29 void addNodeAfter(Node * pn, Node * new_node);
     30 void addFirst(List * l, DataType item);
     31 void addLast(List * l, DataType item);
     32 DataType getFirst(List * l);
     33 DataType getLast(List * l);
     34 void removeNodeAfter(Node * pn);
     35 DataType removeFirst(List * l);
     36 DataType removeLast(List * l);
     37 void showAll(List * l);
     38 
     39 //用calloc创建2个带有默认初始值的Node,分别赋给root,和tail,并链接好root和tail.
     40 void init(List * l)
     41 {
     42     Node * pnode = (Node *)calloc(2, sizeof(Node)); 
     43     l->root = pnode;
     44     l->tail = ++pnode;
     45     l->root->next = l->tail;
     46     l->tail->prev = l->root; 
     47     l->size = 0;
     48 }
     49 
     50 //释放占用内存
     51 void destroy(List * l)
     52 {
     53     Node * dnode = NULL;
     54     while(l->root != NULL)
     55     {
     56         dnode = l->root;
     57         l->root = l->root->next;
     58         free(dnode);
     59     }
     60     l->root = l->tail = NULL;
     61     l->size = 0;
     62 }
     63 
     64 //返回当前元素个数
     65 size_t size(List * l)
     66 {
     67     return l->size;
     68 }
     69 
     70 bool isEmpty(List * l)
     71 {
     72     return l->size == 0;
     73 }
     74 
     75 //将新增节点new_node链接在节点pn后面
     76 void addNodeAfter(Node * pn, Node * new_node)
     77 {
     78     new_node->next = pn->next;
     79     pn->next->prev = new_node;
     80     new_node->prev = pn;
     81     pn->next = new_node;
     82 }
     83 
     84 //向链表头部添加新元素item
     85 void addFirst(List * l, DataType item)
     86 {
     87     Node *pnode = (Node *)malloc(sizeof(Node));
     88     pnode->data = item;
     89     addNodeAfter(l->root, pnode);
     90     ++(l->size);
     91 }
     92 
     93 //向链表尾部添加新元素item
     94 void addLast(List * l, DataType item)
     95 {
     96     Node *pnode = (Node *)malloc(sizeof(Node));
     97     pnode->data = item;
     98     addNodeAfter(l->tail->prev, pnode);
     99     ++(l->size);
    100 }
    101 
    102 //返回链首元素的值
    103 DataType getFirst(List * l)
    104 {
    105     if(isEmpty(l))
    106         return -2147483648;
    107     return l->root->next->data;
    108 }
    109 
    110 //返回链尾元素的值
    111 DataType getLast(List * l)
    112 {
    113     if(isEmpty(l))
    114         return -2147483648;
    115     return l->tail->prev->data;
    116 }
    117 
    118 //删除pn后面的节点,并释放被删节点占用的内存
    119 void removeNodeAfter(Node * pn)
    120 {
    121     pn->next = pn->next->next;
    122     free(pn->next->prev);
    123     pn->next->prev = pn;
    124 
    125 }
    126 
    127 //移除链首元素
    128 DataType removeFirst(List * l)
    129 {
    130     if(isEmpty(l))
    131         return -2147483648;
    132     DataType ret = l->root->next->data;
    133     removeNodeAfter(l->root);
    134     --(l->size);
    135     return ret;
    136 }
    137 
    138 //移除链尾元素
    139 DataType removeLast(List * l)
    140 {
    141     if(isEmpty(l))
    142         return -2147483648;
    143     DataType ret = l->tail->prev->data;
    144     removeNodeAfter(l->tail->prev->prev);
    145     --(l->size);
    146     return ret;
    147 }
    148 
    149 //遍历链表
    150 void showAll(List * l)
    151 {
    152     if(isEmpty(l))
    153     {
    154         printf("empty data!
    ");
    155         return;
    156     }
    157     Node * current = l->root->next;
    158     while(current != l->tail)
    159     {
    160         printf("%d ", current->data);
    161         current = current->next;
    162     }
    163     printf("
    ");
    164 }
    165 
    166 #endif
    List
  • 相关阅读:
    iOS开发UI篇—UIScrollView控件介绍
    iOS开发UI篇—iOS开发中三种简单的动画设置
    iOS开发UI篇—iOS开发中Xcode的一些使用技巧
    iOS开发UI篇—在ImageView中添加按钮以及Tag的参数说明
    iOS开发UI篇—KVC简单介绍
    iOS开发UI篇—从代码的逐步优化看MVC
    iOS开发UI篇—xib的简单使用
    iOS开发UI篇—字典转模型
    iOS开发UI篇—九宫格坐标计算
    A1005. Spell It Right
  • 原文地址:https://www.cnblogs.com/endenvor/p/7647636.html
Copyright © 2020-2023  润新知