Пример #1
0
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;
  }
}  
Пример #2
0
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;
}