// удаляет узлы из списка, начина с 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; }
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; }
//удаляет узел в начале списка, возвращает указатель на следующий узел //O(1) ListNode* listPopFront(ListNode** list) { *list = listErase(list, *list); return *list; }
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; }
//удаляет узел в конце списка, возвращает указатель на него //O(1) void listPopBack(ListNode** list) { listErase(list, (*list)->prev); }