Tom Kelliher, CS18
May 1, 1996
Picking up from last time...
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?
#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?
Operations:
int List::ListIsEmpty(void)
{
return list == NULL;
}
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?
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;
}
}
Try the remaining List methods on your own.