void list_rm_dup(list l){ int seen_values_size = 100; int seen_nodes = 0; int seen_values[seen_values_size]; int val; int i; bool found; list_node node; node = l->head; while(node != NULL){ val = node->value; found = false; for(i = 0; i < seen_nodes; i++){ if(seen_values[i] == val){ list_rm_node(l, node); found = true; break; } } if(found == false){ seen_values[seen_nodes] = val; seen_nodes++; } node = node->next; } }
int test_linked_list() { int i,j, result = 0; List_Node *test_node1 = NULL; List_Node *test_node2 = NULL; List_Node *test_node3 = NULL; List_Node *pTrack[5]; void* pArr[6]; List_Head *test_list1 = list_new(); List_Head *test_list2 = list_new(); test_msg_start("Test Linked List Creation"); if(test_list1 == NULL) result++; test_msg_end(result); test_msg_start("Test Linked List Empty Length - Using Variable"); if(test_list1->count != 0) result++; test_msg_end(result); test_msg_start("Test Linked List Empty Length - Using Length Function"); if(list_len(test_list1) != 0 ) result++; test_msg_end(result); test_msg_start("Test Linked List - Adding Node To Empty List"); if(list_ins_tail(test_list1) == NULL) result++; test_msg_end(result); test_msg_start("Test Linked List - Adding Node To Non-Empty List"); if(list_ins_tail(test_list1) == NULL) result++; test_msg_end(result); test_msg_start("Test Linked List - Clearing List With More Than One Node"); list_clear(test_list1); if(test_list1->count != 0) result++; if(list_len(test_list1) != 0 ) result++; test_msg_end(result); test_msg_start("Test Linked List - Clearing List With No Nodes"); list_clear(test_list1); if(test_list1->count != 0) result++; if(list_len(test_list1) != 0 ) result++; test_msg_end(result); test_msg_start("Test Linked List End - No Nodes"); list_clear(test_list1); if(list_tail(test_list1) != NULL) result++; test_msg_end(result); test_msg_start("Test Linked List End - One Node Only"); list_clear(test_list1); test_node1 = list_ins_tail(test_list1); if(test_node1 == NULL) result++; if(list_tail(test_list1) != test_node1) result++; test_msg_end(result); test_msg_start("Test Linked List End - More Than One Node"); list_clear(test_list1); list_ins_tail(test_list1); test_node1 = list_ins_tail(test_list1); if(test_node1 == NULL) result++; if(list_tail(test_list1) != test_node1) result++; test_msg_end(result); test_msg_start("Test Linked List - Removing Node From List With More Than One Node"); list_clear(test_list1); test_node1 = list_ins_tail(test_list1); test_node2 = list_ins_head(test_list1); list_rm_node(test_list1, test_node1); if(test_list1->pNext != test_node2) result++; test_msg_end(result); test_msg_start("Test Linked List - Removing Node From Empty List"); list_clear(test_list1); test_node1 = (List_Node*)&test_list1; /* pointer points to known bad location */ /* should not crash but return gracefully */ if(list_rm_node(test_list1, test_node1) != -1) result++; test_msg_end(result); test_msg_start("Test Linked List - Inserting Node After"); list_clear(test_list1); test_node1 = NULL; test_node2 = NULL; test_node1 = list_ins_tail(test_list1); test_node2 = list_ins_after(test_list1, test_node1); /* test beginning */ if(test_list1->pNext != test_node1) result++; /*...and end nodes. */ if(list_tail(test_list1) != test_node2) result++; /* end node next should be null */ if(list_tail(test_list1)->pNext != NULL) result++; test_msg_end(result); test_msg_start("Test Linked List - Inserting Node Before"); list_clear(test_list1); test_node1 = NULL; test_node2 = NULL; test_node1 = list_ins_head(test_list1); test_node2 = list_ins_before(test_list1, test_node1); /* test beginning */ if(test_list1->pNext != test_node2) result++; /*...and end nodes. */ if(list_tail(test_list1) != test_node1) result++; /* end node next should be null */ if(list_tail(test_list1)->pNext != NULL) result++; test_msg_end(result); test_msg_start("Test Linked List - Test Lengths"); list_clear(test_list1); if(list_len(test_list1) != 0) result++; /* adding nodes using each function */ list_ins_head(test_list1); if(list_len(test_list1) != 1) result++; list_ins_tail(test_list1); if(list_len(test_list1) != 2) result++; list_ins_before(test_list1, list_tail(test_list1)); if(list_len(test_list1) != 3) result++; list_ins_after(test_list1, list_tail(test_list1)); if(list_len(test_list1) != 4) result++; test_msg_end(result); test_msg_start("Test Linked List - Previous Node Check"); list_clear(test_list1); test_node1 = NULL; test_node2 = NULL; if(list_prev_node(test_list1, NULL) != NULL) result++; if(list_prev_node(NULL, test_list1->pNext) != NULL) result++; if(list_prev_node(NULL, test_node1 + 1000) != NULL) result++; test_node1 = list_ins_head(test_list1); if(list_prev_node(test_list1, test_list1->pNext) != NULL) result++; test_node2 = list_ins_head(test_list1); if(list_prev_node(test_list1, test_node1) != test_node2) result++; if(list_prev_node(test_list1, test_node2) != NULL) result++; test_msg_end(result); test_msg_start("Test Linked List - Removing Nodes By Address"); /* removing nodes from various places */ list_clear(test_list1); test_node1 = NULL; test_node2 = NULL; if(list_rm_node(NULL, test_list1->pNext)!= -1) result++; if(list_rm_node(test_list1, NULL) != -1) result++; test_node1 = list_ins_head(test_list1); test_node2 = list_ins_head(test_list1); list_rm_node(test_list1, test_list1->pNext); if(list_len(test_list1) != 1) result++; test_node1 = list_tail(test_list1); list_rm_node(test_list1, test_node1); if(list_len(test_list1) != 0) result++; if(list_rm_node(test_list1, list_tail(test_list1)) != -1) result++; test_msg_end(result); test_msg_start("Test Linked List - Removing Nodes After Address"); list_clear(test_list1); test_node1 = NULL; test_node2 = NULL; test_node1 = list_ins_tail(test_list1); test_node2 = list_ins_tail(test_list1); if(list_rm_next(test_list1, test_node1) != 1) result++; test_msg_end(result); test_msg_start("Test Linked List - Removing Nodes Before Address"); list_clear(test_list1); test_node1 = NULL; test_node2 = NULL; if(list_rm_before(test_list1, NULL) != -1) result++; if(list_rm_before(NULL, NULL) != -1) result++; if(list_rm_before(test_list1 + 1000, NULL) != -1) result++; test_node1 = list_ins_tail(test_list1); test_node2 = list_ins_tail(test_list1); if(list_rm_before(test_list1, test_node2 + 1000) != -1) result++; if(list_rm_before(test_list1, test_node2) != 1) result++; test_msg_end(result); test_msg_start("Test Linked List - Copying List"); list_clear(test_list1); list_clear(test_list2); test_node1 = list_ins_tail(test_list1); test_node1->pData = &result; test_node2 = list_ins_tail(test_list1); if(list_copy(test_list2, test_list1) != 0) result++; if(test_list1->pNext == test_list2->pNext) result++; if(test_list1->count != 2) result++; if(test_list2->count != 2) result++; if(test_list1->pNext->pData != test_list2->pNext->pData) result++; test_msg_end(result); test_msg_start("Test Linked List - Copying Empty List"); list_clear(test_list1); list_clear(test_list2); if(list_copy(test_list2, test_list1) != 0) result++; if(test_list1->pNext != NULL) result++; if(test_list2->pNext != NULL) result++; if(test_list1->count != 0) result++; if(test_list2->count != 0) result++; test_msg_end(result); test_msg_start("Test Linked List - Get Node Address By Node Number - First Node"); list_clear(test_list1); test_node1 = list_ins_head(test_list1); test_node2 = list_ins_head(test_list1); test_node3 = list_get_num(test_list1, 1); if(test_node3 != test_node2) result++; test_msg_end(result); test_msg_start("Test Linked List - Get Node Address By Node Number - Middle Node"); list_clear(test_list1); list_ins_tail(test_list1); list_ins_tail(test_list1); list_ins_tail(test_list1); list_ins_tail(test_list1); test_node2 = list_ins_tail(test_list1); list_ins_tail(test_list1); list_ins_tail(test_list1); list_ins_tail(test_list1); list_ins_tail(test_list1); test_node3 = list_get_num(test_list1, 5); if(test_node3 != test_node2) result++; test_msg_end(result); test_msg_start("Test Linked List - Get Node Address By Node Number - Last Node"); list_clear(test_list1); test_node1 = list_ins_tail(test_list1); test_node2 = list_ins_tail(test_list1); test_node3 = list_get_num(test_list1, 2); if(test_node3 != test_node2) result++; test_msg_end(result); test_msg_start("Test Linked List - Get Node Address By Node Number - Empty List"); list_clear(test_list1); test_node1 = list_get_num(test_list1, 1); if(test_node1 != NULL) result++; test_node1 = list_get_num(test_list1, 55); if(test_node1 != NULL) result++; test_msg_end(result); test_msg_start("Test Linked List - Swap Nodes In List"); list_clear(test_list1); test_node1 = list_ins_tail(test_list1); test_node2 = list_ins_tail(test_list1); test_node3 = list_ins_tail(test_list1); pTrack[1] = test_node1->pNext; pTrack[2] = test_node2->pNext; if(list_node_swap(test_node1, test_node2) != 0) result++; if(test_node1->pNext != pTrack[2]) result++; if(test_node2->pNext != pTrack[1]) result++; test_msg_end(result); test_msg_start("Test Linked List - List Reverse - Pointer Tracking"); list_clear(test_list1); for(i = 0; i < 5; i++) { pTrack[i] = list_ins_tail(test_list1); pTrack[i]->pData = &pTrack[i]->pData; } test_list1 = list_reverse(test_list1); for(i = 1, j = 4; i <= 4; i++, j--) { test_node1 = list_get_num(test_list1, i); if(test_node1->pData != pTrack[j]) result++; } test_msg_end(result); test_msg_start("Test Linked List - List Next Preprocessor"); list_clear(test_list1); list_clear(test_list2); test_node1 = NULL; test_node2 = NULL; test_node1 = list_ins_head(test_list1); test_node2 = list_ins_head(test_list1); if(list_next(test_node1) == test_node2) result++; test_msg_end(result); test_msg_start("Test Linked List - Default Payload"); list_clear(test_list1); test_node1 = NULL; test_node2 = NULL; test_node1 = list_ins_tail(test_list1); test_node2 = list_ins_tail(test_list1); if(test_node1->pData != NULL) result++; /* make data point to something and test again... */ test_node1->pData = test_node1; if(list_data(test_node1) != test_node1) result++; test_msg_end(result); test_msg_start("Test Linked List - List Is Head Preprocessor"); if(list_is_head(test_list1, test_node2) != 0) result++; if(list_is_head(test_list1, test_node1) != 1) result++; test_msg_end(result); test_msg_start("Test Linked List - List Is Tail Preprocessor"); if(list_is_tail(test_node2) != 1) result++; if(list_is_tail(test_node1) != 0) result++; test_msg_end(result); test_msg_start("Test Linked List - List Head Preprocessor"); if(list_head(test_list1) != test_node1) result++; test_msg_end(result); test_msg_start("Test Linked List - Append Lists - Pointer Tracking"); list_clear(test_list1); list_clear(test_list2); list_ins_tail(test_list1); list_ins_tail(test_list1); list_ins_tail(test_list1); pTrack[0] = list_ins_tail(test_list1); pTrack[1] = list_ins_tail(test_list2); list_ins_tail(test_list2); list_ins_tail(test_list2); list_append(test_list1, test_list2); if(test_list1->count != 7) result++; if(!list_search(test_list1, pTrack[0])) result++; if(!list_search(test_list1, pTrack[1])) result++; if(pTrack[0] != list_get_num(test_list1, 4)) result++; if(pTrack[1] != list_get_num(test_list1, 5)) result++; test_msg_end(result); test_msg_start("Test Linked List - Create Data Array - Pointer Tracking"); list_clear(test_list1); pTrack[0] = list_ins_tail(test_list1); pTrack[0] = pTrack[0]->pData = &test_list1; pTrack[1] = list_ins_tail(test_list1); pTrack[1] = pTrack[1]->pData = &test_list2; pTrack[2] = list_ins_tail(test_list1); pTrack[2] = pTrack[2]->pData = &pTrack; pTrack[3] = list_ins_tail(test_list1); pTrack[3] = pTrack[3]->pData = &test_node1; pTrack[4] = list_ins_tail(test_list1); pTrack[4] = pTrack[4]->pData = &test_node2; pArr[5] = &test_list1; if(list_data_array(test_list1, pArr, 6) != 0) result++; if(pArr[0] != pTrack[0]) result++; if(pArr[1] != pTrack[1]) result++; if(pArr[2] != pTrack[2]) result++; if(pArr[3] != pTrack[3]) result++; if(pArr[4] != pTrack[4]) result++; if(pArr[5] != NULL) result++; test_msg_end(result); test_msg_start("Test Linked List - Create Node Array - Pointer Tracking"); list_clear(test_list1); pTrack[0] = list_ins_tail(test_list1); pTrack[1] = list_ins_tail(test_list1); pTrack[2] = list_ins_tail(test_list1); pTrack[3] = list_ins_tail(test_list1); pTrack[4] = list_ins_tail(test_list1); pArr[5] = &test_list1; if(list_node_array(test_list1, pArr, 6) != 0) result++; if(pArr[0] != pTrack[0]) result++; if(pArr[1] != pTrack[1]) result++; if(pArr[2] != pTrack[2]) result++; if(pArr[3] != pTrack[3]) result++; if(pArr[4] != pTrack[4]) result++; if(pArr[5] != NULL) result++; test_msg_end(result); test_msg_start("Test Linked List - Search List"); list_clear(test_list1); if(list_search(test_list1, test_node1) != 0) result++; test_node1 = list_ins_head(test_list1); if(list_search(test_list1, test_node1) != 1) result++; if(list_search(test_list1, test_node2) != 0) result++; if(list_search(test_list1, test_node3) != 0) result++; if(list_search(test_list1, NULL) != 0) result++; if(list_search(test_list1, (List_Node *)test_list1) != 0) result++; test_node2 = list_ins_head(test_list1); if(list_search(test_list1, test_node1) != 1) result++; if(list_search(test_list1, test_node2) != 1) result++; if(list_search(test_list1, test_node3) != 0) result++; if(list_search(test_list1, NULL) != 0) result++; if(list_search(test_list1, (List_Node *)test_list1) != 0) result++; list_clear(test_list1); if(list_search(test_list1, test_node1) != 0) result++; if(list_search(test_list1, test_node2) != 0) result++; if(list_search(test_list1, test_node3) != 0) result++; if(list_search(test_list1, NULL) != 0) result++; if(list_search(test_list1, (List_Node *)test_list1) != 0) result++; test_msg_end(result); return result; }