PDA

View Full Version : مشکل در پیدا کردن شرط پایان پیمایش و چاپ گره های یک لیست دو پیوندی حلقوی



sina1370
یک شنبه 09 اسفند 1388, 12:24 عصر
سلام من با یه مشکل کوچیک مواجه شدم اونم اینکه نمیدونم شرط پایان پیمایش(حلقه) هنگام
نمایش داده های نودها رو چی بذارم ؟؟؟ مشکل اصلی اینه که وقتی به نود آخر میرسم شرط برقرار شده و از حلقه خارج مشیم

توجه کنید که یک لیست پیوندی دو طرفه حلقوی هستش و اینم شرط پایان منه :



while(temp->rLink != head)
{
cout<<temp->name<<" ";
temp = temp->rLink;

}



اما وقتی temp == last یا آخرین گره میشه شرط برقرار شده و ازحلقه خارج میشه بنابرین داده ای آخرین نود چاپ یا نمایش داده نمیشه من خودم از یه ترفند دیگه استفاده کردم اونم اینه که
آخرین نود رو بعد از حلقه چاپ کردم چون اشاره گر temp تا آخرین نود میره و متوقف میشه
یعنی بعد از حلقه نوشتم :


cout<<temp->name<<" "; // my solution ::: rahe hale man in bood


حالا ممنون میشم اگه دوستان راه حل بهتری ارائه بدن سورس برنامه رو هم قرار میدم
ممنون میشم اگه کمکم کنید....

sina1370
یک شنبه 09 اسفند 1388, 12:34 عصر
//################################################## #########################################
//## Ring 2 Linkedlist by sina saeedi
//## feb 28, 2010
//################################################## #########################################

//In file dar Codeblocks 8 neveshte va ba MinGW compile shode mitonid az vStudio ham
//estefade konid...

#include <iostream>
#include <conio.h>
#include <string.h>

//************************************************** *****************************************
// Global declerations and options
using namespace std; //Using for GCC and Visual studio
class list; //Forward decleration

//************************************************** *****************************************
//node class for a ring 2 linkedlist
class node
{
friend class list; //using all this class members for manuplating linklist in list class
private :
char name[30];
node *rLink;
node *lLink;
};

//************************************************** *****************************************
class list
{
private:
node *head; //point to first node
public:
list ( );
void create_First_Node(node *newItem ); //if list is empty call this
void addNode_ToFront (node *newItem ); //add a node before head if empty create head
void addNode_ToRear (node *newItem ); //add a node after last node if empty create head
void addNode_BeforeX (node *newItem, node *X ); //Find X by name and insert a node before X
void addNode_AfterX (node *newItem, node *X); //Find X by name and insert a node after X
// node *delNode( );
bool isEmpty();
node *findX(node *keyNode); // find node by a search key in linear search and return a pointer to it
node *getData(); //get data for a node(here a instance name)
void printLST(); //Show List from head to last (MY PROBLEM HERE)::moshkel in ghesmat ast
};
//-------------------------------------------------------------------------------------------
list :: list() //constructor of linked list set head to NULL means that list in first is empty
{
head = NULL;
}
//-------------------------------------------------------------------------------------------
void list :: create_First_Node(node *newItem) // Create first node
{
head=newItem;
head->rLink = head;
head->lLink = head;
}
//-------------------------------------------------------------------------------------------
void list :: addNode_ToFront(node *newItem)
{

if(isEmpty())
create_First_Node(newItem);
else
{

newItem->rLink = head;
newItem->lLink= head->lLink;
head->lLink->rLink=newItem;
head->lLink = newItem;
head = newItem;
}
}
//-------------------------------------------------------------------------------------------
void list :: addNode_ToRear(node *newItem)
{

if(isEmpty())
create_First_Node(newItem);
else
{
newItem->lLink = head->lLink;
newItem->rLink = head;
head->lLink->rLink=newItem;
head->lLink = newItem;
}
}
//-------------------------------------------------------------------------------------------
void list :: addNode_BeforeX(node *newItem, node *X)
{


node *x;
x = findX(X);
if( x != NULL)
{


if( x != head ) //if x is'nt head
{
newItem->rLink = x;
newItem->lLink = x->lLink;
x->lLink->rLink = newItem;
x->lLink = newItem;
}
else if(x == head)
{
addNode_ToFront(newItem);
}
}
else
{
if(isEmpty())
cout<<"\nNo node list is EMPTY...";
else
cout<<"sorry...phrase Not found !!";
}

}
//-------------------------------------------------------------------------------------------
void list :: addNode_AfterX(node *newItem, node *X)
{

node *x;
x = findX(X);
if( x != NULL)
{

if(x->rLink != head) //if x is'nt last
{
newItem->lLink = x;
newItem->rLink = x->rLink;
x->rLink->lLink = newItem;
x->rLink = newItem;
}
else if(x->rLink == head)
{
addNode_ToRear(newItem);
}

}
else
{
if(isEmpty())
cout<<"\nNo node list is EMPTY...";
else
cout<<"sorry...phrase Not found !!";
}

}
//-------------------------------------------------------------------------------------------
bool list :: isEmpty()
{
return (head == NULL);
}

//-------------------------------------------------------------------------------------------
node* list :: findX(node *keyNode)
{
if(isEmpty())
return NULL;
else
{
node *temp;
temp = head;
while(strcmp(temp->name,keyNode->name))
temp = temp->rLink;
if( strcmp(temp->name,keyNode->name) == 0 )
return temp;
else
return NULL;
}

}
//-------------------------------------------------------------------------------------------
node* list :: getData()
{
node *temp;
temp = new node();
char buf[30];
cout<<"\nEnter name: ";
cin>>buf;
strcpy(temp->name, buf);
return temp;
}
//-------------------------------------------------------------------------------------------
//MY PROBLEM ***
void list :: printLST()
{
if(isEmpty())
cout<<"\nNo node list is EMPTY...";
else
{
node *temp;
temp=head;
if(temp->rLink == head && temp->lLink == head)
cout<<temp->name;
else
{

while(temp->rLink != head)
{
cout<<temp->name<<" ";
temp = temp->rLink;
}

cout<<temp->name<<" "; // my solution (rahe hale man in bood !!!!!)
}

}

}
//************************************************** *****************************************
//************************************************** *****************************************
void menu()
{
cout<<"\n################################################ #######"
<<"\n1-Add to FRONT"
<<"\n2-Add to REAR"
<<"\n3-Add BEFORE a node(Node fine by search in list)"
<<"\n4-Add AFTER a node(Node fine by search in list)"
<<"\n5-Show List"
<<"\n6-Exit"
<<"\n################################################ #######"
<<"\nEnter your choose :";

}
//************************************************** *****************************************
int main()
{
list *LIST;
node *temp1,*temp2;
int id;

while(1)
{

menu();
cin>>id;
switch(id)
{

case 1:
temp1=LIST->getData();
LIST->addNode_ToFront(temp1);
break;

case 2:
temp1=LIST->getData();
LIST->addNode_ToRear(temp1);
break;

case 3:
temp1=LIST->getData();
cout<<"\nNow enter for search :";
temp2=LIST->getData();
LIST->addNode_BeforeX(temp1, temp2);
break;

case 4:
temp1=LIST->getData();
cout<<"\nNow enter for search :";
temp2=LIST->getData();
LIST->addNode_AfterX(temp1, temp2);
break;

case 5:
LIST->printLST();
break;

case 6:
cout<<"\nPress any key to exit...";
getch();
exit(0);

default:
cout<<"\nPlease enter a valid choose!!!";
}


}
return 0;
}