im having a strange problem here. I compiled this program below on a windows xp machine, and when i ran it after a certain point in the end it froze on me saying that it has an access violation. so i decided to ssh into a unix account, compiled and ran it there flawlessly, with no troubles!!!! then i booted into knoppix (just to make sure) compiled the program there and again it compiled fine and ran flawlessly with all the correct output.

WHY IS THIS happening? could someone check it out pls

I dont know how much this will help, but i wrote it windows with microsoft visual c++ 6.0

dList.h

listdList.cppCode:#ifndef _H_dList #define _H_dList #include<cassert> template<class Type> struct nodeType { Type info; nodeType<Type> *next; nodeType<Type> * previous; }; template<class Type> class dList { public: typedef nodeType<Type> *Ptr; public: dList(); dList(const dList<Type>& otherList); ~dList(); const dList<Type>& operator=(const dList<Type>& otherList); void push_front(const Type& e); void push_back(const Type& e); void insert(Ptr p, const Type& e); void pop_front(); void pop_back(); void erase(Ptr p); void remove(const Type& e); Type front() const; Type back() const; Ptr begin() const { if(!empty())return first; return NULL; } Ptr rbegin() const { if(!empty())return last; return NULL; } bool empty() const; int size() const; void sort(); protected: int count; Ptr first; Ptr last; private: void copyList(const dList<Type>& otherList); }; // default constructor template<class Type> dList<Type>::dList() { first=NULL; last=NULL; count=0; } //destructor template<class Type> dList<Type>::~dList() { nodeType<Type>* temp; while(first!=NULL) { temp=first; first=first->next; delete temp; } last=NULL; count=0; } //copy constructor template<class Type> dList<Type>::dList(const dList<Type>& otherList) { copyList(otherList); } //overloaded operator = template<class Type> const dList<Type>& dList<Type>::operator=(const dList<Type>& otherList) { if(this != &otherList) { nodeType<Type>* temp; while(first!=NULL) { temp=first; first=first->next; delete temp; } last=NULL; count=0; copyList(otherList); } return *this; } //returns info in the front (first) node in the list //asserts first!= NULL so that if list is empty, program is terminated. template<class Type> Type dList<Type>::front()const { assert(first != NULL); return first->info; } //returns info in the back (last) node in the list //asserts first!= NULL so that if list is empty, program is terminated. template<class Type> Type dList<Type>::back()const { assert(first != NULL); return last->info; } //returns true if list is empty, false otherwise template<class Type> bool dList<Type>::empty()const { return (first == NULL); } //returns current size template<class Type> int dList<Type>::size()const { return count; } //performs a deep copy template<class Type> void dList<Type>::copyList(const dList<Type>& otherList) { count=otherList.count; if(count==0)first=last=NULL; else { first = new nodeType<Type>; first->info=otherList.first->info; nodeType<Type>* new_temp = first; nodeType<Type>* old_temp = otherList.first->next; while(old_temp != NULL) { new_temp->next= new nodeType<Type>; new_temp->next->info=old_temp->info; new_temp->next->previous = new_temp; new_temp=new_temp->next; old_temp=old_temp->next; } last=new_temp; } } //sorts list in ascending order template<class Type> void dList<Type>::sort() { for(nodeType<Type>* temp=first;temp != NULL; temp=temp->next) { nodeType<Type>* min = temp; for(nodeType<Type>* current = min; curr != NULL; current=current->next) { if(current->info < min->data)min=current; } Type temp_var=temp->data; temp->data=min->data; min->data=temp_var; } } //inserts node with info e at the back of the list template<class Type> void dList<Type>::push_back(const Type& e) { nodeType<Type>* temp= new nodeType<Type>; temp->info=e; temp->previous=NULL; temp->next=NULL; if(first==NULL && last==NULL) { first=last=temp; count++; } else { temp->previous=last; last->next=temp; last=temp; count++; } } //inserts node with info e at the front of the list template<class Type> void dList<Type>::push_front(const Type& e) { nodeType<Type>* temp= new nodeType<Type>; temp->info=e; temp->previous=NULL; temp->next=NULL; if(first==NULL && last==NULL) { first=last=temp; count++; } else { temp->next=first; first->previous=temp; first=temp; count++; } } //deletes the back node from the list //does nothing if list is empty template<class Type> void dList<Type>::pop_back() { if(!empty()) { if(last==first) { delete first; first=last=NULL; } else { last=last->previous; delete last->next; last->next=NULL; } count--; } } //deletes the front node from the list //does nothing if list is emoty template<class Type> void dList<Type>::pop_front() { if(!empty()) { if(first==last) { delete first; last=last=NULL; } else { first=first->next; delete first->previous; first->previous=NULL; } count--; } } //deletes the node pointed to by p in the list //asserts p!=NULL template<class Type> void dList<Type>::erase(nodeType<Type>* p) { assert(p != NULL); if(p==first)pop_front(); if(p==last)pop_back(); else if(p==last && p==first) { delete p; count=0; } else { p->previous->next=p->next; p->next->previous=p->previous; delete p; count--; } } //deletes all occurences of e in the list template<class Type> void dList<Type>::remove(const Type& e) { nodeType<Type>* temp; nodeType<Type>* left; temp=first; while(temp != NULL) { left=temp->next; if(temp->info==e) { erase(temp); } temp=left; } } //inserts noce with e immediately before node pointed by p //asserts p!= NULL template<class Type> void dList<Type>::insert(nodeType<Type>* p, const Type& e) { assert( p != NULL); nodeType<Type>* temp = new nodeType<Type>; temp->info=e; temp->next=NULL; temp->previous=NULL; if(p==first && p==last) { first=last=temp; } if(p==first)push_front(e); else { temp->previous=p->previous; p->previous->next=temp; p->previous = temp; temp->next=p; } count++; } #endif

Code:#include <iostream> using namespace std; #include "dList.h" int main() { dList<int> dl; int k = 1; dl.push_front(k); k++; dl.push_back(k); k++; dl.push_front(k); k++; //dl now contains the values 3 1 2 cout<<dl.front()<<" "<<dl.back()<<endl; //outputs 3 2 dl.pop_front(); dl.pop_back(); //dl now contains 1 cout<<dl.front()<<" "<<dl.back()<<endl; //outputs 1 1 dl.push_front(k); k++; dl.push_back(k); k++; dl.push_front(k); k++; //dl now contains 6 4 1 5 dList<int>::Ptr p; p = dl.begin(); p = p->next; //p points to 4 dl.insert(p, k); dl.erase(p); //dl now contains 6 7 1 5 dl.push_back(k); //dl now contains 6 7 1 5 7 for (p = dl.begin(); p != NULL; p = p->next) //outputs 6 7 1 5 7 cout<<p->info<<" "; cout<<endl; dl.remove(k); //dl now contains 6 1 5 dList<int> dl2(dl); //copy constructor - dl2 now is a copy of dl dl2.pop_back(); //dl still contains 6 1 5 and dl2 contains 6 1 dList<int> dl3; dl3 = dl2; //dl3 is now a copy of dl2 dl3.pop_front(); //dl2 still contains 6 1 and dl3 contains 1 for (p = dl.begin(); p != NULL; p = p->next) //outputs 6 1 5 cout<<p->info<<" "; cout<<endl; for (p = dl2.begin(); p != NULL; p = p->next) //outputs 6 1 cout<<p->info<<" "; cout<<endl; for (p = dl3.begin(); p != NULL; p = p->next) //outputs 1 cout<<p->info<<" "; cout<<endl; for (p = dl.rbegin(); p != NULL; p = p->previous) //outputs 5 1 6 cout<<p->info<<" "; cout<<endl; dl3.pop_back(); //dl3 is now empty cout<<dl.size()<<" "<<dl2.size()<<" "<<dl3.size()<<endl; //outputs 3 2 0 if (!dl.empty()) cout<<"dl is not empty"<<endl; if (dl3.empty()) cout<<"dl3 is empty"<<endl; cout<<"Press the enter key to finish"<<endl; char ch; cin.get(ch); //pause at end return(0); }