Post on 19-Dec-2015
struct Node{ public:
int data;Node* next;
};typedef Node* Nodeptr;
class List {public:
List(); // constructorList(const list& list1); // copy constructor~List(); // destructor
bool empty() const; // boolean functionint headElement() const; // access functions
void addHead(int newdata); // add to the headvoid delHead(); // delete the head
int length() const; // utility functionvoid print() const; // output
private:Nodeptr head;
};
void main(){List L; // constructor called automatically here for LL.print(); { }L.addHead(30);L.print(); { 30 }L.addHead(13);L.print(); { 13 30 } L.addHead(40);L.print(); { 40 13 30 }L.addHead(50);L.print(); { 50 40 13 30 }List N(L);N.print(); { 50 40 13 30 }
List R;R.print(); { }if(R.empty())
cout << "List R empty" << endl;L.delHead();L.print(); { 40 13 30 }L.delHead();L.print(); { 13 30 }if(L.empty())
cout << "List L empty" << endl;else{
cout << "List L contains " << L.length() << " nodes" << endl;cout << "Head element of list L is: " << L.headElement() << endl;
}} // destructor called automatically here for L
How to use itint i(0);
Int j(10);
Int k(j);
Motivation list using static array
int myArray[1000]; int n;
We have to decide (to oversize) in advance the size of the array (list)
list using dynamic arrayint* myArray; int n;cin >> n;myArray = new int[n];
We allocate an array (list) of any specified size while theprogram is running
linked-list (dynamic size)size = ??The list is dynamic. It can grow and shrink to any size.
struct Node{ public:
int data;Node* next;
};typedef Node* Nodeptr;
class List {public:
List(); // constructorList(const List& list1); // copy constructor~List(); // destructor
bool empty() const; // boolean functionint headElement() const; // access functions
void addHead(int newdata); // add to the headvoid delHead(); // delete the head
int length() const; // utility functionvoid print() const; // output
private:int head[10000];int size;
};Or int head[DIM]; int size; cont int DIM=10000;
List::List(){head = NULL; size = 0;
}
bool List::empty() const{if(head==NULL)
return true;else
return false;}
int List::headElement() const {if(head != NULL)
return head->data;else{
cout << "error: trying to find head of empty list" << endl;
exit(1);}
}
Some simple member functions:
Implementation
If (size==0) return true; else return false;
If (size!=0) return head[0]; else …;
List::List(const list& list1) {
head = NULL;
Nodeptr cur = list1.head;
while(cur != NULL) {
// addEnd(cur->data);
addHead(cur->data); // inverse list order
cur = cur->next;
}
}
(explicitly defined) copy constructor:
If (list1.size!=0)
for (int i=0; i<list1.size; i++) head[i]=list1.head[i];
Destructor: deallocation function
List::~List(){
Nodeptr cur;
while(head!=NULL){
cur = head;
head = head->next;
delete cur;
}
}
Nothing here as it’s static.
void List::addHead(int newdata){
Nodeptr newPtr = new Node;
newPtr->data = newdata;
newPtr->next = head;
head = newPtr;
}
Adding an element to the head:
If (size<10000) {
for (int i=size; i>=;i--) head[i+1]=head[i];
head[0]=newdata;
size++;
}
void List::delHead(){
if(head != NULL){
Nodeptr cur = head;
head = head->next;
delete cur;
}
}
Deleting the head:
for (int i=1; i<size;i++) head[i-1]=head[i];
size--;
void List::print() const{cout << "{";Nodeptr cur = head;while(cur != NULL){
cout << cur->data << " ";
cur = cur->next;}
cout << "}" << endl;}
Print the list:
for (int i=0; i<size;i++) cout << head[i];
int List::length() const{
int n=0;Nodeptr cur = head;while(cur != NULL){
n++;cur = cur->next;
}return n;
}
Computing the number of elements of a given list:
return size;
struct Node{ public:
int data;Node* next;
};typedef Node* Nodeptr;
class List {public:
List(); // constructorList(const List& list1); // copy constructor~list(); // destructor
bool empty() const; // boolean functionint headElement() const; // access functions
void addHead(int newdata); // add to the headvoid delHead(); // delete the head
int length() const; // utility functionvoid print() const; // output
private:int* head;int size;
};
List::List(){
…
}
bool List::empty() const{
}
int List::headElement() const {
}
Some simple member functions:
Implementation
void main(){List L; // constructor called automatically here for LL.print(); { }L.addHead(30);L.print(); { 30 }L.addHead(13);L.print(); { 13 30 } L.addHead(40);L.print(); { 40 13 30 }L.addHead(50);L.print(); { 50 40 13 30 }List N(L);N.print(); { 50 40 13 30 }
List R;R.print(); { }if(R.empty())
cout << "List R empty" << endl;L.delHead();L.print(); { 40 13 30 }L.delHead();L.print(); { 13 30 }if(L.empty())
cout << "List L empty" << endl;else{
cout << "List L contains " << L.length() << " nodes" << endl;cout << "Head element of list L is: " << L.headElement() << endl;
}} // destructor called automatically here for L
Conclusion:
the usage is the same!!! No matter it is linked
list, static array or dynamic array!
template<typename T>class List {
public:List(); // constructorList(const List& list1); // copy constructor~list(); // destructor
bool empty() const; // boolean functionint headElement() const; // access functions
void addHead(T newdata); // add to the headvoid delHead(); // delete the head
int length() const; // utility functionvoid print() const; // output
private:T* head;int size;
};
template<typename T>List::List(){
head=NULL; size=0;}
template<typename T>bool List::empty() const{
}
template<typename T>T List::headElement() const {
}
Some simple member functions:
Implementation