In: Computer Science
PROBLEM STATEMENT:
Using the list container from the STL, write a program that will
read the information from a file into a list
and then display the list to the screen. Add your name. Sort the
list by id. Print the list again
CODE:
Use the provided disneyin2.txt file.
Do not hard code the file name; get file name from user.
Use the struct below
struct student
{
char firstnm[20],
lastnm[20];
int id,
grade;
};
You are to create a list of data type student :
std::list<student> l;
The driver is to demonstrate that the above mentioned operations
are performed.
Overload the << and >> operators so you may easily
input and output a student.
disneyin2.txt
Hewey Duck 123 90
Daffy Duck 342 92
Wiley Coyote 432 89
Goofy Dog 654 95
Daisy Duck 145 92
Sylvester PuddyCat 775 86
Tweety Bird 221 87
Mickey Mouse 666 66
list.t
#ifndef LIST_T_
#define LIST_T_
template <class BaseData>
List <BaseData>::List()
{
previous = 0;
currentNode = 0;
head = 0;
numNodes = 0;
currentPos = 0;
}
template <class BaseData>
List <BaseData>::List(List<BaseData> &init)
{
if (this == &init) return;
ListNode *newList, *current, *newNode;
current = init.head;
newList = 0;
head = 0;
while (current)
{
newNode = new ListNode;
newNode->listData = current->listData;
newNode->link = 0;
if (newList)
{
newList->link = newNode;
newList = newList->link;
}
else newList = newNode;
if (current == init.head)
head = newNode;
current = current->link;
}
numNodes = init.numNodes;
currentPos = 0;
previous = 0;
currentNode = 0;
}
template <class BaseData>
void List <BaseData>::insertBefore(const BaseData
&item)
{
ListNode *p;
p = new ListNode;
p->listData = item;
if (numNodes)
{
if (head == currentNode) head = p;
p->link = currentNode;
if (previous) previous ->link = p;
++numNodes;
currentNode = p;
}
else
{
head = p;
p->link = 0;
previous = 0;
++numNodes;
currentNode = p;
}
}
template <class BaseData>
BaseData * List<BaseData>::examine()
{
BaseData *temp;
if (currentNode)
{
temp = new BaseData;
*temp = currentNode->listData;
return (temp);
}
else
return 0;
}
template <class BaseData>
List <BaseData>::~List()
{
destroy();
}
template <class BaseData>
void List<BaseData>::destroy()
{
ListNode *temp;
currentNode = head;
while (currentNode)
{
temp = currentNode;
currentNode = currentNode->link;
delete temp;
}
previous = 0;
currentNode = 0;
head = 0;
numNodes = 0;
currentPos = 0;
}
template <class BaseData>
void List <BaseData>::first()
{
if (numNodes)
{
previous = 0;
currentNode = head;
currentPos = 1;
}
else
currentPos = 0;
}
template <class BaseData>
void List <BaseData>::last()
{
while (currentNode->link)
{
previous = currentNode;
currentNode = currentNode->link;
}
currentPos = numNodes;
}
template <class BaseData>
void List<BaseData>::makeCurrent (int position)
{
if (( position < 1) || (position > numNodes))
cout << "invalid position: "<< endl;
else
{
first();
for (int i = 1; i < position; i++)
{
previous = currentNode;
currentNode = currentNode->link;
}
currentPos = position;
}
}
template <class BaseData>
void List<BaseData>::prev()
{
int tempCurrPos = currentPos;
if (currentPos > 1)
{
ListNode *temp = previous;
first();
if (currentNode == temp)
{
previous = 0;
currentNode = temp;
}
else
{
while (currentNode->link != temp)
currentNode = currentNode->link;
previous = currentNode;
currentNode = temp;
}
currentPos = tempCurrPos -1;
}
else
{
cout << "walking over front of list";
currentPos = 0;
}
}
template <class BaseData>
void List<BaseData>::next()
{
if (currentNode->link)
{
previous = currentNode;
currentNode = currentNode->link;
currentPos++;
}
else
{
cout << "walking over end of list";
currentPos = 0;
}
}
template <class BaseData>
int List<BaseData>::current()
{
return (currentPos);
}
template <class BaseData>
int List<BaseData>::count()
{
return (numNodes);
}
template <class BaseData>
void List<BaseData>::insertAfter(const BaseData
&item)
{
ListNode *p;
p = new ListNode;
p->listData = item;
if (numNodes)
{
p->link = currentNode->link;
currentNode->link = p;
++numNodes;
previous = currentNode;
currentNode = p;
currentPos++;
}
else
{
head = p;
p->link = 0;
previous = 0;
++numNodes;
currentNode = p;
currentPos++;
}
}
template <class BaseData>
void List<BaseData>::remove()
{
ListNode *p, *temp;
p = currentNode;
if (numNodes) //there are nodes
{if (previous) //this is not the first node in the
list
{ //any other node in list but first
previous->link = currentNode->link;
if (currentNode->link != 0)
currentNode = currentNode->link;
else //deleting last node in list
{
currentPos--;
currentNode = previous;
temp = head;
if (temp == currentNode)
previous = 0;
else
{
while (temp->link != currentNode && temp)
temp = temp->link;
previous = temp;
}
}
delete p;
--numNodes;
}
else
{ //delete first node in list
head = head->link;
delete p;
currentNode = head;
--numNodes;
//if first and last node in list
if (!numNodes) currentPos = 0;
}
}
else cout << "empty list" << endl;
}
template <class BaseData>
void List<BaseData>::replace(BaseData &item)
{
if (currentNode)
currentNode->listData = item;
}
template <class BaseData>
List<BaseData>& List<BaseData>:: operator =
(List<BaseData> &init)
{
if (this == &init) return *this;
ListNode *temp, *newList, *current, *newNode;
currentNode = head;
while (currentNode) //delete existing left side list
{
temp = currentNode;
currentNode = currentNode->link;
delete temp;
}
current = init.head;
newList = 0;
while (current) //copy list
{ newNode = new ListNode;
newNode->listData = current->listData;
newNode->link = 0;
if (newList)
{
newList->link = newNode;
newList = newList->link;
}
else newList = newNode;
if (current == init.head)
head = newNode;
current = current->link;
}
numNodes = init.numNodes;
currentPos = 0;
previous = 0;
currentNode = 0;
return *this;
}
#endif
list.h
#ifndef LIST_H_
#define LIST_H_
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using namespace std;
template <class BaseData>
class List
{
protected:
struct ListNode
{
public:
BaseData listData;
ListNode* link;
};
public:
List();
List(List& init);
~List();
void first();
void last();
void makeCurrent(int position);
void prev();
void next();
int current();
int count();
void insertBefore(const BaseData& item);
void insertAfter(const BaseData& item);
void remove();
void replace(BaseData& item);
BaseData* examine();
List<BaseData>& operator = (List<BaseData>&
source);
void destroy();
protected:
ListNode* head, * currentNode, * previous;
int numNodes;
int currentPos;
};
#include "list.t"
#endif
lab5_client_driver.cpp:
#include <iostream>
#include <fstream>
#include <list>
#include <string>
using namespace std;
struct student
{
char firstnm[20], lastnm[20];
int id, grade;
bool operator < (const student& rhs)
{
return id < rhs.id;
}
};
int main(){
ifstream inFile;
string fileName;
cout << "Please enter your file name:";
cin >> fileName;
inFile.open(fileName.c_str());
if (!inFile){
cout << "cannot open the
input file" << endl;
return 1;
}
student data;
std::list<student>l;
inFile >> data.firstnm >> data.lastnm
>> data.id >> data.grade;
while (inFile){
l.push_back(data);
inFile >> data.firstnm
>> data.lastnm >> data.id >> data.grade;
}
inFile.close();
std::list<student>::iterator i;
for (i = l.begin(); i != l.end(); ++i)
cout << (*i).firstnm <<
" " << (*i).lastnm << " " << (*i).id << " "
<< (*i).grade << endl;
cout << "enter a first name: " <<
endl;
cin >> data.firstnm;
cout << "enter a last name: " <<
endl;
cin >> data.lastnm;
cout << "enter an id number: " <<
endl;
cin >> data.id;
cout << "enter a grade: " << endl;
cin >> data.grade;
l.push_back(data);
l.sort();
cout << endl << "The sorted list by id
number:" << endl;
for (i = l.begin(); i != l.end(); ++i)
cout << (*i).firstnm <<
" " << (*i).lastnm << " " << (*i).id << " "
<< (*i).grade << endl;
}
Code in my editor:
output:
please do up vote.
Thanks.