Esempio n. 1
0
 // удаляет узлы из списка, начина с from, заканчивая to (включительно),
 // возвращает указатель на следующий за to узел
 // удаляет связанные данные
 // O(n)
 ListNode* listEraseRange(ListNode** list, ListNode* from, ListNode* to) {
     ListNode* next = (to->next != from)? to->next: NULL;
     ListNode* p = from;
     do {
         p = listErase(list, p);
     } while (p != next);
     return next;
 }
Esempio n. 2
0
int Graph::MaxFlow(int s, int t) 
{    
   flownode *L; 
   flownode *itr; 
   int i, u, oldheight; 
   //构造每个结点的Neightbour list; 
   for(u = 0; u < V; ++u) 
   { 
      N[u] = new flownode; 
      N[u]->next = NULL;       
   } 
   for(u = 0; u < V; ++u) 
   { 
      for(i = 0; i < u; ++i) 
         if( c[u][i] || c[i][u] ) 
         { 
            listInsert(N[u],i); 
            listInsert(N[i],u); 
         } 
   } 
   //构造L 
   L = new flownode; 
   L ->next = NULL; 
   for( i = 0; i < V; ++i) 
   { 
      if(i == s || i == t) continue; 
      listInsert(L,i); 
   } 
   //初始化preflow 
   InitializePreflow(s); 
   // 
    
   for(itr = L; itr->next; itr = itr->next ) 
   { 
      u = itr->next->adjnum; 
      oldheight = h[u]; 
      DischargePreflow(u); 
      if(h[u] > oldheight) 
      { 
         listErase(itr); 
         listInsert(L,u); 
         itr = L; 
      } 
   } 
   listDestroy(L); 
   maxflow = 0; 
   for( itr = N[s]->next; itr; itr = itr->next) 
   { 
      if(f[s][itr->adjnum]  ) 
         maxflow += f[s][itr->adjnum]; 
   } 
   neighborDestroy(); 
   return maxflow; 
} 
Esempio n. 3
0
 //удаляет узел в начале списка, возвращает указатель на следующий узел
 //O(1)
ListNode* listPopFront(ListNode** list) {
    *list = listErase(list, *list);
    return *list;
 }
Esempio n. 4
0
int main(void)
{
    ListNode* testList = NULL;
    ListNode* node = listPushBack(&testList);
    node->data = allocData(1);
    printf("test 1\nsize = %u, last id = %i\n", listSize(&testList), getId(listBack(&testList)->data));
    //--------
    for(int i = 0; i < 100; ++i) {
        node = listPushBack(&testList); //->data = allocData(i);
        node->data = allocData(i);
    }
    printf("test 2\nsize = %u, last id = %i\n", listSize(&testList), getId(listBack(&testList)->data));
    //--------
    for(int i = 0; i < 100; ++i) {
        node = listPushFront(&testList);
        node->data = allocData(i);
    }
    printf("test 3\nsize = %u, first id = %i\n", listSize(&testList), getId(listFront(&testList)->data));
    //--------
    for(int i = 0; i < 100; ++i) {
        node = listInsert(listNext(&testList, 50));
        node->data = allocData(i);
    }
    printf("test 4\nsize = %u, id(100) = %i\n", listSize(&testList), getId(listNext(&testList, 100)->data));
    //--------
    listFree(&testList);
    if(listEmpty(&testList))
        printf("test4: list empty\n");
    //--------
    for(int i = 0; i < 100; ++i) {
        node = listPushFront(&testList);
        node->data = allocData(i);
    }
    listErase(&testList, listFront(&testList));
    printf("test 5\nsize = %u, id(0) = %i\n", listSize(&testList), getId(listFront(&testList)->data));
    listErase(&testList, listFront(&testList));
    //--------------
    listEraseRange(&testList, listNext(testList, 10), listNext(testList, 20));
    node = testList;
    for(int i = 0; i < 30; ++i) {
        printf("id(%d) = %d\n", i, ((ListData*)(node->data))->id);
        node = node->next;
    }
    printf("test 6\nsize = %u, id(10) = %i\n", listSize(&testList), getId(listFront(&testList)->data));
    //--------------
    listPopBack(&testList);
    printf("test 7\nsize = %u, id(back) = %i\n", listSize(&testList), getId(listBack(&testList)->data));
    //--------------
    listPopFront(&testList);
    printf("test 8\nsize = %u, id(front) = %i\n", listSize(&testList), getId(listFront(&testList)->data));
    //--------------
    listResize(&testList, 10);
    printf("test 9\nsize = %u, id(back) = %i\n", listSize(&testList), getId(listBack(&testList)->data));
    //--------------
    listResize(&testList, 20);
    node = testList;
    for(int i = 0; i < 20; ++i) {
        node->data = allocData(i);
        node = node->next;
    }
    printf("test 10\nsize = %u, id(back) = %i\n", listSize(&testList), getId(listBack(&testList)->data));
    return 0;
}
Esempio n. 5
0
  //удаляет узел в конце списка, возвращает указатель на него
  //O(1)
 void listPopBack(ListNode** list) {
     listErase(list, (*list)->prev);
  }