风也温柔

计算机科学知识库

数据结构与程序设计 c语言描述-C语言数据结构硬核玩法?看这文章,C语言奇怪的知识又增加了

  前言
  今天这篇文章我主要为大家链式队列的独特硬核写法,这是属于C语言中数据结构的内容,如果你对C语言基础知识还不熟悉话,可以关注下专栏教程或者自己找本书籍学习一下即可哦。
  C语言数据结构硬核玩法?看这文章,C语言奇怪的知识又增加了
  初识
  这里可能大部分都不太知道有这样的一个数据类型,可以说该类型是英文size type的一个缩写,它是一种记录数据大小的数据类型(可以认为是一种整形数据)。其实我们经常使用的()的返回值数据类型就是数据结构与程序设计 c语言描述,只是我们常常用一个整形比如int来保存返回值。
  值得我们注意的是:类型是一个与操作系统相关的数据类型,它主要是为了提高C语言的可移植性和可读性而加入的,可以说它并不是一种基本的数据类型,而且在头文件中用来重命名的数据类型。其实在我们平时很多地方都用到了,比如:
   void memcpy(void s1, void const *s2,size_t n);

  我们使用的时候几乎都用整形比如int变量来使用,并没有使用到类型,所以说尽管我们的int依赖于C编译器,有些情况并不是固定的,如果我们用基本类型替换可能带来数据类型过小或者过大的问题,过小可能会导致数据溢出问题,过大可能导致运行速度降低!的使用:只要是用到等返回值,或者传入值的变量都定义为类型!
  初识队列
  C语言数据结构硬核玩法?看这文章,C语言奇怪的知识又增加了
  队列:一种特殊的操作受限制的线性表,用户仅允许在线性表的头部获取数据,在尾部插入数据数据结构与程序设计 c语言描述,所以大家也叫FIFO(先进先出)线性表。形象一点的表达:类似于一队人排队钻进一根只能进入一个人的管子,先进去的人先出来,后面的人只能在从同一个口子进入!
  队列的类型:顺序队列和循环队列。顺序队列,出队列指针必须大于或者等于入队列指针,否则容易出现假溢出现象;而循环队列只要入队列指针与出队列指针不再次重合就不会溢出!
  受类型限制的队列实现
  首先我们先贴上刚刚写好的Queue.h
   #include

    #ifndef __QUEUE_H__
    #define __QUEUE_H__
    /***************************************
     *fuction :数据类型定义
     **************************************/
    //节点数据类型定义
    typedef struct _tag_stNode
    { 
       void *data;              //数据指针
       struct _tag_stNode *next;//指向下一个节点
    }STNode; 
    //队列结构体定义
    typedef struct _tag_stQueue 
    { 
       int    QueueSize; //队列大小
       size_t memSize;  //数据大小
       STNode *head;    //头指针
       STNode *tail;    //尾指针
    }STQueue; 
    /***************************************
     *fuction  :函数接口声明
     **************************************/
    //队列接口函数定义
    void QueueInit(STQueue *q, size_t memSize); 
    int  QueueIn(STQueue *, const void *); 
    void QueueOut(STQueue *, void *); 
    void GetQueueUnit(STQueue *, void *); 
    void ClearQueue(STQueue *); 
    int  GetQueueSize(STQueue *); 

  接下来贴上刚刚写好的Queue.c
   #include

    #include 
    #include "Queue.h"
    /***************************************
     *fuction  :队列初始化
     **************************************/
    void QueueInit(STQueue *q, size_t memSize)
    {
       q->QueueSize = 0;
       q->memSize = memSize;
       q->head = q->tail = NULL;
    }
    /***************************************
     *fuction  :入队列
     **************************************/
    int QueueIn(STQueue *q, const void *data)
    {
        STNode *newNode = (STNode *)malloc(sizeof(STNode));
        if(newNode == NULL)
        {
            return -1;
        }
        newNode->data = malloc(q->memSize);
        if(newNode->data == NULL)
        {
            free(newNode);
            return -1;
        }
        newNode->next = NULL;
        memcpy(newNode->data, data, q->memSize);
        if(q->QueueSize == 0)
        {
            q->head = q->tail = newNode;
        }
        else
        {
            q->tail->next = newNode;
            q->tail = newNode;
        }
        q->QueueSize++;
        return 0;
    }
    /***************************************
     *fuction  :出队列
     **************************************/
    void QueueOut(STQueue *q, void *data)
    {
        if(q->QueueSize > 0)
        {
            STNode *temp = q->head;
            memcpy(data, temp->data, q->memSize);
            if(q->QueueSize > 1)
            {
                q->head = q->head->next;
            }
            else
            {
                q->head = NULL;
                q->tail = NULL;
            }
            q->QueueSize--;
            free(temp->data);
            free(temp);
        }
    }
    /***************************************
     *fuction  :获得队列头部数据
     **************************************/
    void GetQueueUnit(STQueue *q, void *data)
    {
        if(q->QueueSize > 0)
        {
           STNode *temp = q->head;
           memcpy(data, temp->data, q->memSize);
        }
    }
    /***************************************
     *fuction  :清除队列
     **************************************/
    void ClearQueue(STQueue *q)
    {
      STNode *temp;
      while(q->QueueSize > 0)
      {
          temp = q->head;
          q->head = temp->next;
          q->QueueSize--;
          free(temp->data);
          free(temp);
      }
      q->head = NULL;
      q->tail = NULL;
    }
    /***************************************
     *fuction  :获得队列数据个数
     **************************************/
    int GetQueueSize(STQueue *q)
    {
        return q->QueueSize;

  最后就是我们的测试代码:
   #include "Queue.h"

    /***************************************
     *fuction  :测试函数
     **************************************/
    int main(void)
    {
        int val;
        STQueue q;
        QueueInit(&q, sizeof(int));
        for(val = 0; val < 10; val++)
        {
            QueueIn(&q, &val);
            printf("Data: %d enter Quene.\n", val + 1);
        }
        printf("\n");
        GetQueueUnit(&q, &val);
        printf("The value that is at the front of the queue is %d\n\n", val + 1);
        while(GetQueueSize(&q) > 0)
        {
            QueueOut(&q, &val);
            printf("Data: %d exit Quene.\n", val + 1);
        }
        printf("欢迎大家关注,转发,点赞,评论");
        return 0;

  尾言
  文章都是手打原创,每天最浅显的介绍C语言、C++,知识,喜欢我的文章就关注一波吧,每天带你学习C/C++不同的知识,也可以看到最新更新和之前发表的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的视频教程
  《C语言51课视频教程合集》《C++45课视频教程》
  通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥数据结构与程序设计 c语言描述-C语言数据结构硬核玩法?看这文章,C语言奇怪的知识又增加了,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。
  如果你学到知识了,欢迎大家关注,转发,点赞,评论,这真的对我很重要哦!

  文章来源:http://www.toutiao.com/a6827069373648208395/