DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/index.php)
-   C++ (http://www.daniweb.com/forums/forum8.html)
-   -   printing a linked list (http://www.daniweb.com/forums/thread12118.html)

ohnbabygal Oct 8th, 2004 7:07 pm
printing a linked list
 
hi
im havin a problem w/ printing a linked list.
my program reads two input files and makes two linked lists out of them, and apend the lists and print it out.
my input files look like this:
1 2 3 4 5 (input1)
11 22 33 44 (input2)
here's my program. i think everythin is working well except printing or may be getNext function. Please help me out. thanks.

#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>

#define FILE_1 "input1.txt"
#define FILE_2 "input2.txt"

struct NODE
{
int data;
NODE *link;
};

struct LIST
{
NODE *head;
NODE *pos;
int count;
};


void build (LIST &list, char *filename);
//void printList (LIST list);
void append (LIST &list1, LIST &list2);
bool searchList (LIST list, NODE *&pPre,
NODE *&pLoc, int target);
bool getNext(LIST &list, int fromWhere, int &dataOut);
bool insertNode (LIST &list, NODE *&pPre, int num);

int main (void)
{

LIST list1;
LIST list2;

build (list1 , FILE_1);
// printList (list1);
build (list2 , FILE_2);
// printList (list2);

append (list1 , list2);

// printList (list1);

cout << "\n\nTotal number of nodes = "<< list1.count << endl;
return 0;
}

void build (LIST &list, char *filename)
{

ifstream infile;
NODE *pPre;
NODE *pLoc;
int num;
bool found;


infile.open(filename, ios::in);
if (!infile)
{
cerr << "\n\aCannot open " << filename << endl;
abort();
}

list.head = NULL;
list.count = 0;

while (infile>>num)
{
found = searchList(list, pPre, pLoc, num);
if (found)
cout << "\n\aError : Duplicate key " << endl;
else
insertNode (list, pPre, num);
}
infile.close();
return;
}

bool insertNode (LIST &list, NODE *&pPre, int num)
{
NODE *pNew;

if (! (pNew = new NODE))
return false;

pNew->data = num;
pNew->link = NULL;

if (pPre == NULL)
{
pNew->link = list.head;
list.head = pNew;
}
else
{
pNew->link = pPre->link;
pPre->link = pNew;
}

list.count++;
return true;

}

bool searchList(LIST list, NODE *&pPre, NODE *&pLoc, int target)

{
pPre = NULL;
pLoc = list.head;

while (pLoc && target > pLoc->data)
{
pPre = pLoc;
pLoc = pLoc->link;
}

return (pLoc ? target == pLoc->data : NULL);
}

bool getNext(LIST &list, int fromWhere, int &dataOut)

{
bool success;
if(fromWhere==0)
{
if(list.count==0)
success=false;
else
{
list.pos=list.head;
dataOut=list.pos->data;
success=true;
}
}
else
{
if(list.pos->link==NULL)
success=false;
else
{
list.pos=list.pos->link;
dataOut=list.pos->data;
success=true;
}
}
return success;
}

void printList (LIST list)

{
bool moreData; NODE *pos;

if(list.count==0)
cout<<"Sorry, nothing in the list"<<endl;
else
{
cout<<"Begin data Print: "<<endl;
list.count=0;
moreData=getNext(list,0,pos);

while(moreData=true)
{
list.count++;
cout <<setw(3)<<list.pos->data<<' ';
moreData=getNext(list,1,pos);

}
cout<<"count is "<<list.count<<endl;
cout <<endl;
}
}

void append (LIST &list1, LIST &list2)

{
NODE *pLoc;
if(list1.count==0)
list1.head=list2.head;
else
{
pLoc=list1.head;
if(pLoc->link!=NULL)
pLoc=pLoc->link;
pLoc->link=list2.head;
}
list1.count=list1.count+list2.count;
}

Narue Oct 8th, 2004 9:15 pm
Re: printing a linked list
 
Let's look more closely at this:
list.count=0;
moreData=getNext(list,0,pos);
Notice how you set list.count to 0 and that the fromWhere argument is 0. Then in getNext:
if(fromWhere==0)
{
  if(list.count==0)
    success=false;
Both fromWhere and list.count are 0. Now back to printList:
while(moreData==true) 
{
  list.count++;
moreData is not true because you set list.count and fromWhere to 0. So the loop is skipped and the list is not printed.

ohnbabygal Oct 8th, 2004 10:19 pm
Re: printing a linked list
 
thanks for ur help...
even though i tried to omit the line that set count=0, it stil doesnt work.
the error i got when i compile it is (cant convert 3 from NODE * to Int & ) or something like this . and the error is when i set getNext funtion to moredata. . so i belive that the prob is when i call getNext funtion in printlist funtion, (getNext(list,0,pos);) i hoestly dont know which parameter to pass for the last parameter (which is pos, wat i thought, and i believe its not right). i know i need to put a pointer(instead of 'pos') that will point to the data from the linked list to be printed. i just dont know how to do it :(
please please help me out........
the problem is only in the print function.
please help me..
thank you so much :)

Narue Oct 9th, 2004 10:26 am
Re: printing a linked list
 
Why not just change getNext like so:
// Untested
bool getNext ( LIST& list, int& dataOut )
{
  if ( list.pos == NULL )
    return false;

  dataOut = list.pos->data;
  list.pos = list.pos->link;

  return true;
}
Then you can write printList like so:
// Untested
void printList ( LIST& list )
{
  int data;

  list.pos = list.head;

  while ( getNext ( list, data ) )
    cout<< data <<endl;
}
The biggest confusion is how getNext does so much. It would be better to separate this function into getData and getNext so that the user of the list knows what to expect. And the concept of a list having its own internal iterator causes more problems than if you gave the user control of iterators.

ohnbabygal Oct 9th, 2004 7:30 pm
Re: printing a linked list
 
It works!!!! :) Thank you so much! u are right, the way i wrote was so complicated. u just clear it up and now i know wat was wrong. thank you so much again. i really appreciate it. :) u r quite smart.

Narue Oct 9th, 2004 7:52 pm
Re: printing a linked list
 
>Thank you so much!
Anytime. :)


All times are GMT -4. The time now is 1:46 pm.

Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC