So, I've been trying to implement a doubly linked list in C but I ran into trouble when I tried to delete the first element of the list. Looked up C++ classes and such and decided to rewrite it as a class. And it seems to work a bit better now.
Anyone feel like going over this one with a critical eye? :>
EDIT: (Hope it's not too much code)
Code:
#include <iostream>
using namespace std;
class list {
private:
struct member {
int ID;
member *next;
member *prev;
};
int nextID;
member *start;
member *link;
member *end;
list operator = (list);
public:
list() {
start = link = end = NULL;
nextID = 0;
}
~list() {
if(listExists()) {
wipeList();
}
}
void addLink();
void delLink(int ID);
void delStart();
void delEnd();
void wipeList();
void printLinkID();
bool nextLink();
bool prevLink();
bool seekLink(int ID);
bool listExists();
};
bool list::listExists() {
if(start != NULL) {
return true;
}
return false;
}
void list::wipeList() {
while(listExists()) {
delStart();
}
}
void list::delStart() {
member *temp;
if(listExists()) {
temp = start;
if(start->next != NULL) {
start = start->next;
start->prev = NULL;
} else {
start = NULL;
}
delete temp;
}
}
void list::delEnd() {
member *temp;
if(listExists()) {
temp = end;
if(end->prev != NULL) {
end = end->prev;
end->next = NULL;
} else {
end = NULL;
}
delete temp;
}
}
void list::delLink(int ID) {
member *temp;
if(seekLink(ID)) {
if(link->next != NULL) {
if(link->prev != NULL) {
link->prev->next = link->next;
link->next->prev = link->prev;
} else {
link->next->prev = NULL;
start = link->next;
}
temp = link;
link = link->next;
delete temp;
} else {
temp = link;
end = link->prev;
end->next = NULL;
delete temp;
}
}
}
void list::addLink() {
if(listExists()) {
member *newLink = new member;
if(link->next != NULL) {
newLink->next = link->next;
} else {
end = newLink;
}
newLink->prev = link;
newLink->ID = nextID++;
link->next = newLink;
} else {
start = new member;
link = end = start;
start->prev = start->next = NULL;
link->ID = nextID++;
}
}
bool list::seekLink(int ID) {
link = start;
do {
if(link->ID == ID) {
return true;
}
} while(nextLink());
return false;
}
void list::printLinkID() {
if(listExists()) {
link = start;
cout << "List Exists!" << endl;
do {
cout << link->ID << endl;
} while(nextLink());
} else {
cout << "List does not exist!" << endl;
}
}
bool list::nextLink() {
if(link->next != NULL) {
link = link->next;
return true;
}
return false;
}
bool list::prevLink() {
if(link->prev != NULL) {
link = link->prev;
return true;
}
return false;
}
int main() {
list test;
int i;
for(i = 0; i < 10; i++) {
test.addLink();
test.nextLink();
}
test.printLinkID();
cout << endl;
test.delLink(0);
test.delLink(4);
test.delLink(9);
test.printLinkID();
cout << endl;
test.delStart();
test.delStart();
test.delStart();
test.delStart();
test.delStart();
test.delStart();
test.delStart();
test.delStart();
test.printLinkID();
return 0;
}