Linked Lists I, Continued

Tom Kelliher, CS18

May 1, 1996

Picking up from last time...

Pointer-Based Implementation

Declaration file:

#ifndef __PLIST_H
#define __PLIST_H

#include <stdlib.h>
struct listItem
{
   listItem* next;
   int value;
};

typedef listItem* listPointer;

class List
{
 public:
   List(void) { list = NULL; }
   ~List();
   void Insert(int newValue);   // add newValue to "beginning" of list
   int Delete(void);       // return and delete "first" item on list
   void Print(void);       // print list

 private:
   listPointer list;
};

#endif

Implementation file:

#include <iostream.h>
#include <iomanip.h>
#include <assert.h>
#include <stdlib.h>
#include "plist.h"

List::~List()
{
   listPointer temp;

   while (list != NULL)
   {
      temp = list;
      list = list->next;   // unlink first item on list
      delete temp;         // delete it
      temp = NULL;
   }
}

void List::Insert(int newValue)
{
   listPointer temp = new listItem;
   assert (temp != NULL);

   temp->next = list;
   list = temp;
   temp->value = newValue;
}

int List::Delete(void)
{
   listPointer temp;
   int returnVal;   // value of first list item

   assert (list != NULL);
   returnVal = list->value;   // get value of first list item
   temp = list;
   list = list->next;   // unlink first list item
   delete temp;         // delete first list item
   temp = NULL;
   return returnVal;
}

void List::Print(void)
{

   for (listPointer i = list; i != NULL; i = i->next)
      cout << setw(10) << i->value << endl;
}

Memory overhead?

How do we add to the middle of the list?

Linked List Client

#include <iostream.h>
#include "plist.h"

int main()
{
   List l;

   l.Insert(4);
   l.Insert(39);

   l.Print();

   cout << "Deleted " << l.Delete() << endl;

   l.Print();

   return 0;
}

Compiling?

Comparison

The ADT List

Operations:

ListIsEmpty()

int List::ListIsEmpty(void)
{
   return list == NULL;
}

ListLength()

int List::ListLength(void)
{
   int len = 0;
   listPointer temp = list;

   while (temp != NULL)
   {
      ++len;
      temp = temp->next;
   }

   return len;
}
Is this the ``best'' way?

Tradeoffs?

ListInsert()

void ListInsert(int newPosition, int newItem)
{
   listPointer newI;

   assert (1 <= newPosition && newPosition <= ListLength() + 1);

   if (newPosition == 1)
   {
      newI = new listItem;
      assert (newI != NULL);

      newI->next = list;
      newI->value = newItem;
      list = newI;
   }
   else
   {
      listPointer temp = list;

      newI = new listItem;
      assert (newI != NULL);

      while (newPosition > 2)
      {
         --newPosition;
         temp = temp->next;
      }

      newI->next = temp->next;
      newI->value = newItem;
      temp->next = newI;
   }
}

Exercise

Try the remaining List methods on your own.



Thomas P. Kelliher
Tue Apr 30 23:35:47 EDT 1996
Tom Kelliher