C_SHARP 发表于 2010-11-11 22:35:11

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

struct __SLink
{
struct __SLink *Next;
};
typedef struct __SLink __TLink;

typedef struct
{
__TLink*Object;
}__TQueue;

typedef struct
{
__TLinkLink;
__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队列里)
      {
          returnNULL;
       }

       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;
}

yajira 发表于 2010-11-26 08:57:52

System.Collections.Generic
Queue(T)类


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

系统提供的多好用
页: [1]
查看完整版本: C/C++下一个队列函数,怎么移植到C#?