c++ - doubly linked list with dummy node -
i have spent time here without progress on implementation of doubly linked list. trying @ least fix insertlast func, , had no luck @ all. part of lack of experience on how deal pointers in c++. advice valuable @ point. when execute 0 size of list.
#include <iostream> using namespace std; class node { public: int data; node *prev, *next; node(int x,node *p,node *q) { data = x; prev = p; next = q; } }; public class position :public node { //}; class list { public: node *head; int size; public: list() { head = new node(null,null,null); head->prev = head; head->next = head; size = 0; } int size(){ return list().size; } void insertfirst(int x) { insertbefore(first(), x); } void insertlast(int x) { insertafter(last(), x); } void insertafter(node *p, int x) { node *q = new node(x,p,p->next); p->next->prev = q; p->next = q; size += 1; } void insertbefore(node *p, int x) { node *q = new node(x,p->prev,p); p->prev->next = q; p->prev = q; size += 1; } void insertatrank(int rank, int x) { insertbefore(toposition(rank), x); } void remove(node *p) { p->prev->next = p->next; p->next->prev = p->prev; p->prev = p->next = null; size -= 1; } void removeatrank(int rank) { remove(toposition(rank)); } int element(node *p) { return p->data; } int elementatrank(int rank) { return toposition(rank)->data; } int torank(node *p) { int r = 0; (node *q = first(); q != p; q = q->next) r += 1; return r; } node *toposition(int rank) { if (rank > size){ throw "exception"; } node *q = first(); (int r = 0; r != rank; r += 1){ q = q->next; return q; } } node *first() { return head->next; } node *last() { return head->prev; } node *after(node *p) { return p->next; } node *before(node *p) { return p->prev; } bool isempty() { return head->next == head; } node *removelast(){ if (last() == null){ throw "exception"; } node *p = last(); p->prev->next = p->next; p->next->prev = p->prev; p->prev = p->next = null; return p; } }; void main(){ int x; list l; int a[]{163, 179, 103, 91, 404, 531, 745, 405, 686, 858, 898, 926, 266, 867, 865, 91, 103, 163, 179, 2, 66, 404, 405, 531, 686, 745, 858, 865, 867, 898, 926}; int size = sizeof(a) / sizeof(a[0]); (int = 0; < size; i++){ l.insertlast(i); } (int j = 0; j < l.size(); j++){ cout << l.elementatrank(j) << endl; } cout << l.size(); cin >> x; }
i trying @ least fix insertlast func
your inserlast() looks fine. try following code:
#include <iostream> using namespace std; class node { public: int data; node *prev, *next; node(int x,node *p,node *q) { data = x; prev = p; next = q; } }; class list { public: node *head; int size; public: list() { head = new node(0,null,null); head->prev = head; head->next = head; size = 0; } int size(){ return size; } void insertfirst(int x) { insertbefore(first(), x); } void insertlast(int x) { insertafter(last(), x); } void insertafter(node *p, int x) { node *q = new node(x,p,p->next); p->next->prev = q; p->next = q; size += 1; } void insertbefore(node *p, int x) { node *q = new node(x,p->prev,p); p->prev->next = q; p->prev = q; size += 1; } void insertatrank(int rank, int x) { insertbefore(toposition(rank), x); } void remove(node *p) { p->prev->next = p->next; p->next->prev = p->prev; p->prev = p->next = null; size -= 1; } void removeatrank(int rank) { remove(toposition(rank)); } int element(node *p) { return p->data; } int elementatrank(int rank) { return toposition(rank)->data; } int torank(node *p) { int r = 0; (node *q = first(); q != p; q = q->next) r += 1; return r; } node *toposition(int rank) { if (rank > size){ throw "exception"; } node *q = first(); (int r = 0; r != rank; r += 1){ q = q->next; } return q; } node *first() { return head->next; } node *last() { return head->prev; } node *after(node *p) { return p->next; } node *before(node *p) { return p->prev; } bool isempty() { return head->next == head; } node *removelast(){ if (last() == null){ throw "exception"; } node *p = last(); p->prev->next = p->next; p->next->prev = p->prev; p->prev = p->next = null; return p; } }; void main(){ int x; list l; int a[]{163, 179, 103, 91, 404, 531, 745, 405, 686, 858, 898, 926, 266, 867, 865, 91, 103, 163, 179, 2, 66, 404, 405, 531, 686, 745, 858, 865, 867, 898, 926}; int size = sizeof(a) / sizeof(a[0]); (int = 0; < size; i++){ l.insertlast(i); } (int j = 0; j < l.size(); j++){ cout << l.elementatrank(j) << endl; } cout << l.size(); cin >> x; } changes made:
- removed vague class position : public node
- int size() { return size; }
- node* toposition (int rank) {...} - moved return statement in end
n.b.: did not check other parts of code. made code compile correctly , work expected, because "you trying @ least fix insertlast func"
Comments
Post a Comment