Advertisement
Guest User

Untitled

a guest
Jan 25th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.14 KB | None | 0 0
  1. /* Init a doubly linked list. You need to call this
  2.  * to every declared dllist before to perform any
  3.  * other action on it. Calling this will an already
  4.  * initialized dllist is undefined behavior.
  5.  */
  6. void init (dlist *tdlist) /*HEADER*/
  7. {
  8.     tdlist->fist = tdlist->last = -1;
  9.     tdlist->n=0;
  10. }
  11.  
  12.  
  13. /* This function will add a node to your linked list
  14.  * pointer by *list
  15.  */
  16. void add (dlist *tdlist, int tnode) /*HEADER*/
  17. {
  18.     self.jects[tnode].next = -1;
  19.     if (tdlist->n == 0) {
  20.         tdlist->fist = tdlist->last = tnode;
  21.         self.jects[tnode].prev = -1;
  22.     } else {
  23.         self.jects[tdlist->last].next = tnode;
  24.         self.jects[tnode].prev = tdlist->last;
  25.         tdlist->last = tnode;
  26.     }
  27.     tdlist->n++;
  28. }
  29.  
  30.  
  31. /* This function will unlink a node from
  32.  * your dllist and free its memory.
  33.  *
  34.  * If you call this with a NULL node it will returns
  35.  * ERROR, defined as -1. If you call it with a empty
  36.  * list it will returns BADCALL defined as (ERROR -1)
  37.  */
  38. void del (dlist *tdlist, int tnode) /*HEADER*/
  39. {
  40.     if (tdlist->n == 0)
  41.     {
  42.                 deb::lcroak("dlist::del( %i );error;\n",tnode); //DEBUG!!!
  43.     }
  44.  
  45.     else if (tdlist->n == 1)
  46.     {
  47.         tdlist->fist = tdlist->last = -1;
  48.     }
  49.  
  50.     else if (tnode == tdlist->fist)
  51.     {
  52.         tdlist->fist = self.jects[tdlist->fist].next;
  53.         self.jects[tdlist->fist].prev=-1;
  54.     }
  55.     else if (tnode == tdlist->last)
  56.     {
  57.         tdlist->last = self.jects[tdlist->last].prev;
  58.         self.jects[tdlist->last].next=-1;
  59.     }
  60.     else
  61.     {
  62.         self.jects[self.jects[tnode].next].prev = self.jects[tnode].prev;
  63.         self.jects[self.jects[tnode].prev].next = self.jects[tnode].next;
  64.     }  
  65.     tdlist->n--;
  66.     return;
  67. }
  68. /*
  69. #------------------------------------------------------
  70. # next
  71. #------------------------------------------------------*/
  72. int next (int tnode) /*HEADER*/
  73. {
  74.     return( self.jects[tnode].next );
  75. }
  76.  
  77. /*
  78. #------------------------------------------------------
  79. # getNode
  80. #------------------------------------------------------*/
  81. node *getNode (int tnode) /*HEADER*/
  82. {
  83.     return( &self.jects[tnode] );
  84. }
  85.  
  86. /*
  87. #------------------------------------------------------
  88. # addFree
  89. #------------------------------------------------------*/
  90. int addFree () /*HEADER*/
  91. {
  92.     int tnode;
  93.     if (self.freeNodes.n > 0)
  94.     {
  95.         tnode=self.freeNodes.fist;
  96.         del(&self.freeNodes,tnode);
  97.     }
  98.     else
  99.     {
  100.         tnode=self.nodeNum;
  101.         if (tnode >= self.nodeMax)
  102.         {
  103.               deb::lcroak("dlist::addNew( );error;\n"); //DEBUG!!!
  104.         }
  105.         self.nodeNum++;
  106.     }
  107.     return( tnode );
  108. }
  109. /*
  110. #------------------------------------------------------
  111. # addNew
  112. #------------------------------------------------------*/
  113. int addNew (dlist *tdlist) /*HEADER*/
  114. {
  115.     int tnode = addFree();
  116.     add(tdlist,tnode);
  117.  
  118.     return( tnode );
  119. }
  120.  
  121.  
  122. /*
  123. #------------------------------------------------------
  124. # addDlist
  125. #------------------------------------------------------*/
  126. void addDlist (dlist *tdlist1, dlist *tdlist2) /*HEADER*/
  127. {
  128.     if (tdlist2->n == 0)
  129.     {
  130.             return;
  131.     }
  132.  
  133.     if (tdlist1->n == 0)
  134.     {
  135.         *tdlist1 = *tdlist2;
  136.     } else
  137.     {
  138.            self.jects[tdlist1->last].next = tdlist2->fist;
  139.            self.jects[tdlist2->fist].prev = tdlist1->last;
  140.            tdlist1->last=tdlist2->last;
  141.  
  142.            tdlist1->n += tdlist2->n;
  143.     }
  144.  
  145.     init( tdlist2 );
  146.  
  147.         return;
  148. }
  149.  
  150. /*
  151. #------------------------------------------------------
  152. # swapNodes
  153. #------------------------------------------------------*/
  154. void swapNodes (dlist *tdlist, int tnode1, int tnode2) /*HEADER*/
  155. {
  156.  
  157.     if (tnode1 == tdlist->fist)
  158.     {
  159.          tdlist->fist=tnode2;
  160.     } else if (tnode2 == tdlist->fist)
  161.     {
  162.          tdlist->fist=tnode1;
  163.     }
  164.  
  165.     if (tnode1 == tdlist->last)
  166.     {
  167.          tdlist->last=tnode2;
  168.     } else if (tnode2 == tdlist->last)
  169.     {
  170.          tdlist->last=tnode1;
  171.     }
  172.  
  173.         int next =self.jects[tnode1].next;
  174.         int prev =self.jects[tnode1].prev;
  175.         self.jects[tnode1].next=self.jects[tnode2].next;
  176.         self.jects[tnode1].prev=self.jects[tnode2].prev;
  177.         self.jects[tnode2].next=next;
  178.         self.jects[tnode2].prev=prev;
  179.  
  180. }
  181. /*
  182. #------------------------------------------------------*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement