List listCopy(List source) { List copy = listInit(); while ((source = listNext(source))) { listPushBack(copy, source->v); } return copy; }
//изменяет размер списка до N. Если N меньше текущего размера S, удаляет в конце S - N узлов, //если N > S, добавляем в конце N - S узлов //O(n) void listResize(ListNode** list, size_t n) { size_t s = listSize(list); if(s <= n) { for(size_t i = 0; i < n - s; ++i) { listPushBack(list); } } else { for(size_t i = 0; i < s - n; ++i) { listPopBack(list); } } }
void readTitleFile(sLinkedList* list, FILE* file) { char str[10]; if(feof(file)) { State = 0; return; } fscanf(file, "%s\n", str); if(strcmp(str, "#end") == 0) { State = 0; return; } int x = 0; int y = 0; if(str[0] != '#') { sscanf(str, "%d,%d", &x, &y); point* p = createPoint(x, y); listPushBack(list, (void*)p); free(p); } }
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; }