• 队列--双链表实现


    队列是一种常见的数据结构。常用于buffer数据,因为他是先进先出,先来的数据先消耗。

    最常用的操作是插入队列尾部,和读取头部数据。

    通常在项目中,一个线程来buffer数据,另外一个线程来消耗数据。

    下面给出队列的常用方法,并写一个简单的验证程序。

    #include <stdlib.h>
    #include <stdio.h>
    typedef struct _ListNode{
      struct _ListNode *prev;
      struct _ListNode *next;
      int data;
    }ListNode;
    typedef struct _List{
      ListNode *head;
      ListNode *tail;
      int len;
    }List;
    void list_init(List *pList)
    {
      pList->head = NULL;
      pList->tail = NULL;
      pList->len = 0;
    }
    void list_insert_tail(List *pList, ListNode *node)
    {
      node->next = NULL;
      if ((node->prev = pList->tail) != NULL)
      {
        pList->tail->next = node;
      }
      else
      {
        pList->head = node;
      }
      pList->tail = node;
      pList->len++;
    }
    void list_remove(List *pList, ListNode* node)
    {
      if (pList->tail == node)
      {
        pList->tail = node->prev;
      }
      else
      {
        node->next->prev = node->prev;
      }
      if (pList->head == node)
      {
        pList->head = node->next;
      }
      else
      {
        node->prev->next = node->next;
      }
      if (node != NULL)
      {
        node->prev = node->next = NULL;
      }
    }
    int main(void)
    {
      List _list;
      ListNode *pListNode;
      list_init(&_list);
      int idx = 0;
      for (idx = 0; idx < 10; idx++)
      {
        pListNode = (ListNode*)malloc(sizeof(ListNode));
        pListNode->data = idx;
        pListNode->prev = NULL;
        pListNode->next = NULL;
        list_insert_tail(&_list,pListNode);
      }
      ListNode *tmp;
      printf("head:%d, tail:%d, len:%d ", _list.head->data, _list.tail->data,_list.len);
      for (tmp = _list.head; tmp != NULL; tmp = tmp->next)
      {
        printf("list node:%d ", tmp->data);
      }
      for (idx = 0; idx < 10; idx++)
      //for (tmp = _list.head; tmp != _list.tail; tmp = tmp->next)
      {
        tmp = _list.head;
        printf("remove list head:%d ", _list.head->data);
        list_remove(&_list, tmp);
      }

      return 0;
    }

    运行结果如下:

  • 相关阅读:
    Servlet接口实现类开发步骤
    Servlet概述
    Web服务器之HTTP协议与Tomcat服务器
    vant中van-picker选项插入图片
    排序算法-插入排序
    排序算法-快速排序
    排序算法-冒泡排序
    浅谈C#中Dictionary的实现。
    设计模式(23)-备忘录模式
    设计模式(22)-访问者模式
  • 原文地址:https://www.cnblogs.com/fellow1988/p/6139084.html
Copyright © 2020-2023  润新知