Passing Linked list into function

I have a homework assignment to write an address list using a linked list.  I am having a problem passing the list into a function.  I know I want to pass by reference.  in my menu program below, I pass the list into the function "newentry", but when I return to the menu and print the list it is empty.

Please help.
#include <iostream>
#include <string>
using namespace std;
#include "menu.h"
 
void main()
{
	mainmenu();
}
 
void mainmenu()
{
	SortedType list;
	AddrType address;
	int select;
 
	cout << "Enter your selection: " << endl << endl;
	cout << "(1) New entry " << endl;
	cout << "(2) Delete an entry " << endl;
	cout << "(3) Edit an entry " << endl;
	cout << "(4) Generate a birthday card " << endl;
	cout << "(5) Generate an aniversary card " << endl;
	cout << "(6) Print List " << endl;
	cout << "(7) Exit program " << endl;
 
	cin >> select;
 
 
	switch (select)
	{
		case 1:
			//cout << "New Entry" << endl;
			newentry(list);
			break;
		case 2:
			cout << "Delete an entry" << endl;
			break;
		case 3:
			cout << "Edit an entry" << endl;
			break;
		case 4:
			cout << "Generate BDay Card" << endl;
			break;
		case 5:
			cout << "Gen Aniversay Card" << endl;
			break;
		case 6:
			//cout << "Print List" << endl;
			PrintList(list);
			break;
		case 7:
			cout << "Exit" << endl;
			break;
		default:
			cout << "Enter a number from 1-6: " << cout << endl;
			mainmenu();
	}
}
void newentry(SortedType& list)
{
	string fname;
	string lname;
	string addr;
	int bday;
	int aniv;
	AddrType address;
	cout << "Enter First Name: ";
	cin >> fname;
	address.initfname(fname);
	cout << fname << endl;
	cout << "Enter Last Name: ";
	cin >> lname;
	address.initlname(lname);
	cout << lname << endl;
	cout << "Enter Address: ";
	fflush(stdin);
	getline(cin, addr);
	address.initaddress(addr);
	cout << addr << endl;
	cout << "Enter Birthday: ";
	cin >> bday;
	address.initbday(bday);
	cout << bday << endl;
	cout << "Enter Aniversary: ";
	cin >> aniv;
	address.initaniv(aniv);
	cout << aniv << endl;
	list.InsertItem(address);
/*
	int length;
	AddrType address2;
	list.ResetList();
	cout << "List" << endl;
	length = list.GetLength();
	for (int counter = 1; counter <= length; counter++)
	{
		list.GetNextItem(address2);
		address2.PrintFirst(cout);
		cout << endl;
		address2.PrintLast(cout);
		cout << endl;
		address2.PrintBday(cout);
		cout << endl;
		address2.PrintAniv(cout);
		cout << endl;
	}
*/
 
	mainmenu();
 
}
void PrintList(SortedType &list)
{
	int length;
	AddrType address;
	list.ResetList();
	cout << "List" << endl;
	length = list.GetLength();
	for (int counter = 1; counter <= length; counter++)
	{
		list.GetNextItem(address);
		address.PrintFirst(cout);
		cout << endl;
		address.PrintLast(cout);
		cout << endl;
		address.PrintBday(cout);
		cout << endl;
		address.PrintAniv(cout);
		cout << endl;
	}
}

Open in new window

rsissickAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

