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