Class to manage a linked list. Utility that can be built on or used alone

Dependents:   Waldo_Embed_V2 elevator_with_queue RaheeNew DS1820 ... more

Good information on linked list basics here.

Information

Dependencies not included with library:

#include "mbed.h"
#include "LL.h"
  
LL<node>list;
  
int main()
{
    node *tmp;
      
    list.push((char *)"Two\n");
    list.append((char *)"Three\n");
    list.append((char *)"Four\n");
    list.push((char*)"One\n");
    list.append((char*)"Five\n");
      
    for(int i=1; i<=list.length(); i++)
    {
        tmp = list.pop(i);
        printf("%s", (char *)tmp->data );
    }
      
    error("done\n");
}

Files at this revision

API Documentation at this revision

Comitter:
sam_grove
Date:
Thu Apr 04 20:34:38 2013 +0000
Child:
1:a032c0392ba1
Commit message:
Upload from different project and add documentation

Changed in this revision

LinkedList.cpp Show annotated file Show diff for this revision Revisions of this file
LinkedList.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LinkedList.cpp	Thu Apr 04 20:34:38 2013 +0000
@@ -0,0 +1,200 @@
+/**
+ * @file    LinkedList.cpp
+ * @brief   Core Utility - Templated Linked List class
+ * @author  sam grove
+ * @version 1.0
+ * @see     
+ *
+ * Copyright (c) 2013
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "LinkedList.h"    // api wrapper
+
+template<class retT>
+LinkedList<retT>::LinkedList()
+{
+    // clear the members
+    _head = 0;
+
+    return;
+}
+
+template<class retT>
+LinkedList<retT>::~LinkedList()
+{
+    // free any memory that is on the heap
+    while(0 != length())
+    {
+        LinkedList::remove(1);
+    }
+
+    return;
+}
+
+template<class retT>
+retT *LinkedList<retT>::push(void *data)
+{
+    retT *new_node = new retT [1];
+    // make sure the new object was allocated
+    if (0 == new_node)
+    {
+        // output an error message here
+        //error( DBG_MSG("Memory Allocation Failed") );
+    }
+    // update the next item in the list to the current head
+    new_node->next = _head;
+    // store the address to the linked datatype
+    new_node->data = data;
+    _head = new_node;
+
+    return _head;
+}
+
+template<class retT>
+retT *LinkedList<retT>::insert(void *data, uint32_t loc)
+{
+    retT *new_node = new retT [1];
+    // make sure the new object was allocated
+    if (0 == new_node)
+    {
+        // output an error message here
+        //error( DBG_MSG("Memory Allocation Failed") );
+    }
+    retT *current = _head->next;
+    retT *prev = _head;
+    // move to the item we want to insert
+    for (uint32_t i=1; i!=(loc-1); i++)
+    {
+        prev = current;
+        current = current->next;
+    }
+    // store the address to the linked datatype
+    new_node->data = data;
+    // clear the next pointer
+    new_node->next = 0;
+    // update the list and store the new stuff
+    prev->next = new_node;
+    new_node->next = current;
+    // store the address to the linked datatype
+    _head->data = data;
+
+    return prev->next;
+}
+
+template<class retT>
+retT *LinkedList<retT>::append(void *data)
+{
+    retT *current = _head;
+    retT *new_node = new retT [1];
+    // make sure the new object was allocated
+    if (0 == new_node)
+    {
+        // output an error message here
+        //error( DBG_MSG("Memory Allocation Failed") );
+    }
+    // store the address to the linked datatype
+    new_node->data = data;
+    // clear the next pointer
+    new_node->next = 0;
+    // check for an empty list
+    if (0 == current)
+    {
+        _head = new_node;
+        return _head;
+    }
+    else
+    {
+        // look for the end of the list
+        while (current->next != 0)
+        {
+            current = current->next;
+        }
+        // and then add the new item to the list
+        current->next = new_node;
+    }
+
+    return current->next;
+}
+
+template<class retT>
+retT *LinkedList<retT>::remove(uint32_t loc)
+{
+    retT *current = _head;
+    retT *prev;
+    // make sure we have an item to remove
+    if (loc <= length())
+    {
+        // move to the item we want to delete
+        if (1 == loc)
+        {
+            _head = current->next;
+            delete [] current;
+        }
+        else
+        {
+            for (uint32_t i=1; i!=loc; i++)
+            {
+                prev = current;
+                current = current->next;
+            }
+            // store the item + 1 to replace what we are deleting
+            prev->next = current->next;
+            delete [] current;
+        }
+    }
+
+    return _head;
+}
+
+template<class retT>
+retT *LinkedList<retT>::pop(uint32_t loc)
+{
+    retT *current = _head;
+    // make sure we have something in the location
+    if (loc > length())
+    {
+        return 0;
+    }
+    // and if so jump down the list
+    for (uint32_t i=1; i!=loc; i++)
+    {
+        current = current->next;
+    }
+
+    return current;
+}
+
+template<class retT>
+uint32_t LinkedList<retT>::length(void)
+{
+    int count = 0;
+    retT *current = _head;
+    //loop until the end of the list is found
+    while (current != 0)
+    {
+        count++;
+        current = current->next;
+    }
+
+    return count;
+}
+
+// pre-define the templated instance for the linker
+template class LinkedList<node>;
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LinkedList.h	Thu Apr 04 20:34:38 2013 +0000
@@ -0,0 +1,105 @@
+/**
+ * @file    LinkedList.h
+ * @brief   Core Utility - Templated Linked List class
+ * @author  sam grove
+ * @version 1.0
+ * @see     
+ *
+ * Copyright (c) 2013
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef LINKEDLIST_H_
+#define LINKEDLIST_H_
+
+#include <stdint.h>
+
+/**
+ *  @enum node
+ *  @brief The Linked List structure
+ */ 
+struct node
+{
+    void *data;         /*!< pointer to list member data */
+    struct node *next;  /*!< pointer to the next list member */
+};
+
+/** Example using the LinkedList Class
+ *
+ * Example:
+ * @code
+ * int main(void)
+ * {
+ * }
+ * @endcode
+ */
+
+/**
+ *  @class LinkedList
+ *  @brief API abstraction for a Linked List
+ */ 
+template<class retT>
+class LinkedList
+{
+protected:
+    retT *_head;
+
+public:
+    /** Create the LinkedList object
+     */   
+    LinkedList();
+    
+    /** Deconstructor for the LinkedList object
+     *  Removes any members
+     */ 
+    ~LinkedList();
+
+    /** Add a member to the begining of the list
+     *  @param data - Some data type that is added to the list
+     *  @return The member that was just inserted (NULL if empty)
+     */
+    retT *push(void *data);
+    
+    /** Add a member to some position in the list
+     *  @param data - Some data type that is added to the list
+     *  @param loc - Place in the list to put the data
+     *  @return The member that was just inserted (NULL if empty)
+     */
+    retT *insert(void *data, uint32_t loc);
+    
+    /** Add a member to the end of the list
+     *  @param data - Some data type that is added to the list
+     *  @return The member that was just inserted (NULL if empty)
+     */
+    retT *append(void *data);
+    
+    /** Remove a member from the list
+     *  @param loc - The location of the member to remove
+     *  @return The head of the list
+     */
+    retT *remove(uint32_t loc);
+    
+    /** Get access to a member from the list
+     *  @param loc - The location of the member to access
+     *  @return The member that was just requested (NULL if empty or out of bounds)
+     */
+    retT *pop(uint32_t loc);
+    
+    /** Get the length of the list
+     *  @return The number of members in the list
+     */
+    uint32_t length(void);
+};
+
+#endif /* LINKEDLIST_H_ */