AndyAinscowFreelance programmer / ConsultantCommented:
void PrintList(SortedType &list)
{
        int length;
        AddrType address;
        list.ResetList();       <<---------------------------


Does that empty the list?  

0
rsissickAuthor Commented:
No, but I kinda figured someone would ask me that.  It just resets the current pos pointer to NULL.  

Thanks

void SortedType::ResetList()
{
  currentPos = NULL;
}

void SortedType::GetNextItem(AddrType& item)
{
  if (currentPos == NULL)
    currentPos = listData;
  item = currentPos->info;
  currentPos = currentPos->next;

}
0
AndyAinscowFreelance programmer / ConsultantCommented:
void newentry(SortedType& list)
{
...
mainmenu();  <<---  This will generate a NEW list.

You need a loop in the main function
0
Become a CompTIA Certified Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

evilrixSenior Software Engineer (Avast)Commented:
newentry calls mainmenu at the end, so it's not returning it's actually starting a new callstack, which creates a new version of your list in that callstack context. You do the same in the dwefault of your switch. You'll eventually get a stack overflow doing this.

See my comments below...
#include <iostream>
#include <string>
using namespace std;
#include "menu.h"
 
void main()
{
        mainmenu();
}
 
void mainmenu()
{
        SortedType list;
        AddrType address;
        int select;
 
        cout << "Enter your selection: " << endl << endl;
        cout << "(1) New entry " << endl;
        cout << "(2) Delete an entry " << endl;
        cout << "(3) Edit an entry " << endl;
        cout << "(4) Generate a birthday card " << endl;
        cout << "(5) Generate an aniversary card " << endl;
        cout << "(6) Print List " << endl;
        cout << "(7) Exit program " << endl;
 
        cin >> select;
 
 
        switch (select)
        {
                case 1:
                        //cout << "New Entry" << endl;
                        newentry(list);
                        break;
                case 2:
                        cout << "Delete an entry" << endl;
                        break;
                case 3:
                        cout << "Edit an entry" << endl;
                        break;
                case 4:
                        cout << "Generate BDay Card" << endl;
                        break;
                case 5:
                        cout << "Gen Aniversay Card" << endl;
                        break;
                case 6:
                        //cout << "Print List" << endl;
                        PrintList(list);
                        break;
                case 7:
                        cout << "Exit" << endl;
                        break;
                default:
                        cout << "Enter a number from 1-6: " << cout << endl;
                        mainmenu(); //<---------------------------------------------RX: [ REMOVE THIS ]
        }
}
void newentry(SortedType& list)
{
        string fname;
        string lname;
        string addr;
        int bday;
        int aniv;
        AddrType address;
        cout << "Enter First Name: ";
        cin >> fname;
        address.initfname(fname);
        cout << fname << endl;
        cout << "Enter Last Name: ";
        cin >> lname;
        address.initlname(lname);
        cout << lname << endl;
        cout << "Enter Address: ";
        fflush(stdin);
        getline(cin, addr);
        address.initaddress(addr);
        cout << addr << endl;
        cout << "Enter Birthday: ";
        cin >> bday;
        address.initbday(bday);
        cout << bday << endl;
        cout << "Enter Aniversary: ";
        cin >> aniv;
        address.initaniv(aniv);
        cout << aniv << endl;
        list.InsertItem(address);
/*
        int length;
        AddrType address2;
        list.ResetList();
        cout << "List" << endl;
        length = list.GetLength();
        for (int counter = 1; counter <= length; counter++)
        {
                list.GetNextItem(address2);
                address2.PrintFirst(cout);
                cout << endl;
                address2.PrintLast(cout);
                cout << endl;
                address2.PrintBday(cout);
                cout << endl;
                address2.PrintAniv(cout);
                cout << endl;
        }
*/
 
        mainmenu(); //<---------------------------------------------RX: [ REMOVE THIS ]
 
}
void PrintList(SortedType &list)
{
        int length;
        AddrType address;
        list.ResetList();
        cout << "List" << endl;
        length = list.GetLength();
        for (int counter = 1; counter <= length; counter++)
        {
                list.GetNextItem(address);
                address.PrintFirst(cout);
                cout << endl;
                address.PrintLast(cout);
                cout << endl;
                address.PrintBday(cout);
                cout << endl;
                address.PrintAniv(cout);
                cout << endl;
        }
}

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
evilrixSenior Software Engineer (Avast)Commented:
Andy, it seems we simul-posted :)
0
AndyAinscowFreelance programmer / ConsultantCommented:
@evilrix - No problems
0
rsissickAuthor Commented:
I understand.  I want the menu to be displayed after the new item is entered.  How do I do this without calling my menu function again?
0
AndyAinscowFreelance programmer / ConsultantCommented:
As I said - you use a loop
(ps. For homework we are limited with what we can write due to EE rules)

foo()
{
  MyList list;
  while(TRUE)
  {
    //display options
    //process input
    foo2(list);    //here the ONE instance of list is processed
  }
}
0
rsissickAuthor Commented:
Thank so much!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Editors IDEs

From novice to tech pro — start learning today.