From fa7aed64b2d1aa315b02342377e0a08fdd3faa93 Mon Sep 17 00:00:00 2001 From: Iurii Tatishchev Date: Sun, 28 Apr 2024 12:14:36 -0700 Subject: [PATCH] 6.19 Lab: Doubly-Linked List (Insert & Display) --- 04-dl-lists/StudentList.cpp | 44 ++++++++++++++++++++++--------------- 04-dl-lists/StudentList.h | 17 +++++++------- 04-dl-lists/main.cpp | 32 ++++++++++++--------------- 3 files changed, 49 insertions(+), 44 deletions(-) diff --git a/04-dl-lists/StudentList.cpp b/04-dl-lists/StudentList.cpp index 85b5e26..5077c2e 100644 --- a/04-dl-lists/StudentList.cpp +++ b/04-dl-lists/StudentList.cpp @@ -5,6 +5,7 @@ // IDE: CLion #include // For cout and NULL #include "StudentList.h" + using namespace std; // ************************************************** @@ -15,14 +16,13 @@ using namespace std; // by making sure that all links can be safely dereferenced and that every list // (even one that contains no data elements) always has a "first" node. // ************************************************** -StudentList::StudentList() -{ +StudentList::StudentList() { head = new ListNode; // head points to the sentinel node head->stu.gpa = -1; head->stu.name = ""; head->forw = head; - /* Write your code here */ + head->back = head; count = 0; } @@ -31,16 +31,14 @@ StudentList::StudentList() // stored in each node of the linked list // pointed to by head. from A to Z // ************************************************** -void StudentList::displayListForw() const -{ +void StudentList::displayListForw() const { ListNode *pCur; // To move through the list // Position pCur: skip the head of the list. pCur = head->forw; // While pCur points to a node, traverse the list. - while (pCur != head) - { + while (pCur != head) { // Display the value in this node. cout << pCur->stu.gpa << " " << pCur->stu.name << endl; @@ -49,24 +47,35 @@ void StudentList::displayListForw() const } cout << endl; } + // ************************************************** -// display list forwards: shows the value +// display list backwards: shows the value // stored in each node of the linked list // pointed to by head, from Z to A // ************************************************** +void StudentList::displayListBack() const { + ListNode *pCur; // To move through the list -void StudentList::displayListBack() const -{ - /* Write your code here */ + // Position pCur: skip the head of the list. + pCur = head->back; + + // While pCur points to a node, traverse the list. + while (pCur != head) { + // Display the value in this node. + cout << pCur->stu.gpa << " " << pCur->stu.name << endl; + + // Move to the next node. + pCur = pCur->back; + } cout << endl; } + // ************************************************** // The insertNode function inserts a node with // stu copied to its value member. // ************************************************** -void StudentList::insertNode(Student dataIn) -{ +void StudentList::insertNode(Student dataIn) { ListNode *newNode; // A new node ListNode *pCur; // To traverse the list @@ -78,8 +87,7 @@ void StudentList::insertNode(Student dataIn) pCur = head->forw; // Find location: skip all nodes whose name is less than dataIn's name - while (pCur != head && pCur->stu.name < dataIn.name) - { + while (pCur != head && pCur->stu.name < dataIn.name) { pCur = pCur->forw; } @@ -88,7 +96,8 @@ void StudentList::insertNode(Student dataIn) pPre->forw = newNode; newNode->forw = pCur; - /* Write your code here */ + pCur->back = newNode; + newNode->back = pPre; // Update the counter count++; @@ -98,7 +107,6 @@ void StudentList::insertNode(Student dataIn) // Destructor * // This function deletes every node in the list. * // ************************************************** -StudentList::~StudentList() -{ +StudentList::~StudentList() { } diff --git a/04-dl-lists/StudentList.h b/04-dl-lists/StudentList.h index 3b822d5..5a6d8b6 100644 --- a/04-dl-lists/StudentList.h +++ b/04-dl-lists/StudentList.h @@ -9,18 +9,15 @@ #include -struct Student -{ +struct Student { double gpa; std::string name; }; -class StudentList -{ +class StudentList { private: // Declare a structure for the list - struct ListNode - { + struct ListNode { Student stu; // The value in this node ListNode *forw; // To point to the next node ListNode *back; // To point to the previous node @@ -32,14 +29,18 @@ private: public: StudentList(); // Constructor - ~StudentList(); // Destructor + ~StudentList(); // Destructor // Linked list operations - int getCount() const {return count;} + int getCount() const { return count; } + void insertNode(Student); + //bool deleteNode(double); //void searchList() const; void displayListForw() const; + void displayListBack() const; }; + #endif diff --git a/04-dl-lists/main.cpp b/04-dl-lists/main.cpp index d376020..0caf983 100644 --- a/04-dl-lists/main.cpp +++ b/04-dl-lists/main.cpp @@ -27,8 +27,7 @@ using namespace std; void buildList(StudentList &); -int main() -{ +int main() { // Define a StudentList object StudentList list; @@ -38,8 +37,7 @@ int main() string answer; cout << "Insert [Y/N]? "; getline(cin, answer); - if (answer == "Y" || answer == "y") - { + if (answer == "Y" || answer == "y") { Student s; cout << "Enter gpa then enter name:" << endl; cin >> s.gpa >> s.name; @@ -48,7 +46,7 @@ int main() } cout << endl; list.displayListForw(); - /* Write your code here: display the list from Z to A */ + list.displayListBack(); return 0; } @@ -59,19 +57,17 @@ It calls the insertNode() function that inserts the new data at the right locati An input line contains the gpa of a student follow by its name (assume it is a single word name) To stop reading enter "#" ************************************************** */ -void buildList(StudentList &list) -{ - string line; - getline(cin, line); - while (line != "#") - { - stringstream temp(line); // create a stringstream named temp with data from line - Student newStu; - temp >> newStu.gpa; // read gpa from temp - temp >> newStu.name; // read name from temp - list.insertNode(newStu); - getline(cin, line); - } +void buildList(StudentList &list) { + string line; + getline(cin, line); + while (line != "#") { + stringstream temp(line); // create a stringstream named temp with data from line + Student newStu; + temp >> newStu.gpa; // read gpa from temp + temp >> newStu.name; // read name from temp + list.insertNode(newStu); + getline(cin, line); + } }