搜索
bottom↓
回复: 1

C/C++下一个队列函数,怎么移植到C#?

[复制链接]

出0入0汤圆

发表于 2010-11-11 22:35:11 | 显示全部楼层 |阅读模式
struct __SLink
{
  struct __SLink *Next;
};
typedef struct __SLink __TLink;

typedef struct
{
  __TLink  *Object;
}__TQueue;

typedef struct
{
__TLink  Link;
__TQueue *Queue;
}__TObject;

static inline void obj_put(__TQueue *Queue,__TObject *Object)    //一般节点入队列
{
     __TObject *PrevIterator,*Iterator;                //上一个节点,当前节点

     if(Object->Queue)                         //如果节点已经在队列里,返回(不能重复入队列)
       return;

     PrevIterator=(__TObject *)Queue;                 //把队列地址当做上一个节点
     Iterator=(__TObject *)PrevIterator->Link.Next;       //读取当前节点,即队列里的第一个节点

     while(1)
     {
         if(Iterator == NULL)                     //如果Iterator为NULL,PrevIterator是最后一个节点,新节点插入在PrevIterator和Iterator(NULL)之间
         {
             break;
         }

         PrevIterator=(__TObject *)Iterator;               //向后移动一个节点
         Iterator=(__TObject *)Iterator->Link.Next;
      }

     PrevIterator->Link.Next=(__TLink *)Object;      //新节点插入在PrevIterator和NULL之间
     Object->Link.Next=NULL;
     Object->Queue=Queue;                      //新节点关联到队列Queue
}

//取出首节点
//内核函数
static inline void *  obj_get(__TQueue * Queue)
{
     __TObject *Iterator;
     Iterator=(__TObject *)Queue->Object;        //读取队列里的第一个节点
     if(Iterator!=NULL)                     //如果节点非空
     {
         Queue->Object=Iterator->Link.Next;  //队列指向当前节点后面一个节点
                 Iterator->Queue=NULL;               //当前节点脱离队列
                 Iterator->Link.Next=NULL;
     }
     return Iterator;
}

//删除节点
//内核函数
static inline void * obj_remove(__TQueue * Queue,__TObject *Object)  //从队列中删除一个节点(用于一般队列)
{
      __TObject *PrevIterator,*Iterator,*NextIterator;       //上一个节点,当前节点,下一个节点

      if(Object->Queue!=Queue)   //如果被删除节点没有关联到队列Queue(即Object不在Queue队列里)
      {
          return  NULL;
       }

       PrevIterator=(__TObject *)Queue;               //把队列地址当做上一个节点
       Iterator=(__TObject *)PrevIterator->Link.Next;   //读取当前节点,即队列里的第一个节点

       if(Iterator==NULL)        //队列为空,返回
       {
      return NULL;
       }

       NextIterator=(__TObject *)Iterator->Link.Next;    //读取下一个节点

       while(1)
       {
      if(Iterator==(__TObject *)Object)            //如果当前节点就是被删除节点
      {
          PrevIterator->Link.Next=(__TLink *)NextIterator;   // PrevIterator,NextIterator之间跳过当前节点
              Iterator->Queue=NULL;               //当前节点脱离队列
              Iterator->Link.Next=NULL;

          return Iterator;
      }

          if(NextIterator==NULL)      //如果NextIterator为空,即Iterator是最后一个节点,返回NULL
      {
            return NULL;
      }

       PrevIterator=Iterator;      //向后移动一个节点
       Iterator=NextIterator;
       NextIterator=(__TObject *)NextIterator->Link.Next;
      }

      // return NULL;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-11-26 08:57:52 | 显示全部楼层
System.Collections.Generic
Queue(T)类


System.Collections
Queue
何必需要自己移植C++的呢

系统提供的多好用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 14:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表