C语言简单队列

把以前写的东西贴在这里方便回故

以前我们建立一个队列.一开始接口不太友好.后来我们进行了优化.

Queue abc;  //声明队列结构体
crteate_Queue(abc); //创建队列
abc.push(int num);  //压入
int abc = abc.pop();//弹出

大致是这样子的.但是我们发现,这个队列有一个非常明显的缺陷.那就是,只能push进int型的变量,如果我们想要压进去其它类型.甚至是自定义类型.那么,我们就得对这个队列程序进行大刀阔斧似的改变.几乎所有的代码都改了,但是代码的逻辑却是一模一样,让人"捉急",不甘心,逻辑一模一样的代码,每次改变类型,我们需要去修改大部分代码才能使用,这样的程序是我们不想要的.所以我们需要一个通用的队列,它的目标是:

1.我们不需要去修改队列的代码.

2.它能push进任何类型

如果在C++,有模板类,可以很容易解决这个问题,但是在C里,我们只好想一个巧妙的办法来完成这个任务.

首先,我们只考虑队列,它的数据结构是这样的:

typedef struct _Node{
    struct _Queue * prev;
    struct _Queue * next;
}Node;
typedef Node* Node_Pion; //它的指针类型

然后是它的行为:

Node_Pion node_push(Node_Pion tail, Node_Pion node) //给我一个尾指针,一个结点.
{
    if (!node)  return NULL;
    if(tail)
        tail-next = node;
    node->prev = tail;
    tail = node;
    return tail;
}
Node_Pion node_pop (Node_Pion head)  //给我一个头指针.
{
   if(head-next)
       head->next->prev = NULL;
   head = head->next;
   return head;
}

从上面看出,这里和昨天并无什么 太大的区别.

下面是关键..

然后我们对这个队列进行封装:

typedef struct _Queue{
  Node_Pion HEAD; //它的头
  Node_Pion TAIL; //它的尾
}Queue;
typedef Queue* Queue_pion;
//它的行为
//构造
Queue_pion ctreate_queue(Queue_pion queue){
  if(!queue)
    queue = (Queue_pion)malloc(sizeof(_Queue));
    queue->HEAD = NULL;
    queue->TAIL = NULL;
return queue;
}
//析构
void delete_queue(Queue_pion queue){
    free(queue);
}
//压入
void push (Queue_pion queue, void* node){
  if((!queue->HEAD) && (!queue->TAIL))  //如果头尾有一个等于NULL.队列无效
      queue->TAIL = queue->HEAD = node_push(queue->TAIL, (Node_Pion)node);  //重新建立队列
   else
      queue->TAIL = node_push(queue->TAIL, (Node_Pion)node);   //给我一个尾指针,一个结点.
}
//弹出
void* pop  (Queue_pion queue){
  Node_Pion p = queue->HEAD;
  queue->HEAD = node_pop(queue->HEAD);
  return (void*)p;
}

这样,我们在使用时就比较好玩了

比如,我们有一个自定义的类型

struct abc{
    int num;
    int val;
};

然后,我们在代码里,构造一个队列:

Queue *abc = ctreate_queue(Queue_pion queue);

typedef struct _abc{
    Node node;  //我们在这个自定义结构里的第一个元素,加上我们的结点结构的一个元素.
    int num;
    int val;
}*abc;  还是起个好用的名字吧.

 abc p=(abc)malloc(sizeof(_abc)); // 申请一个新对象

  push(bgd,p);   //这样就可以压入队列了

  pop(bgd) ;   //这样就可以弹出了,更简单

时间: 2024-08-10 01:57:54

C语言简单队列的相关文章

C语言简单strcat和strcmp的实现

对于C标准库中的字符串处理函数应该平常用的比较多:简单实现strcat和strcmp _strcpy: 1 char *_strcpy(char *dest, char *src) 2 { 3 char *buf = dest; 4 while((*dest++ = *src++)) 5 ; 6 return buf; 7 } _strcmp: 1 int _strcmp(char *str1, char *str2) 2 { 3 if(str1 == NULL || str2 == NULL)

c 语言简单计算器源码

//  main.c //  计算器 //  Created by qianfeng on 14-7-15. //  Copyright (c) 2014年 ___FGY___. All rights reserved. //iPhone自带计算器不够好,由于你技术出众,你被安排去开发一款iOS新式计算器. /*项目经理认为计算器第一版要支持表达式求值,所以要求如下: 输入任意表达式 求出他的值(支持负数,不支持小数) 这里支持6种表达式 () * / + - ()优先级最高, * /优先级其次

Perl语言——简单说明

Perl语言——简单说明 一.简单说明 Perl语言全称:实用摘录与报表语言|病态折中式垃圾列表器.Perl名称并不是缩写词,而是个溯写字. Perl语言历史:Larry Wall(拉里·沃尔)20世纪80年代中期 适合处理的任务:约有90%和文字处理有关,10%与其它事物有关的问题. 在MAC OSX系统上面默认已经自带提供了Perl编译器,可以把终端打开后,通过perl -v指令查看当前安装的Perl版本. 经测试发现是5.18 二.第一个Perl程序 要求:输出hello Word wen

python基于mysql实现的简单队列以及跨进程锁

在我们做多进程应用开发的过程中,难免会遇到多个进程访问同一个资源(临界资源)的状况,必须通过加一个全局性的锁,来实现资源的同步访问(同一时间只能有一个进程访问资源). 举个例子: 假设我们用mysql来实现一个任务队列,实现的过程如下: 1. 在Mysql中创建Job表,用于储存队列任务,如下: create table jobs( id auto_increment not null primary key, message text not null, job_status not null

c语言简单实现telnet客户端

c语言简单实现telnet客户端 http://blog.csdn.net/haiwenchen/article/details/69944118

C语言栈队列实现二-十/二-八进制转换

C语言栈队列实现二-十/二-八进制转换 2015-04-05 Lover雪儿 1 //利用栈来求取二进制数的十进制与八进制的结果 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 6 #define STACK_INIT_SIZE 20 //初始栈大小 7 #define STACK_INCREMENT 10 //扩充栈时每次增加的内存 8 9 typedef char ElemType;

c语言简单实现word count功能

c语言简单实现word count功能 一:源码参考  参考地址:https://home.cnblogs.com/u/sunbuqiao/ 二:阅读               代码主要思路是先选定文件,将文件中的字符读入数组,利用for循环分别统计字符数.单词数.空格数.行数.实现过程使用了fseek函数判断指针用于判断数据总长度,根据转移字符判断行数. 三:代码上传                    地址:https://github.com/meinumber1

C语言 链队列基本操作

C语言链队列基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h> /* C语言链队列基本操作 2014年7月11日10:11:41 */ typedef int qType; typedef struct node { qType data; struct node *pNext; }Node,*pNode; typedef struct queue { pNode front; pNode re

Rabbit简单队列模式

1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 2 <modelV