How to make the linked list ordered in C++? -
#include <iostream> #include <string> using namespace std; struct node { int num; node*next; }; bool isempty(node *head); char menu(); void insertasfirstelement(node *&head, node *&last, int num); void insert(node *&head, node *&last, int num); void remove(node *&head, node *&last); void showlist(node*c); bool isempty(node*head) { if(head == null) return true; else return false; } char menu() { char choice; cout << "\n\nmenu:\n"; cout << "\n1. add item"; cout << "\n2. remove item"; cout << "\n3. show list"; cout << "\n4. exit" <<endl; cin >> choice; return choice; } void insertasfirstelement(node *&head, node*&last, int num) { node * temp = new node; temp ->num=num; temp ->next=null; head = temp; last = temp; } void insert(node *&head, node *&last, int num) { if(isempty(head)) insertasfirstelement(head,last,num); else { node *temp = new node; temp ->num=num; temp ->next=null; last ->next= temp; last = temp; } } void remove(node *&head, node *&last) { if(isempty(head)) cout << "list empty\n"; else if(head == last) { delete head; head = null; last = null; } else { node *temp = head; head = head -> next; delete temp; } } void showlist(node*c) { if(isempty(c)) cout <<"the list empty\n"; else { cout << "the values are: \n"; while(c !=null) { cout << c -> num << endl; c = c -> next; } } } int main() { node *head=null; node *last=null; char choice; int num; do{ choice = menu(); switch(choice) { case '1': cout << "please enter number: "; cin >> num; insert(head, last, num); break; case '2': remove(head,last); break; case '3': showlist(head);`` break; default: cout << "system exit\n"; } } while(choice != '4'); }
so have been able working linked list going. haven't been able figure out how in order. don't know how make can delete number have inserted. i'm trying understand how linked lists work better if can provide appreciated.
both of following functions assume want linked list sorted in ascending order.
to insert new node linked list object, try:
void insert(node *&head, node *&last, int num) { if(isempty(head)) insertasfirstelement(head,last,num); else if(num > tail->num) //if new number inserted greater tail, insert @ end , avoid needless iteration through list { node* temp = new node; temp->num = num; temp-next = null; last->next = temp; last = temp; } else { node *temp = new node; temp ->num=num; temp ->next=null; node* ptr = head; //to lead iteration through linked list node* prev = null; //to trail ptr while(ptr && (ptr->num > temp->num)) //iterate through linked list while new node's value less ptr's value , ptr not beyond end of list (assuming last->next == null) { prev = ptr; ptr = ptr->next; } if(!prev) // if prev never iterated, temp node new head node { head = temp; head->next = ptr; } else if(prev == last) //if prev tail, temp node new tail node { prev->next = temp; tail = temp; } else //otherwise, insert temp node in between prev , ptr { prev-next = temp; temp->next = ptr; } } }
to delete node linked list object try:
void remove(node *&head, node *&last, int x) // added int parameter determine node removed { if(isempty(head)) cout << "list empty\n"; else { node* ptr = head; node* prev = null; while(ptr && (ptr->num != x) //iterate through linked list while desired value deleted not found , have not gone through entire list { prev = ptr; prt = ptr->next; } if(!prev) //if prev never iterated, head value deleted { node* garbage = head; head = head->next; delete garbage; } else if(ptr==tail) //if value deleted tail's value, reassign tail prev , delete ptr { tail = prev; tail->next = null; delete ptr; } else if(!ptr) //if ptr == null, value deleted not in list { cout << "value " << x << " not found in list.\n"; // or throw exception } else //reassign prev's next ptr's next , delete ptr; { prev-next = ptr->next; delete ptr; } } }
Comments
Post a Comment