Arrays and linked list
							parent
							
								
									46f0946e62
								
							
						
					
					
						commit
						a6d1d6ce77
					
				| @ -0,0 +1,10 @@ | |||||||
|  | P=array_exp | ||||||
|  | OBJECTS= | ||||||
|  | CFLAGS = -g -Wall -O3  | ||||||
|  | LDLIBS= | ||||||
|  | CC=gcc | ||||||
|  | 
 | ||||||
|  | $(P): $(OBJECTS) | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm -f *.o $(P) | ||||||
| @ -0,0 +1,23 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | #define ARRLEN 10 | ||||||
|  | 
 | ||||||
|  | int my_array[ARRLEN]; | ||||||
|  | 
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     size_t i, j; // guaranteed to be wide enough to address all memory locations. Better than unsigned int.
 | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < ARRLEN; i++) | ||||||
|  |     { | ||||||
|  |         my_array[i] = i + 100; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Output each array element's values
 | ||||||
|  |     for (j = 0; j < ARRLEN; j++) | ||||||
|  |     { | ||||||
|  |         printf("Element[%zu] = %d\n", j, my_array[j]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
											
												Binary file not shown.
											
										
									
								| @ -0,0 +1,14 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | typedef unsigned char byte; | ||||||
|  | 
 | ||||||
|  | byte a = 0x41; // A
 | ||||||
|  | byte b = 0x61; // a
 | ||||||
|  | 
 | ||||||
|  | int main(int argc, char const *argv[]) | ||||||
|  | { | ||||||
|  |     byte c = b - a; | ||||||
|  |     printf("The value of a - b is %d\n", c); | ||||||
|  |     printf("The hex value of c is: 0x%02x\n", c); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| @ -0,0 +1,12 @@ | |||||||
|  | .PHONY: clean | ||||||
|  | P=linked_list | ||||||
|  | OBJECTS= linked_list.o | ||||||
|  | CFLAGS = -g -Wall -O3 | ||||||
|  | LDLIBS='' | ||||||
|  | CC=gcc | ||||||
|  | 
 | ||||||
|  | $(P): $(OBJECTS) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm -f *.o $(P) | ||||||
| @ -0,0 +1,162 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | 
 | ||||||
|  | /*This is a doubly linked list*/ | ||||||
|  | 
 | ||||||
|  | /*Struct to make it easy*/ | ||||||
|  | typedef struct Node | ||||||
|  | { | ||||||
|  |     /* data */ | ||||||
|  |     int data; | ||||||
|  |     struct Node *next;     // Pointer to the next element
 | ||||||
|  |     struct Node *previous; // Pointer to the previous element
 | ||||||
|  | } Node; | ||||||
|  | 
 | ||||||
|  | /* 
 | ||||||
|  |     **pheadNode should be interpreted as first obtain pointer to Node. Then by dereferencing that pointer you | ||||||
|  |     are able to set the value at that address. This is why we use the & address of operator. It is saying  | ||||||
|  |     Provide the address of the pointer variable. Use that to obtain a pointer to that address location, then | ||||||
|  |     derefence that pointer to assign a value to it. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | void insert_at_beginning(Node **pheadNode, int value); | ||||||
|  | void insert_at_end(Node **pheadNode, int value); | ||||||
|  | 
 | ||||||
|  | void print_list(Node *headNode); | ||||||
|  | void print_list_backwards(Node *headNode); | ||||||
|  | 
 | ||||||
|  | void free_list(Node *headNode); | ||||||
|  | 
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     printf("Just so you know a Node in our linked list is %lu bytes\n", sizeof(Node)); | ||||||
|  |     /*Sometimes in a doubly linked list the last node is also stored*/ | ||||||
|  |     Node *head = NULL; // Pointers to the front of the list
 | ||||||
|  | 
 | ||||||
|  |     printf("Inserting a node at the beginning of the list.\n"); | ||||||
|  |     insert_at_beginning(&head, 5); // Sets data at *head to 5
 | ||||||
|  |     print_list(head); | ||||||
|  | 
 | ||||||
|  |     printf("Insert a node at the beginning, then print the list backwards.\n"); | ||||||
|  |     insert_at_beginning(&head, 10); | ||||||
|  |     print_list_backwards(head); // should print 5, 10
 | ||||||
|  | 
 | ||||||
|  |     printf("Insert a node at the end and then print the list.\n"); | ||||||
|  | 
 | ||||||
|  |     insert_at_end(&head, 15); | ||||||
|  |     print_list(head); | ||||||
|  | 
 | ||||||
|  |     free_list(head); | ||||||
|  | 
 | ||||||
|  |     return EXIT_SUCCESS; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void print_list_backwards(Node *headNode) | ||||||
|  | { | ||||||
|  |     if (headNode == NULL) | ||||||
|  |     { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     /*
 | ||||||
|  |         Iterate through the list, and once we get to the end, iterate backwards to print | ||||||
|  |         out the items in reverse order (this is done with the pointer to the previous node). This can be done even more easily if a pointer to the last node is stored. | ||||||
|  |     */ | ||||||
|  |     Node *i = headNode; | ||||||
|  | 
 | ||||||
|  |     /*
 | ||||||
|  |     An Arrow operator in C/C++ allows to access elements in Structures and Unions. | ||||||
|  |      It is used with a pointer variable pointing to a structure or union. | ||||||
|  | 
 | ||||||
|  |      Use Dot(.) with struct values | ||||||
|  |      Use -> to with struct pointer | ||||||
|  |     */ | ||||||
|  | 
 | ||||||
|  |     while (i->next != NULL) | ||||||
|  |     { | ||||||
|  |         i = i->next; // sets the pointer to the next pointer of the struct.
 | ||||||
|  |     } | ||||||
|  |     // i points to the last element of the list now
 | ||||||
|  |     while (i != NULL) | ||||||
|  |     { | ||||||
|  |         printf("Value: %d\n", i->data); | ||||||
|  |         i = i->previous; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void print_list(Node *headNode) | ||||||
|  | { | ||||||
|  |     Node *i = headNode; | ||||||
|  | 
 | ||||||
|  |     while (i != NULL) | ||||||
|  |     { | ||||||
|  |         printf("Value: %d\n", i->data); | ||||||
|  |         i = i->next; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void insert_at_beginning(Node **pheadNode, int value) | ||||||
|  | { | ||||||
|  |     Node *currentNode; | ||||||
|  | 
 | ||||||
|  |     if (pheadNode == NULL) | ||||||
|  |     { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     currentNode = malloc(sizeof *currentNode); //deref pointer;
 | ||||||
|  | 
 | ||||||
|  |     currentNode->next = NULL; | ||||||
|  |     currentNode->previous = NULL; | ||||||
|  |     currentNode->data = value; | ||||||
|  | 
 | ||||||
|  |     if (*pheadNode == NULL) // list is empty
 | ||||||
|  |     { | ||||||
|  |         *pheadNode = currentNode; // set the object at pheadNode memory location to currentNode which is on the heap.
 | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     currentNode->next = *pheadNode; | ||||||
|  |     (*pheadNode)->previous = currentNode; | ||||||
|  |     *pheadNode = currentNode; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void insert_at_end(Node **pheadNode, int value) | ||||||
|  | { | ||||||
|  |     Node *currentNode; | ||||||
|  | 
 | ||||||
|  |     if (pheadNode == NULL) | ||||||
|  |     { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     currentNode = malloc(sizeof *currentNode); | ||||||
|  |     Node *i = *pheadNode; //save a ref to the current head so we can traverse the list
 | ||||||
|  | 
 | ||||||
|  |     currentNode->data = value; | ||||||
|  |     currentNode->next = NULL; | ||||||
|  |     currentNode->previous = NULL; | ||||||
|  | 
 | ||||||
|  |     if (*pheadNode == NULL) // If pheadNode is NULL meaning an empty list
 | ||||||
|  |     { | ||||||
|  |         *pheadNode = currentNode; | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     while (i->next != NULL) // Go to the end of the list
 | ||||||
|  |     { | ||||||
|  |         i = i->next; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     i->next = currentNode; | ||||||
|  |     currentNode->previous = i; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void free_list(Node *node) | ||||||
|  | { | ||||||
|  |     while (node != NULL) | ||||||
|  |     { | ||||||
|  |         Node *next = node->next; | ||||||
|  |         free(node); | ||||||
|  |         node = next; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | #define ASIZE (10) | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     size_t i = 0; | ||||||
|  |     int *p = NULL; | ||||||
|  |     int my_array[ASIZE]; | ||||||
|  | 
 | ||||||
|  |     /* Setting up the the values of the array to i * i*/ | ||||||
|  |     for (i = 0; i < ASIZE; i++) | ||||||
|  |     { | ||||||
|  |         // square the arrary index
 | ||||||
|  |         my_array[i] = i * i; // Interesting enough th size_t is unsigned long which will be converted to int
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* Reading the values using a pointer */ | ||||||
|  |     for (p = my_array; p < my_array + ASIZE; ++p) | ||||||
|  |     { | ||||||
|  |         printf("%d\n", *p); // dereference the memory location
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| @ -0,0 +1,23 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> // Start using EXIT_SUCCESS | ||||||
|  | 
 | ||||||
|  | int *int_point_plus_one(int *ptr) | ||||||
|  | { | ||||||
|  |     /* Recieves a pointer to an integer and adds 1 to it */ | ||||||
|  |     printf("%p has a value of: %d\n", ptr, *ptr); //Second call is dereferencing the int at ptr location in mem
 | ||||||
|  |     // deference the location and deference the value add one to the value, return the pointer
 | ||||||
|  |     *ptr = *ptr + 1; | ||||||
|  |     printf("%p now has a value of: %d\n", ptr, *ptr); | ||||||
|  |     return ptr; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     int a = 67; | ||||||
|  |     int *p = &a; | ||||||
|  | 
 | ||||||
|  |     int_point_plus_one(p); | ||||||
|  |     int_point_plus_one(p); | ||||||
|  | 
 | ||||||
|  |     return EXIT_SUCCESS; | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue
	
	 Drew Bednar
						Drew Bednar