| | |
Double Linked Lists and Functions required
Please support our C++ advertiser: Intel Parallel Studio Home
![]() |
C++ Syntax (Toggle Plain Text)
#include <iostream.h> #include <ctype.h> #include <string.h> #define MAX_NAME_LEN 30 typedef struct Sheet { char Name[MAX_NAME_LEN + 1]; struct Sheet *Next, *Prev; }Sheet; //prototypes void initialise(Sheet *&, char arr[], Sheet *&); void right(Sheet *); void left(Sheet *); void first(Sheet *&); void last(Sheet *&); void erase(Sheet *); void insert(char word[], Sheet *&, Sheet *&); void rename(); void display(Sheet *&); void strToLower(char s[]); void main() { Sheet *Head = NULL, *Tail = NULL; Sheet *mvlr=NULL; char init1[MAX_NAME_LEN+1]="sheet1"; char init2[MAX_NAME_LEN+1]="sheet2"; char init3[MAX_NAME_LEN+1]="sheet3"; initialise(Head, init1, Tail); initialise(Head, init2, Tail); initialise(Head, init3, Tail); char Option; char OldName[MAX_NAME_LEN+1], NewName[MAX_NAME_LEN+1]; cout<<"************ Selection Options *************"<<endl; cout<<endl; while(Option != 'E') { cout<<"Press 'R' to move to the next sheet\n"; cout<<"Press 'L' to move to the previous sheet\n"; cout<<"Press 'H' to jump to the first sheet\n"; cout<<"Press 'T' to jump to the last sheet\n"; cout<<"Press 'S' to add a new sheet to the list\n"; cout<<"Press 'D' to delete a sheet from the list\n"; cout<<"Press 'V' to view the sheets currently in the list\n"; cout<<"Press 'N' to rename a sheet\n"; cout<<"Press 'E' to exit\n"; cout<<endl; cout<<"Enter your option: "; cin>>Option; Option = toupper(Option); switch(Option) { case 'R': right(Head); break; case 'L': left(Head); break; case 'H': first(Head); break; case 'T': last(Tail); break; case 'S': cout<<"Enter a name for this new sheet: "; cin>>NewName; strToLower(NewName); insert(NewName, Head, Tail); cout<<endl; break; case 'D': cout<<"Enter the name of the sheet you wish to delete: "; cin>>OldName; strToLower(OldName); erase(Head); break; case 'V': cout<<"Displaying list: "<<endl; display(Head); cout<<endl; break; case 'N': cout<<"Enter name to change: "; cin>>OldName[MAX_NAME_LEN + 1]; strToLower(OldName); cout<<"Enter new name for sheet: "; cin>>NewName[MAX_NAME_LEN + 1]; strToLower(NewName); rename(); break; case 'E': break; default: cout<<endl; cout<<"Please select an option from the list"<<endl; cout<<endl; break; }//end switch }//end while }//end main void initialise(Sheet *&L, char arr[], Sheet *&T) { Sheet *e, *curr, *prev; e = new Sheet; strcpy(e->Name, arr); e->Next = NULL; e->Prev = NULL; if(L == NULL) { L = e; } else { prev = curr = L; while(curr != NULL) { prev = curr; curr = curr->Next; } e->Next = NULL; prev->Next = e; e->Prev = prev; T = e; } } void right(Sheet *Head) { Sheet *Current, *Previous; Current = Head; Current = Current->Next; Previous = Current->Prev; cout<<"Current Sheet: "<<Current->Name; cout<<endl; } void left(Sheet *mvlr) { Sheet *Current = new Sheet, *Previous = new Sheet; cout<<"Previous Sheet: "<<Current->Name<<endl; Current = Current->Prev; Previous = Current->Next; cout<<"Current Sheet: "<<Current->Name<<endl; if(Current->Prev == NULL) { cout<<"No more sheets!!!11!one"<<endl; } cout<<endl; } void first(Sheet *&L) { Sheet *e; e = L; cout<<"The first sheet in the list is:"<<'\t'; cout<<e->Name<<endl; cout<<endl; } void last(Sheet *&L) { Sheet *e; e = L; cout<<"The last sheet in the list is: "<<'\t'; cout<<e->Name<<endl; cout<<endl; } void erase(Sheet *L) { Sheet *Current = L; while(Current != NULL || (!strcmp("OldName", Current->Name))) { Current = Current->Next; delete Current; L = Current; } } //function to insert a new sheet //inserts at end of list only. void insert(char word[], Sheet *&L, Sheet *&T) { Sheet *e, *curr, *prev; e = new Sheet; strcpy(e->Name, word); e->Next = NULL; e->Prev = NULL; if(L == NULL) { L = e; } else { prev = curr = L; while(curr != NULL) { prev=curr; curr=curr->Next; } e->Next = NULL; prev->Next = e; e->Prev = prev; T = e; } } //function to display the current sheets in list void display(Sheet *&L) { Sheet *****; **** = L; while(**** != NULL) { cout<<****->Name<<endl; **** = ****->Next; } } //function to rename a sheet void rename() { Sheet *Current; char OldName[MAX_NAME_LEN + 1], NewName[MAX_NAME_LEN + 1]; if(!strcmp(Current->Name, OldName)) { strcpy(NewName, Current->Name); cout<<Current->Name; } } void strToLower(char s[]) { int i ; for(i=0 ; s[i] != '\0' ; i++) { s[i] = tolower(s[i]) ; } }
right, the code above partially works and I'm hoping somebody out there can help me understand why some of the functions and code wont work.
It's a double linked list.
user has to be able to
- move right throught the list and back left.
- jump to the head and jump to the tail.
- insert a new sheet anywhere and be in alphabetical order
- delete any sheet from anywhere
- rename a sheet
- display the current sheets in the list
- name are case insensitive
MS Visual C++ 6.0 just crashes when I press 'R' or 'L' to move left or right.
Delete doesn't seem to like searching for the sheet we want to delete.
Rename I think is the comparing strings.
Any help or ideas is greatly appreciated.
thanks
/InvalidDLL
•
•
Join Date: Mar 2004
Posts: 1,620
Reputation:
Solved Threads: 51
Hello,
I am not an expert programmer, but it looks to me that you should define the struct before you do the typdef statement. It might be possible to combine them as shown-- I am not sure.
You should also have a head pointer, and a tail pointer, and be using nulls to end your code. I'd be curious to see the whole code piece, and see what your headptr and tailptrs are doing. I think your heads are getting misused.
It might be handy while you are coding to actually draw out the list on paper. Draw out the head pointer. Define it in your code. Draw your structure. Define it in your code. Code in the head pointer assignment to the structure -- on your paper, make the arrow. Make the first data structure prev socket == null. Add that to your paper. Flow out the whole process on your paper, to help you out. Don't draw the arrows, or initialize any of the boxes until you manufacture the code.
Christian
I am not an expert programmer, but it looks to me that you should define the struct before you do the typdef statement. It might be possible to combine them as shown-- I am not sure.
You should also have a head pointer, and a tail pointer, and be using nulls to end your code. I'd be curious to see the whole code piece, and see what your headptr and tailptrs are doing. I think your heads are getting misused.
It might be handy while you are coding to actually draw out the list on paper. Draw out the head pointer. Define it in your code. Draw your structure. Define it in your code. Code in the head pointer assignment to the structure -- on your paper, make the arrow. Make the first data structure prev socket == null. Add that to your paper. Flow out the whole process on your paper, to help you out. Don't draw the arrows, or initialize any of the boxes until you manufacture the code.
Christian
•
•
Join Date: Jul 2004
Posts: 3
Reputation:
Solved Threads: 0
/* * * A R R * * */
//using c++
class CSheet{
public:
CString Name;
CSheet * Nxt;
CSheet * Prv;
//default constructor
CSheet():Nxt(NULL),Prv(NULL){}
// destructor binds objects Nxt and Prv
~CShett(){
if(Nxt)Nxt->Prv=Prv;
if(Prv)Prv->Nxt=Nxt;
}
};
// if Nxt is NULL then this is last
// if Prv is NULL then this is first
class CSheetPtr{
CSheet *ptr;
public:
void operator= (CSheet * p){ptr=p;}
CString GetName(){return Name;}
void SetName(CString nm){Name=nm}
CSheet* GetSheetAddr(){return ptr;}
CSheet* MoveNext(){return ptr=ptr->Nxt;}
CSheet* MovePrev(){return ptr=ptr->Prv;}
CSheet* MoveLast()
{
while(ptr->Nxt)
ptr=ptr->Nxt;
return ptr;
}
CSheet* MoveFirst()
{
while(ptr->Prv)
ptr=ptr->Prv;
return ptr;
}
};
/*Just rote this so may not be correct but using c++ classes is better*/
//using c++
class CSheet{
public:
CString Name;
CSheet * Nxt;
CSheet * Prv;
//default constructor
CSheet():Nxt(NULL),Prv(NULL){}
// destructor binds objects Nxt and Prv
~CShett(){
if(Nxt)Nxt->Prv=Prv;
if(Prv)Prv->Nxt=Nxt;
}
};
// if Nxt is NULL then this is last
// if Prv is NULL then this is first
class CSheetPtr{
CSheet *ptr;
public:
void operator= (CSheet * p){ptr=p;}
CString GetName(){return Name;}
void SetName(CString nm){Name=nm}
CSheet* GetSheetAddr(){return ptr;}
CSheet* MoveNext(){return ptr=ptr->Nxt;}
CSheet* MovePrev(){return ptr=ptr->Prv;}
CSheet* MoveLast()
{
while(ptr->Nxt)
ptr=ptr->Nxt;
return ptr;
}
CSheet* MoveFirst()
{
while(ptr->Prv)
ptr=ptr->Prv;
return ptr;
}
};
/*Just rote this so may not be correct but using c++ classes is better*/
The following code is an example of how to implement a Doubly Linked List. Let me know what you think of the code and if it has helped you in any way.
C++ Syntax (Toggle Plain Text)
// "DoublyLinkedList.cpp" #include<iostream> #include<conio.h> using namespace std; class node { public: int data; node *right_link, *left_link; }; class friend_node { private: node *head, *current_node; void add_to_list(int); int move_right(); int move_left(); void display_list(); void delete_record(); void dispose_list(); void print_options(); public: friend_node(); ~friend_node(); void handle_choice(); }; friend_node::friend_node() { head = new node; head->data = 0; head->left_link = head; head->right_link = head; current_node = head; } friend_node::~friend_node() { delete head; } void main() { friend_node go; cout << "Welcome to the Doubly Linked List Simulation\n\n"; cout << "1 - Exit program\n"; cout << "2 - Add\n"; cout << "3 - Move left\n"; cout << "4 - Move right\n"; cout << "5 - Print\n"; cout << "6 - Delete\n"; cout << "7 - Dispose\n"; cout << "8 - Show these options again\n"; go.handle_choice(); } void friend_node::handle_choice() { friend_node free_memory; int value; int choice; while (choice != 1) { cout << "\nEnter choice: "; cin >> choice; int temp = 0; switch(choice) { case 1: free_memory.~friend_node(); cout << "\nThank you!\n\n"; getch(); exit(1); break; case 2: cout << "\nEnter a number: "; cin >> value; temp = value; cout << "\n" << temp << " has been added!\n"; getch(); add_to_list(value); break; case 3: cout << "\nCurrent data to the left is: " << move_left() << "\n\n"; getch(); break; case 4: cout << "\nCurrent data to the right is: " << move_right() << "\n\n"; getch(); break; case 5: display_list(); break; case 6: delete_record(); break; case 7: dispose_list(); break; case 8: print_options(); break; default: cout << "\nInvalid choice!\n\n"; getch(); break; } } } void friend_node::add_to_list(int add_data) { node *add = new node; add->data = add_data; add->left_link = current_node; add->right_link = current_node->right_link; current_node->right_link->left_link = add; current_node->right_link = add; current_node = add; } int friend_node::move_left() { char empty[30] = {"\n\n\a\a\a\aThe list is empty!\n\n"}; if(head->right_link == head) { cout << empty << endl; getch(); handle_choice(); } else { current_node = current_node->left_link; if(current_node == head) { current_node = current_node->left_link; return (current_node->data); } else return(current_node->data); } return (0); } int friend_node::move_right() { char empty[30] = {"\n\n\a\a\a\aThe list is empty!\n\n"}; if(head->right_link == head) { cout << empty << endl; getch(); handle_choice(); } else { current_node = current_node->right_link; if(current_node == head) { current_node = current_node->right_link; return (current_node->data); } else return(current_node->data); } return (0); } void friend_node::display_list(void) { char empty[30] = {"\n\n\a\a\a\aNothing to print!\n\n"}; node *print; if(head->right_link == head) { cout << empty << endl; getch(); handle_choice(); } else { cout << "\nCurrent data in the list: "; print = head->right_link; while(print != head) { cout << print->data <<" "; print = print->right_link; } } getch(); cout <<"\n\n"; } void friend_node::delete_record() { char empty[30] = {"\n\n\a\a\a\aNothing to delete!\n\n"}; node *temp_current = new node; node *temp_current2 = temp_current; temp_current = current_node; if (head->right_link == head) { cout << empty << endl; getch(); handle_choice(); } while(current_node != head) { cout << "\n\n" << current_node->data << " has been deleted!\n\n"; current_node->left_link->right_link = current_node->right_link; current_node->right_link->left_link = current_node->left_link; current_node = current_node->right_link; current_node = current_node->left_link; getch(); handle_choice(); } } void friend_node::dispose_list() { char empty[30] = {"\n\n\a\a\a\aNothing to dispose!\n\n"}; if(head->right_link == head) { cout << empty << endl; getch(); handle_choice(); } while(current_node != head) { current_node->left_link->right_link = current_node->right_link; current_node->right_link->left_link = current_node->left_link; current_node = current_node->right_link; current_node = current_node->left_link; if(current_node == head) { cout << "\n\nThe list has been disposed!\n\n"; getch(); } } } void friend_node::print_options() { cout << "\n\n1 - Exit program\n"; cout << "2 - Add\n"; cout << "3 - Move left\n"; cout << "4 - Move right\n"; cout << "5 - Print\n"; cout << "6 - Delete\n"; cout << "7 - Dispose\n"; cout << "8 - Show these options again\n\n"; }
Real Eyes Realize Real Lies
My Resume
My Resume
![]() |
Similar Threads
- Problem with Double Linked Lists (C++)
- traversing backwards thru double linked list (C++)
- double linked list array of pointers, on the right track? (C++)
- passing linked lists through functions?? (C++)
Other Threads in the C++ Forum
- Previous Thread: summations and combinations
- Next Thread: C++ Builder 6
| Thread Tools | Search this Thread |
api array based beginner bitmap c++ c/c++ calculator char class classes code coding compile compiler console conversion count database delete deploy desktop developer directshow dll download dynamic email encryption error file forms fstream function functions game givemetehcodez google graph gui homeworkhelp homeworkhelper iamthwee ifstream input int integer java lib linkedlist linker linux list loop looping loops map math matrix memory multiple news node number output parameter pointer problem program programming project python random read recursion recursive return sorting string strings struct temperature template templates test text text-file tree unix url variable vector video visualstudio win32 windows winsock word wordfrequency wxwidgets







