======Project: Doubly Linked List Library Implementation====== A project for Matt Haas' Fall 2011 Data Structures class. This project was done over the month of October, but was worked on for about a week in terms of days in which programming this implementation. =====Objectives===== The purpose of this lab is to create linked list manipulating functions, make a library from these functions, then write a program that implements this library. =====Prerequisites===== In order to successfully accomplish/perform this project, the listed resources/experiences need to be consulted/achieved: * understand functions * understand pointers * understand structs * understand malloc() * ability to create a linked data structure =====Background===== As previously stated, I am trying to make a linked list library implementation. In doing so, I will have gained an understanding of a linked list, which is our basis for learning about data structures. This lets one create a list of data that can be accessed by moving back and forth. =====Scope===== To better utilize the functionality of the doubly linked list we've been studying in class, a personal implementation for use as a library will be undertaken for use in other projects and activities this semester. Working from the class example, a library implementation will be created which has the following functions: * **create**: generate a new node * **append**: add a new node to the list after a given node * **remove**: remove a node from the list * **search**: find if a node exists (likely search by value) * **insert**: add a new node to the list before a given node * **copy**: duplicate an existing node * **copy list**: duplicate the current list of nodes * **display**: display current list Creating a header file will be in order, which will contain the function prototypes of all of the above. The code will be implemented across several files . There will also be a sample implementation (ie a file with a **main()**) that will include the header file and demonstrate this library being created (it will link against it to compile). =====Attributes===== * pointers: pointers are at the heart of dynamic structures. * malloc/new: dynamic memory allocation. * linked lists: this code is going to implement linked lists. * doubly linked lists: not only is the code implementing a linked list, it is implementing doubly linked lists. * libraries: this code will be part of a library that can be reused in other projects * file I/O: The manager in the main function uses the library to take input and give output. =====Code===== ===main.c=== /* * Doubly Linked List Library - a doubly linked list implementation * * Fall2011 Data Structures */ // Include files #include #include #include "dlllib.h" unsigned int makeChoice(); // main function int main() { // initialize variables start = end = tmp = tmp2 = NULL; unsigned int choice, created=0; system("clear"); printf("Welcome to Linked List Manager!\n\n"); while(created == 0) { create(); if(start != NULL) { created=1; } else { printf("Please create a list.\n"); } } system("clear"); choice=makeChoice(); system("clear"); while(choice != 0) { system("clear"); if(choice==1) { displayList(); } else if(choice==2) { append(); } else if(choice==3) { insert(); } else if(choice==4) { removeNode(); } else if(choice==5) { copy(); } else if(choice==6) { copyList(); } if (start == NULL) { choice=0; } else { printf("\n\n"); choice=makeChoice(); } system("clear"); } return(0); } unsigned int makeChoice() { unsigned int choice=-1; while ((choice < 0) || (choice > 6)) { printf(" ============================================================="); printf("\n|| Choose a function to execute (0 to quit): ||\n"); printf(" =============================================================\n"); printf("|| (1: Display list) || (2: Append node) || (3: Insert node) ||\n"); printf("|| (4: Remove node) || (5: Copy node) || (6: Copy list) ||\n"); printf(" =============================================================\n\nInput: "); scanf("%d", &choice); if ((choice < 0) || (choice > 6)) { printf("\n!!ERROR!! Please enter a valid value.\n"); } } return(choice); } ===dlllib.h=== /* * Doubly Linked List Library - a doubly linked list implementation * * Fall2011 Data Structures */ #ifndef _DLLLIB_H #define _DLLLIB_H #include #include // Create our node structure struct node { int value; struct node *next; struct node *prev; }; typedef struct node Node; int create(); int append(); int removeNode(); int search(); int insert(); int deleteList(); int copyList(); int copy(); int displayList(); int input, input2; Node *start, *end, *tmp, *tmp2; #endif ===create.c=== #include #include #include "dlllib.h" int create() { // initialize variables start = end = tmp = tmp2 = NULL; printf("Enter a value (-1 to quit): "); scanf("%d", &input); // build our list while (input != -1) { if (start == NULL) // we have an empty list { start = (Node *) malloc (sizeof(Node)); end = start; // only one node, start and end are same start -> next = NULL; // nothing after start -> prev = NULL; // nothing before tmp = start; // tmp points to beginning of list start -> value = input; // enter value into node } else // there is something in our list { tmp = (Node *) malloc (sizeof(Node)); end -> next = tmp; // tack new node onto end of list tmp -> prev = end; // new node points to current end end = end -> next; // advance end to new end end -> value = input; // put input in node end -> next = NULL; // nothing beyond end } printf("Enter a value (-1 to quit): "); scanf("%d", &input); } return(0); } ===append.c=== #include #include #include "dlllib.h" int append() { //Append tmp=start; int i=0; while(tmp != NULL) { i++; tmp=tmp->next; } printf("Enter a value for the appended node: "); scanf("%d", &input); tmp = (Node *) malloc (sizeof(Node)); end -> next = tmp; // tack new node onto end of list tmp -> prev = end; // new node points to current end end = end -> next; // advance end to new end end -> value = input; // put input in node end -> next = NULL; // nothing beyond end return(0); } ===insert.c=== #include #include #include "dlllib.h" int insert() { // Insert a new node int i=0; printf("Enter node position to insert before: "); scanf("%d", &input); tmp = start; for(i=0; i next; } printf("Enter a value for new node: "); scanf("%d", &input2); if (start == NULL) // if our list is empty { start = (Node *) malloc (sizeof(Node)); end = tmp = start; start -> prev = NULL; end -> prev = NULL; start -> value = input2; } else if (start == tmp) // we're inserting before start of list { tmp2 = (Node *) malloc (sizeof(Node)); tmp2 -> next = start; // point new node's next at start start -> prev = tmp2; // point start's prev at tmp2 start = start -> prev; // move start to new node start -> value = input2; // put value in node } else // we're inserting before a node in the list { tmp2 = (Node *) malloc (sizeof(Node)); tmp2 -> next = tmp; // point new node's next at tmp tmp2 -> prev = tmp -> prev; // point new node's prev at tmp's prev tmp -> prev -> next = tmp2; // tmp's previous next is new node tmp -> prev = tmp2; // tmp's prev is new node tmp2 -> value = input2; // put value in node } return(0); } ===copy.c=== #include #include #include "dlllib.h" int copy() { //Copy int i; printf("Enter node # to copy: "); scanf("%d", &input); // Move tmp to exact node we wish to copy tmp=start; for(i=0; i next; } tmp2 = (Node *) malloc (sizeof(Node)); end -> next = tmp2; // tack new node onto end of list tmp2 -> prev = end; // new node points to current end end = end -> next; // advance end to new end end -> value = tmp-> value; // put value of copied node in node end -> next = NULL; // nothing beyond end return(0); } ===search.c=== #include #include #include "dlllib.h" int search() { //Find if node exists (search by value) printf("Enter a value to search for: "); scanf("%d", &input); tmp=start; int i = 0; int found=0; //if found = 0, then no node matches the search. while (tmp != NULL) { if(tmp->value == input) { printf("Node at position [%d] matches the search value.\n", i); printf("Node [%d]: %d\nSearch value: %d\n\n", i, tmp->value, input); found=1; } i++; tmp = tmp -> next; } if (found == 0) { printf("No node matches the search value.\n"); } return(0); } ===copyList.c=== #include #include #include "dlllib.h" int copyList() { //Copy entire list. tmp=start; int i=0; int copyFor; while (tmp != NULL) { i++; tmp = tmp->next; } tmp=start; for(copyFor=0;copyFor next = tmp2; // tack new node onto end of list tmp2 -> prev = end; // new node points to current end end = end -> next; // advance end to new end end -> value = tmp-> value; // put value of copied node in node end->next=NULL; tmp=tmp->next; } return(0); } ===displayList.c=== #include #include #include "dlllib.h" int displayList() { // Display our linked list int i = 0; tmp = start; while (tmp != NULL) { printf("[%d] value: %d\n", i, tmp -> value); i++; tmp = tmp -> next; } return(0); } ===removeNode.c=== #include #include #include "dlllib.h" int removeNode() { // Remove a node from the list tmp = start; int i=0; printf("Enter node # to delete: "); scanf("%d", &input); // Move tmp to exact node we wish to delete for(i=0; i next; } if ((tmp != start) && (tmp != end)) { tmp -> next -> prev = tmp -> prev; // The node after points to the node before tmp tmp -> prev -> next = tmp -> next; // Now, the now before points to the node after tmp tmp -> prev = NULL; tmp -> next = NULL; // tmp is now disconnected from the list free (tmp); // deallocate the node tmp is pointing to } else if (start == end) // list is only a single node { free(start); start=end=tmp=NULL; } else if (tmp == start) { tmp -> next -> prev = NULL; // The node following tmp is no longer pointing to us start = start -> next; // Adjust start to point to the new start of the list tmp -> next = NULL; // Disconnect tmp from the list free(tmp); // deallocate the node tmp is pointing to } else // tmp is equal to end { tmp -> prev -> next = NULL; // The node preceding tmp is no longer pointing to us end = end -> prev; // Adjust end to point to the new end of the list tmp -> prev = NULL; // Disconnect tmp from the list free(tmp); // deallocate the node tmp is pointing to } return(0); } =====Execution===== This is how to compile and execute: lab46:~/src/data/dlllib$ ar rcs libdll.a *.o lab46:~/src/data/dlllib$ gcc -o testimple main.c -L. -ldll lab46:~/src/data/dlllib$ ./testimple =====Reflection===== I had some problems with my node removing function. Rather than having a function that removes a list, I settled for a single node deleting function that can be run until the list is gone. Overall, this is a very important project, because it lays the foundation for the rest of the class, really. It is a big hurdle to get over, but once you do, there is a lot to be learned from going back and using this project. =====References===== In performing this project, the following resources were referenced: * Matt Haas * Fellow classmates (simple discussion about the aspects of our personal implementations) * C Programming Language O'Reilly Pocket Reference