Added list structure.
Added a generic list structure. Some functions still need to be added.
This commit is contained in:
		
							parent
							
								
									167b450ce3
								
							
						
					
					
						commit
						f8cc4c0a2b
					
				|  | @ -0,0 +1,109 @@ | |||
| /*
 | ||||
| handystack.h | ||||
| Created By: | ||||
| 	Andrew Lalis (andrewlalisofficial@gmail.com) | ||||
| 	23 May 2017 | ||||
| This file is free to use, as long as the above comment remains in the file. | ||||
| Please contact the author regarding bugs and/or feature requests. | ||||
| */ | ||||
| 
 | ||||
| #ifdef LIST_TYPE | ||||
| 
 | ||||
| #include "templates.h" | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <assert.h> | ||||
| 
 | ||||
| /*
 | ||||
| Linked List: | ||||
| 	The linked list is a list of items of arbitrary value that are linked via a pointer to the next element, and the last element has a null pointer. The list does not try to maintain any particular order. | ||||
| */ | ||||
| 
 | ||||
| #define LIST_NODE TEMPLATE(LIST_TYPE,list) | ||||
| 
 | ||||
| /*
 | ||||
| List structure: | ||||
| 	Each list node will contain a piece of data, which is of an arbitrary type, and a pointer to the next element. | ||||
| */ | ||||
| 
 | ||||
| typedef struct LIST_NODE LIST_NODE; | ||||
| 
 | ||||
| struct LIST_NODE { | ||||
| 	LIST_TYPE data; | ||||
| 	LIST_NODE* next; | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
| Size of List: | ||||
| 	returns size of list. | ||||
| */ | ||||
| int TEMPLATE(size,LIST_NODE)(LIST_NODE* list){ | ||||
| 	int size = 0; | ||||
| 	while (list != NULL){ | ||||
| 		size++; | ||||
| 		list = list->next; | ||||
| 	} | ||||
| 	return size; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| New list: | ||||
| 	allocates memory for a new list item, and returns it. | ||||
| */ | ||||
| LIST_NODE* TEMPLATE(new,LIST_NODE)(LIST_TYPE data, LIST_NODE* next){ | ||||
| 	LIST_NODE *n = malloc(sizeof(LIST_NODE)); | ||||
| 	assert(n != NULL); | ||||
| 	n->data = data; | ||||
| 	n->next = next; | ||||
| 	return n; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| Free List: | ||||
| 	de-allocates memory for a list, and all next items recursively. | ||||
| */ | ||||
| void TEMPLATE(free,LIST_NODE)(LIST_NODE* list){ | ||||
| 	if (list->next != NULL){ | ||||
| 		TEMPLATE(free,LIST_NODE)(list->next); | ||||
| 	} | ||||
| 	free(list); | ||||
| 	list = NULL; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| Add to the list: | ||||
| 	Appends an item to the end of the list. | ||||
| */ | ||||
| void TEMPLATE(add,LIST_NODE)(LIST_TYPE data, LIST_NODE* list){ | ||||
| 	while (list->next != NULL){ | ||||
| 		list = list->next; | ||||
| 	} | ||||
| 	list->next = TEMPLATE(new,LIST_NODE)(data, NULL); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| Insert List; | ||||
| 	Inserts an item at the given index, so that the item can be retreived with the get function at that index. | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
| Get list item: | ||||
| 	Returns the item in a specific index of the list, or fails. | ||||
| */ | ||||
| LIST_TYPE TEMPLATE(get,LIST_NODE)(int index, LIST_NODE* list){ | ||||
| 	int i = 0; | ||||
| 	while (i < index){ | ||||
| 		if (list->next != NULL){ | ||||
| 			list = list->next; | ||||
| 		} else { | ||||
| 			printf("Index specified does not exist in list.\n"); | ||||
| 			exit(-1); | ||||
| 		} | ||||
| 		i++; | ||||
| 	} | ||||
| 	return list->data; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										14
									
								
								test.c
								
								
								
								
							
							
						
						
									
										14
									
								
								test.c
								
								
								
								
							|  | @ -7,6 +7,20 @@ int main(int argc, char* argv[]){ | |||
| 	#define STACK_TYPE double | ||||
| 	#include "source/handystack.h" | ||||
| 	double_stack s = new_double_stack(); | ||||
| 	push_double_stack(42.5, &s); | ||||
| 	print_double_stack(s); | ||||
| 	 | ||||
| 	#ifdef LIST_TYPE | ||||
| 	#undef LIST_TYPE | ||||
| 	#endif | ||||
| 	#define LIST_TYPE float | ||||
| 	#include "source/handylist.h" | ||||
| 	float_list* l = new_float_list(5.0, NULL); | ||||
| 	add_float_list(6.0, l); | ||||
| 	add_float_list(7.0, l); | ||||
| 	add_float_list(8.0, l); | ||||
| 	printf("%d\n", size_float_list(l)); | ||||
| 	printf("%f\n", get_float_list(3, l)); | ||||
| 	free_float_list(l); | ||||
| 	 | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue