الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في برنامج اللنكد لست

مغلق
بدأه مبرمجة ++C في 20 أكتوبر 2005 · 20 رد · 1,381 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لدي مشكلة في البرنامج لا اعلم ماهي

مرة تظهر شاشة سواداء

ومرة يظهر خطأ في { يقول انه انتهي البرنامج

ولم افهم في الحقيقة مايقصد :blink:

#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<cstring>
//==============================//
//	Node Declaration
	template <class  TYPE> 
	struct NODE 
   {
    TYPE    data;
    NODE   *link;
   }; //  End of Node Declaration

//	Student data Declaration
	template <class  TYPE> 
	struct	student
	{
  TYPE	ID;
  TYPE	level;
  TYPE	phone;
  KEYTYPE  *name;

  student()
  {
 	 for(int i=0; i<150; i++)
    *(name+i) = NULL;
 	 ID = 0;
 	 level = 0;
 	 phone = 0;

 	 ifstream file("student.txt");
 	 if(!file)
    cout << "/aError Opening File/n";
 	 else
    while(!file.eof())
    {
   	 student<TYPE> s;

   	 s.getline(name,150,'/n');
   	 file >> s.ID:
   	 file >> s.level;
   	 file >> s.phone;
    }
   	 file.close();
  };
  

//	List Class Declaration

	template <class  TYPE, class KTYPE> 
	class List  
    {
      private:
        NODE<TYPE> *head;
        NODE<TYPE> *pos;
        NODE<TYPE> *rear;
        int         count;

//      Function Declarations
        bool  _insert  (NODE<TYPE>   *pPre,   
                        TYPE          dataIn);
        void  _delete  (NODE<TYPE>   *pPre,
                        NODE<TYPE>   *pLoc,
                        TYPE         *dataOutPtr);
        bool  _search  (NODE<TYPE>  **pPre,
                        NODE<TYPE>  **pLoc,
                        KTYPE         key);

      public: 
        void        buildList	(TYPE );
        List (void);
       ~List (void);
        int        addNode      (TYPE   dataIn);
        bool       removeNode   (KTYPE  key, 
                                 TYPE  *dataOutPtr);
        bool       retrieveNode (KTYPE  Argu, 
                                 TYPE&  dataOut);
        bool       getNext      (int    fromWhere,  
                                 TYPE&  dataOut);
        int        listCount     (void);
        bool       emptyList     (void);
        bool       fullList      (void); 
     void   displayList    (void);
     void      displayByLevel (void);
    
    }; // class List 

//  End of List Class Declaration

template<class TYPE, class KTYPE> 
List<TYPE, KEYTYPE > :: buildList( int &list)
{
	student s;

	ifstream file("student.txt");

	if(!file)
  cout << "/aError Opening File/n";
	else
  while(!file.eof())
  {	
 	 student<TYPE> s;
 	 s.getline(name,150,'/n');
 	 file >> s.ID:
 	 file >> s.level;
 	 file >> s.phone;
  }
  file.close();

  _search(s.name,&pPre,&pLoc);
  _insert(s,pPre);
  s.name = new char[150];
}
/*  =============== List Constructor  ==============	
	Initialize the list.
   Pre    Class is being instantiated
   Post   Class instantiated and initialized
*/
template <class TYPE, class KTYPE>
List<TYPE, KTYPE> :: List (void)   
{
//	Statements 
	head     = NULL;
	pos      = NULL;
	rear     = NULL;
	count    = 0;
} //  List Constructor 

/*	==================== addNode =================== 
	Inserts data into linked list.
    Pre     dataIn contains data to be inserted
    Post    Data inserted or error
    Return -1 if overflow, 
            0 if successful,
            1 if duplicate key
*/
template <class TYPE, class KTYPE> 
int List<TYPE, KTYPE> :: addNode (TYPE dataIn)
{
//	Local Definitions 
	bool  found;
	bool  success;

	NODE<TYPE>  *pPre;
	NODE<TYPE>  *pLoc;

//  Statements 
	found = _search (&pPre, &pLoc, dataIn.key);
	if (found)
    // Duplicate keys not allowed 
    return (+1);

	success = _insert (pPre,  dataIn);
	if (!success)
    // Overflow 
    return (-1);
	return (0);
}	//  addNode 

/*	===================== _insert ==================== 
	Inserts data into a new node in the linked list.
    Pre     Insertion location identified by pPre
            dataIn contains data to be inserted
    Post    data inserted in linked list or overflow
    Return  true  if successful, false if overflow
*/
template <class TYPE, class KTYPE>
bool List<TYPE, KTYPE> :: _insert (NODE<TYPE> *pPre,  
                                   TYPE        dataIn)
{
//	Local Definitions 
	NODE <TYPE>  *pNew;

//	Statements 
	if (! (pNew = new NODE<TYPE>))
    return false;

	pNew->ID = dataIn; 
	pNew->link = NULL; 
   
	if (pPre == NULL)
    {
     //  Adding before first node or to empty list. 
     pNew->link = head;
     head = pNew;
    } // if pPre 
	else
     {
      // Adding in middle or at end 
      pNew->link  = pPre->link;
      pPre->link  = pNew;
     } // if else  
  
      // Now check for add at end of list 
      if (pNew->link == NULL)
         // Adding to empty list. Set rear  
         rear = pNew;

	count++;

	return true;
}	// _insert 

/*  ================== removeNode ================== 
	Removes data from linked list. 
    Pre    dltkey is identifier of node to be deleted
           pDataOut is pointer to data variable to 
           receive a copy of the deleted data
    Post   data copied to output variable and node
           deleted or not found
    Return false if not found
           true  if deleted
*/
template <class TYPE, class KTYPE>
bool List<TYPE, KTYPE> ::  
          removeNode (KTYPE dltkey, TYPE *pDataOut)
{
//	Local Definitions 
	bool         found;
	NODE<TYPE>  *pPre;
	NODE<TYPE>  *pLoc;

//	Statements 
	found = _search (&pPre, &pLoc, dltkey);
	if (found)
     _delete (pPre, pLoc, pDataOut);
	return found;
} // removeNode

/*	=================== _delete ================== 
	Deletes data from a linked list and returns 
	data to calling module.
    Pre  pPre is a pointer to predecessor node
         pLoc is a pointer to target node
         pDataOut is pointer to output data area
    Post Data have been deleted and returned 
         Data memory has been recycled
*/
template <class TYPE, class KTYPE>
void List<TYPE, KTYPE> :: _delete (NODE<TYPE>   *pPre,
                                   NODE<TYPE>   *pLoc, 
                                   TYPE         *pDataOut) 
{
//	Statements 
	*pDataOut = pLoc->ID;
	if (pPre == NULL)
     // Deleting first node 
     head = pLoc->link;  
	else
     // Deleting any other node
     pPre->link = pLoc->link;
  
	// Test for deleting last node 
	if (pLoc->link == NULL)
    rear = pPre;

	count--;
	delete pLoc;
  
	return;
}	//  _delete 

/*	=================== retrieveNode ================== 
	Interface to search function. 
    Pre    key is the search argument
           dataOut is variable to receive data
    Post   dataOut contains located data if found
           if not found, contents are unchanged
    Return true if successful, false if not found
*/

template <class TYPE, class KTYPE>
bool List<TYPE, KTYPE> 
         :: retrieveNode (KTYPE  key, TYPE&  dataOut)
{
//	Local Definitions 
	bool          found;
	NODE <TYPE>  *pPre;
	NODE <TYPE>  *pLoc;

//	Statements 
	found = _search (&pPre, &pLoc, key);
	if (found)
    dataOut = pLoc->ID;
	return found;
}	// retrieveNode 

/*	==================== _search =================== 
	Searches list and passes back address of node 
	containing target and its logical predecessor.
    Pre    pPre is pointer variable for predecessor
           pLoc is pointer variable for found node
           key  is search argument
    Post   pLoc points to first node equal/greater key 
           -or- null if target > key of last node
           pPre points to largest node smaller than key
           -or- null if target < key of first node
    Return true if successful, false if not found
*/
template <class TYPE, class KTYPE> 
bool List<TYPE, KTYPE> :: _search (NODE<TYPE> **pPre,  
                                   NODE<TYPE> **pLoc,
                                   KTYPE        key)
{
//	Statements 
	*pPre  = NULL;
	*pLoc  = head;
	if (count == 0)
     return false;

	// Test for argument > last node in list 
	if (key > rear->ID.key) 
    {
     *pPre = rear;
     *pLoc = NULL;
     return false;
    } // if 

	while (key > (*pLoc)->ID.key)
    {
     //  Have not found search argument location 
     *pPre = *pLoc;
     *pLoc = (*pLoc)->link;
    } // while 

	if (key == (*pLoc)->ID.key)
     //   argument found--success 
     return true;
	else
     return false;
}	//  _search 

/*	=============== emptyList ============== 
	Returns Boolean indicating whether the
	list is empty.
    Pre    Nothing 
    Return true if empty, false if list has data 
*/
template<class TYPE, class KTYPE> 
bool List<TYPE, KTYPE> :: emptyList (void) 
{
//	Statements 
  return (count == 0);
}	//  emptyList 

/*	=================== fullList ================== 
	Returns Boolean indicating whether the list is full
	or has room for more data. 
    Pre    Nothing 
    Return true if full, false if room for another node
*/
template <class TYPE, class KTYPE>
bool List<TYPE, KTYPE> :: fullList (void) 
{
//	Local Definitions  
	NODE<TYPE>  *temp;

//	Statements 
	if (temp = new NODE<TYPE>)
    {
     delete temp;
     return false;
    } // if

	// Dynamic memory full 
	return true;
}	// fullList 

/*	==================== listCount ==================== 
	Returns integer representing number of nodes in list.
    Pre     Nothing
    Return  count for number of nodes in list
*/
template <class TYPE, class KTYPE>
int List<TYPE, KTYPE> :: listCount(void) 
{
//	Statements 
	return count;	
}	// listCount

/*	====================== getNext ===================== 
	getNext traverses a linked list. Each call either starts 
	at the beginning of the list or returns the location of  
	the element in the list that was last returned.
    Pre   fromWhere is 0 to start at the first element
          dataOut is reference to data variable 
    Post   if another element, address placed in output area
    Return true if another element located, 
           false if end of list
*/
template <class TYPE, class KTYPE> 
bool List<TYPE, KTYPE> :: getNext (int    fromWhere,
                                   TYPE&  dataOut)
{
//	Local Definitions 
	bool success;

//	Statements 
	if (fromWhere == 0)
    {
     // Start from first node 
     if (count == 0)
         success = false;
     else
        {
         pos      = head;
         dataOut  = pos->data;
         success  = true;
        } // if else 
    } // if fromwhere is zero
	else
    {
     // Continue from current position 
     if (pos->link == NULL)
         success = false;
     else
        {
         pos      = pos->link;
         dataOut  = pos->data;
         success  = true;
        } // if else 
    } // if fromWhere else 

	return success;
}	// getNext

/*	=============== Destructor ============== 
	Deletes all data in list and recycles memory
    Pre    List is being deleted 
    Post   Data and class structure have been deleted
*/
template<class TYPE, class KTYPE> 
List<TYPE, KTYPE > :: ~List (void) 
{
//	Local Definitions 
	NODE<TYPE>   *deletePtr;

//	Statements 
	if (head)
    {
     while (count > 0) 
        {
         deletePtr = head;
         head      = head->link; 
         count--;
         delete  deletePtr; 
        } // while
    } //  if 
}	// Destructor 
//====================================//
template<class TYPE, class KTYPE> 
void List::displayList()
{
	student *pWalk = head;

	if(count == 0)
  cout<<"\n Sorry, the student list is empty!\n";

	else
	{
  cout << "\a\n**** Begin Students Print ****\n\n";

  while(pWalk != NULL)
  {
 	 pWalk->displayList();
 	 pWalk = pWalk->link;
  }
  cout << "\a\n**** End Students Print ****\n\n";
	}
}
//===================================//
template<class TYPE, class KTYPE> 
displayByLevel()
{
  المطلوب هنا طباعة اسماء الطلاب الموجودين في نفس المستوى
انا اقوم بادخال المستوى وهو يقوم بالبحث عن جميع الطلالاب في نفس المستوى وطباعتهم
اود الفكرة التي استخدمها هنا

}

//======================================//
int main()
{
	student s;
	List l;
	char ch;
	//bool valid = true;
	int test, a;

	ifstream file;

	if(file.fail())
  cout<<"\n\a The file: student.txt can NOT be opened! \n\n";

	else
  l.buildList(a);
	do
	{
  cout<< " ** Student Menu **\n"
 	 << " =====================\n"
 	 << "  1. Add a student\n"
 	 << "  2. Delete a student\n"
 	 << "  3. Retrieve a student\n"
 	 << "  4. Display all student\n"
 	 << "  5. Display all student in given level\n"
 	 << "  6. Exit\n"
 	 << " ** Enter your choice ** ";
  cin >> ch;
  
  if(ch == '1' || ch =='2' || ch =='3' || ch =='4' || ch == '5')
  switch(ch)
  {
 	 case '1':
    system("cls");
    cout<<"Enter the new student info: \nName of student: ";
    cin.ignore();
    cin.getline(std.name, 150, '\n');
    cout<<"The ID: "; 
    cin>>s.ID;
    cout<<"Level: ";
    cin>>s.level; 
    cout<<"Phone Numbers: ";
    cin>>s.phone;
    test = l.addStudent( s );

    if( test == 0 )
   	 cout<< "** You add new student succesfully **\n";
    else
    {
   	 if( test == 1 )
      cout <<" NOT added!\n"
        <<" the student name you entered is already in the list\n\n";
   	 else
      cout<<" NOT added!\n"
     	 <<"MEMORY OVERFLOW!\n\n";
    }
    break;

 	 case '2':
    system("cls");
    cout<< "Enter the name of a student to delete it: ";
    cin.ignore();
    cin.getline( s.name, 150, '\n');
    if(l.removeStudent( s.name, &s))
    {
   	 cout<< "The following student is deleted succesfully: \n";
   	 std.displayStudent();
    }
    else
   	 cout<<" NO student with this name ! \n\n";
    break;

 	 case '3':
    system("cls");
    cout<< "Enter the name of a studen to retrieve its info: ";
    cin.ignore();
    cin.getline(s.name, 150, '\n');
    if (list.retrieveStudent(s.name, s))
   	 std.displayStudent();
    else
   	 cout<<" NO studen with this name !\n\n";
    break;

 	 case '4':
    system("cls");
    l.displayList();
    break;	

 	 case  '5':
    system("cls");
    l.displayByLevel();
    break;
  }
  
  else
 	 if(ch != '5')
    cout << " \n\a Invalid choice! Choices are <1,2,3,4,5>\n\n";

	}while(ch != '6');

	return 0;
}
#2

ارجو المساعدة عاجلا

#3

هـناك أخطاء كثيرة لا أستطيع متابعتها في الكـود وكلها تظهر حينما تقومين بتعـديل الـ fatel error المـوجود في الصنف student ، قومي بإضافـة قوس الإغلاق { قبل آخر قوس في تصريح الصنف ..................... أيضاً لم أجرب طريقتك في تضمين المكتبات بل جربت الطريقـة الجـديدةالتي تتطلب استخدام مساحـة الأسماء القياسية std ....

أعتقد أن هـناك أكثر من 100 خطأ في هذا الكـود ... جميعها في القوالب وهـنا مكمن الصعوبة ... حاولي تعـديل الخطأ القاتل وإضافة قوس الإغلاق ثم قومي بمراجعـة الكـود وضعيه مرة أخرى هـنا ...

وأنا آسف لأني لم أستطع تعـديل جميع تلك الأخطاء .. حاولت تعـديل بعضها وهي بسيطـة ومعروفـة... والسبب في ذلك هـو أني لم أقـم بكتابة هذا الكـود...

هذا هـو الصنف student بعد إضافة القوس إليه:

struct student
{
 TYPE ID;
 TYPE level;
 TYPE phone;
 KEYTYPE  *name;

 student()
 {
  for(int i=0; i<150; i++)
   *(name+i) = NULL;
  ID = 0;
  level = 0;
  phone = 0;

  ifstream file("student.txt");
  if(!file)
   cout << "/aError Opening File/n";
  else
   while(!file.eof())
   {
    student<TYPE> s;

    s.getline(name,150,'/n');
    file >> s.ID:
    file >> s.level;
    file >> s.phone;
   }
    file.close();
}   /* هـنا قوس الإغلاق */
 };
#4

لا اعتقد هناك اختلاف في تضمين المكتبات

فمثلا <iostream.h>

مثل <iostream> لكن هنا تحتاج لتضمين 

std :: cout

والاولى مختصرة ووالافضل في نظري
#5

من قال أن هـناك خطأ في تضمين المكتبات

لكن طريقـتك المستخدمـة صحيح أنها مختصرة ... ولكنها ليست الأفضل

فاستخدام مكتبة iostream التي تدعـم مساحـة الأسماء القياسية std أفضل من المكتبة iostream القديمـة وأنا جربت طريقتك قبل أن أتحـول إلى الطريقة الجـديدة .. وجدت أن هذه المكتبة التي لا تدعـم مساحات الأسماء لا تقوم بإظهار بعض الأخطاء وخاصـة حينما أقوم بزيادة تحميل معامل الإدراج أما المكتبة الجـديدة فهي تقوم بإظهار هذه الأخطاء....

بالمناسبة هل نجحت في تنفيذ الكـود .. أما أن هـناك أخطاء غير معروفة..

#6

هل تقصد بان استخدام نفس كتابتي مع std هي الافضل

ام تقصد مكتبة اخرى جديدة لم افهم ؟؟

#7

هذا الكود بعد التعديل

فيه اشياء ماضفتها للبرنامج

لاني ابي الكود الاساسي يضبط معي .. وللاسف الي مزعجني انا لبرنامج معلق على التايب

TYPE. KTYPE

مادري وش المشكلة ؟

#include<iostream>
using std::cout;
using std::cin;
using std::endl;
//==============***
#include<fstream>
using std::ifstream;
using std::ofstream;
//==============***
#include<cstdlib>
#include<cstring>
//==============================//
//	Node Declaration
	template <class  TYPE> 
	struct NODE 
   {
    TYPE    data;
    NODE   *link;
   }; //  End of Node Declaration

//	Student data Declaration
	template <class  TYPE, class KTYPE> 
	struct	student
	{
  TYPE	ID;
  TYPE	level;
  TYPE	phone;
  KTYPE	*name;

  student()
  {
 	 for(int i=0; i<150; i++)
    *(name+i) = NULL;
 	 ID = 0;
 	 level = 0;
 	 phone = 0;

 	 ifstream file("student.txt");

 	 if(!file)
    cout << "/aError Opening File/n";
 	 else
    while(!file.eof())
    {
   	 student<TYPE> s;

   	 s.getline(name,150,'/n');
   	 file >> s.ID:
   	 file >> s.level;
   	 file >> s.phone;
    }
 	 file.close();
  }
	};
  

//	List Class Declaration

	template <class  TYPE, class KTYPE> 
	class List  
    {
      private:

//  Variables Declarations  
        NODE<TYPE> *head;
        NODE<TYPE> *pos;
        NODE<TYPE> *rear;
        int         count;

//      Function Declarations
        bool  _insert  (NODE<TYPE>  *pPre, TYPE  dataIn);   
                      
        void  _delete  (NODE<TYPE>  *pPre, NODE<TYPE> *pLoc,TYPE *dataOutPtr);
                       
                        
        bool  _search  (NODE<TYPE>  **pPre, NODE<TYPE>  **pLoc, KTYPE  key);
                     
                        

      public: 

        List (void);
       ~List (void);
     void       buildList	(TYPE &);
        int       addNode        (TYPE   dataIn);
        bool      removeNode     (KTYPE  key, TYPE  *dataOutPtr);
                                
        bool      retrieveNode   (KTYPE  Argu, TYPE&  dataOut); 
                               
        bool      getNext        (int fromWhere, TYPE&  dataOut); 
                                 
        int       listCount      (void);
        bool      emptyList      (void);
        bool      fullList       (void); 
     void   print 	 (void);
     void   displayList    (void);
     void      displayByLevel (void);
    
    }; // class List 

//  End of List Class Declaration

/*  =============== List Constructor  ==============	
	Initialize the list.
   Pre    Class is being instantiated
   Post   Class instantiated and initialized
*/
template <class TYPE, class KTYPE>
List<TYPE, KTYPE> :: List (void)   
{
//	Statements 
	head     = NULL;
	pos      = NULL;
	rear     = NULL;
	count    = 0;
} //  List Constructor 
//================================================
template<class TYPE, class KTYPE> 
void List<TYPE, KTYPE > :: buildList( int &list)
{
	student<TYPE> s;

	ifstream file("student.txt");

	if(!file)
  cout << "/n/aError Opening File/n";
	else
  while(!file.eof())
  {	
 	 student<TYPE> s;
 	 s.getline(name,150,'/n');
 	 file >> s.ID:
 	 file >> s.level;
 	 file >> s.phone;
  }
  file.close();

  _search(s.name,&pPre,&pLoc);
  _insert(s,pPre);
  s.name = new char[150];
}//åäÇ ÎØÃ áÇÃÚáã áãÇÐÇ ¿¿æåæ Ýí äæÚí ÇáÏÇÊÇ æáßäí ÇÍÊÇÌ type ,,ktype
/*	==================== addNode =================== 
	Inserts data into linked list.
    Pre     dataIn contains data to be inserted
    Post    Data inserted or error
    Return -1 if overflow, 
            0 if successful,
            1 if duplicate key
*/
template <class TYPE, class KTYPE> 
int List<TYPE, KTYPE> :: addNode (TYPE dataIn)
{
//	Local Definitions 
	bool  found;
	bool  success;

	NODE<TYPE>  *pPre;
	NODE<TYPE>  *pLoc;

//  Statements 
	found = _search (&pPre, &pLoc, dataIn.key);
	if (found)
    // Duplicate keys not allowed 
    return (+1);

	success = _insert (pPre,  dataIn);
	if (!success)
    // Overflow 
    return (-1);
	return (0);
}	//  addNode 

/*	===================== _insert ==================== 
	Inserts data into a new node in the linked list.
    Pre     Insertion location identified by pPre
            dataIn contains data to be inserted
    Post    data inserted in linked list or overflow
    Return  true  if successful, false if overflow
*/
template <class TYPE, class KTYPE>
bool List<TYPE, KTYPE> :: _insert (NODE<TYPE> *pPre,  
                                   TYPE        dataIn)
{
//	Local Definitions 
	NODE <TYPE>  *pNew;

//	Statements 
	if (! (pNew = new NODE<TYPE>))
    return false;

	pNew->ID = dataIn; 
	pNew->link = NULL; 
   
	if (pPre == NULL)
    {
     //  Adding before first node or to empty list. 
     pNew->link = head;
     head = pNew;
    } // if pPre 
	else
     {
      // Adding in middle or at end 
      pNew->link  = pPre->link;
      pPre->link  = pNew;
     } // if else  
  
      // Now check for add at end of list 
      if (pNew->link == NULL)
         // Adding to empty list. Set rear  
         rear = pNew;

	count++;

	return true;
}	// _insert 

/*  ================== removeNode ================== 
	Removes data from linked list. 
    Pre    dltkey is identifier of node to be deleted
           pDataOut is pointer to data variable to 
           receive a copy of the deleted data
    Post   data copied to output variable and node
           deleted or not found
    Return false if not found
           true  if deleted
*/
template <class TYPE, class KTYPE>
bool List<TYPE, KTYPE> ::  
          removeNode (KTYPE dltkey, TYPE *pDataOut)
{
//	Local Definitions 
	bool         found;
	NODE<TYPE>  *pPre;
	NODE<TYPE>  *pLoc;

//	Statements 
	found = _search (&pPre, &pLoc, dltkey);
	if (found)
     _delete (pPre, pLoc, pDataOut);
	return found;
} // removeNode

/*	=================== _delete ================== 
	Deletes data from a linked list and returns 
	data to calling module.
    Pre  pPre is a pointer to predecessor node
         pLoc is a pointer to target node
         pDataOut is pointer to output data area
    Post Data have been deleted and returned 
         Data memory has been recycled
*/
template <class TYPE, class KTYPE>
void List<TYPE, KTYPE> :: _delete (NODE<TYPE>   *pPre,
                                   NODE<TYPE>   *pLoc, 
                                   TYPE         *pDataOut) 
{
//	Statements 
	*pDataOut = pLoc->ID;
	if (pPre == NULL)
     // Deleting first node 
     head = pLoc->link;  
	else
     // Deleting any other node
     pPre->link = pLoc->link;
  
	// Test for deleting last node 
	if (pLoc->link == NULL)
    rear = pPre;

	count--;
	delete pLoc;
  
	return;
}	//  _delete 

/*	=================== retrieveNode ================== 
	Interface to search function. 
    Pre    key is the search argument
           dataOut is variable to receive data
    Post   dataOut contains located data if found
           if not found, contents are unchanged
    Return true if successful, false if not found
*/

template <class TYPE, class KTYPE>
bool List<TYPE, KTYPE> 
         :: retrieveNode (KTYPE  key, TYPE&  dataOut)
{
//	Local Definitions 
	bool          found;
	NODE <TYPE>  *pPre;
	NODE <TYPE>  *pLoc;

//	Statements 
	found = _search (&pPre, &pLoc, key);
	if (found)
    dataOut = pLoc->ID;
	return found;
}	// retrieveNode 

/*	==================== _search =================== 
	Searches list and passes back address of node 
	containing target and its logical predecessor.
    Pre    pPre is pointer variable for predecessor
           pLoc is pointer variable for found node
           key  is search argument
    Post   pLoc points to first node equal/greater key 
           -or- null if target > key of last node
           pPre points to largest node smaller than key
           -or- null if target < key of first node
    Return true if successful, false if not found
*/
template <class TYPE, class KTYPE> 
bool List<TYPE, KTYPE> :: _search (NODE<TYPE> **pPre,  
                                   NODE<TYPE> **pLoc,
                                   KTYPE        key)
{
//	Statements 
	*pPre  = NULL;
	*pLoc  = head;
	if (count == 0)
     return false;

	// Test for argument > last node in list 
	if (key > rear->ID.key) 
    {
     *pPre = rear;
     *pLoc = NULL;
     return false;
    } // if 

	while (key > (*pLoc)->ID.key)
    {
     //  Have not found search argument location 
     *pPre = *pLoc;
     *pLoc = (*pLoc)->link;
    } // while 

	if (key == (*pLoc)->ID.key)
     //   argument found--success 
     return true;
	else
     return false;
}	//  _search 

/*	=============== emptyList ============== 
	Returns Boolean indicating whether the
	list is empty.
    Pre    Nothing 
    Return true if empty, false if list has data 
*/
template<class TYPE, class KTYPE> 
bool List<TYPE, KTYPE> :: emptyList (void) 
{
//	Statements 
  return (count == 0);
}	//  emptyList 

/*	=================== fullList ================== 
	Returns Boolean indicating whether the list is full
	or has room for more data. 
    Pre    Nothing 
    Return true if full, false if room for another node
*/
template <class TYPE, class KTYPE>
bool List<TYPE, KTYPE> :: fullList (void) 
{
//	Local Definitions  
	NODE<TYPE>  *temp;

//	Statements 
	if (temp = new NODE<TYPE>)
    {
     delete temp;
     return false;
    } // if

	// Dynamic memory full 
	return true;
}	// fullList 

/*	==================== listCount ==================== 
	Returns integer representing number of nodes in list.
    Pre     Nothing
    Return  count for number of nodes in list
*/
template <class TYPE, class KTYPE>
int List<TYPE, KTYPE> :: listCount(void) 
{
//	Statements 
	return count;	
}	// listCount

/*	====================== getNext ===================== 
	getNext traverses a linked list. Each call either starts 
	at the beginning of the list or returns the location of  
	the element in the list that was last returned.
    Pre   fromWhere is 0 to start at the first element
          dataOut is reference to data variable 
    Post   if another element, address placed in output area
    Return true if another element located, 
           false if end of list
*/
template <class TYPE, class KTYPE> 
bool List<TYPE, KTYPE> :: getNext (int    fromWhere,
                                   TYPE&  dataOut)
{
//	Local Definitions 
	bool success;

//	Statements 
	if (fromWhere == 0)
    {
     // Start from first node 
     if (count == 0)
         success = false;
     else
        {
         pos      = head;
         dataOut  = pos->data;
         success  = true;
        } // if else 
    } // if fromwhere is zero
	else
    {
     // Continue from current position 
     if (pos->link == NULL)
         success = false;
     else
        {
         pos      = pos->link;
         dataOut  = pos->data;
         success  = true;
        } // if else 
    } // if fromWhere else 

	return success;
}	// getNext

/*	=============== Destructor ============== 
	Deletes all data in list and recycles memory
    Pre    List is being deleted 
    Post   Data and class structure have been deleted
*/
template<class TYPE, class KTYPE> 
List<TYPE, KTYPE > :: ~List (void) 
{
//	Local Definitions 
	NODE<TYPE>   *deletePtr;

//	Statements 
	if (head)
    {
     while (count > 0) 
        {
         deletePtr = head;
         head      = head->link; 
         count--;
         delete  deletePtr; 
        } // while
    } //  if 
}	// Destructor 
//====================================//
template<class TYPE, class KTYPE> 
void List<TYPE, KTYPE>::displayList()
{
	student *pWalk = head;

	if(count == 0)
  cout<<"\n Sorry, the student list is empty!\n";

	else
	{
  cout << "\a\n**** Begin Students Print ****\n\n";

  while(pWalk != NULL)
  {
 	 pWalk->displayList();
 	 pWalk = pWalk->link;
  }
  cout << "\a\n**** End Students Print ****\n\n";
	}
}
//===================================//
template<class TYPE, class KTYPE> 
displayByLevel()
{
}
//================================================
void instructions()
{
	cout    << " ** Student Menu **\n"
 	 << " =====================\n"
 	 << "  1. Add a student\n"
 	 << "  2. Delete a student\n"
 	 << "  3. Retrieve a student\n"
 	 << "  4. Display all student\n"
 	 << "  5. Display all student in given level\n"
 	 << "  6. Exit\n";
}
//  End function instructions
//======================================//
int main()
{
	student<int,int> s;
	List<int,int> l;
	char ch;
	//bool valid = true;
	int test, a;

	ifstream file;

	if(file.fail())
  cout<<"\n\a The file: student.txt can NOT be opened! \n\n";

	else
  l.buildList(a);

	instructions();
	do
	{	
  cout << " ** Enter your choice ** ";
  cin >> ch;
  
  if(ch == '1' || ch =='2' || ch =='3' || ch =='4' || ch == '5')
  switch(ch)
  {
 	 case '1':
    system("cls");
    cout<<"Enter the new student info: \nName of student: ";
    cin.ignore();
    cin.getline(s.name, 150, '\n');
    cout<<"The ID: "; 
    cin>>s.ID;
    cout<<"Level: ";
    cin>>s.level; 
    cout<<"Phone Numbers: ";
    cin>>s.phone;
    test = l.addNode(s);

    if( test == 0 )
   	 cout<< "** You add new student succesfully **\n";
    else
    {
   	 if( test == 1 )
      cout <<" NOT added!\n"
        <<" the student name you entered is already in the list\n\n";
   	 else
      cout<<" NOT added!\n"
     	 <<"MEMORY OVERFLOW!\n\n";
    }
    break;

 	 case '2':
    system("cls");
    cout<< "Enter the name of a student to delete it: ";
    cin.ignore();
    cin.getline( s.name, 150, '\n');
    if(l.removeNode ( s.name, &s))
    {
   	 cout<< "The following student is deleted succesfully: \n";
   	 l.displayList();
    }
    else
   	 cout<<" NO student with this name ! \n\n";
    break;

 	 case '3':
    system("cls");
    cout<< "Enter the name of a studen to retrieve its info: ";
    cin.ignore();
    cin.getline(s.name, 150, '\n');
    if (l.retrieveNode(s.name, &s))
   	 l.displayList();
    else
   	 cout<<" NO studen with this name !\n\n";
    break;

 	 case '4':
    system("cls");
    l.displayList();
    break;	

 	 case  '5':
    system("cls");
    l.displayByLevel();
    break;
  }
  
  else
 	 if(ch != '5')
    cout << " \n\a Invalid choice! Choices are <1,2,3,4,5>\n\n";

	}while(ch != '6');

	return 0;
}
//================================================
#8

أختي العـزيزة...

الذي قصدتـه بالتعامل مع مكتبة iostream التي تدعـم مساحـة الأسماء القياسية std ... هي أنها مكتبة قويـة وتقوم بإكتشاف الأخطاء في وقت الترجمـة وذلك حسب تعاملي معها ... بالنسبة للمكتبة iostream الأخرى والتي ليست من ضمن مساحـة الأسماء القياسية std ... فهي لا تقوم بإكتشاف بعض الأخطاء الصغيرة...

هذا الكـود الذي كتبتيه مليء بالأخطاء الكثيرة الكثيرة جداً ، وليس السبب في أنك لا تعرفين ما تكتبين ، بل إلى أنك لا تعرفين كيف تتعاملين مع القوالب ، حينما يحدث أي خطأ في أي قالب فإن المترجم لن يقول فوراً أن هذا هـو الخطأ وقومي بتعـديلـه ، العـملية أصعب من ذلك بكثير على المترجـم لدرجـة أنه لا يستطيع تحديد الخطأ أو المكان الفعلي للخطأ في القوالب ...... كنت كثيراً ما أقع في نفس أخطاءك حينما ابتدأت في القوالب وقد أكتشفت طريقـة لتدراك خطر هذه القوالب .. قومي بإعادة كتابة الكـود ، وهذه المرة قومي بإلغاء جميع القوالب وقومي بتعـديل أماكن الأنـواع TYPE و KTYPE بالأنـواع التي تريدينها .. قومي بترجمـة الكـود وهذه المرة سيدلك المترجم على الأخطاء الفعلية قومي بتعـديلها ، بعـد ذلك وبعـد أن تتأكدي من نجاح الكـود ، قومي بإضافة القوالب ولكن بحذر فأي خطأ واحد قد لا تجدينـه أبداً....

حتى تتأكدي من صدق كلامي وأن القوالب لا يستطيع المترجم اكتشاف أخطاءها ، فلقد أخطأت خطأًً قواعـدياً بسيطاً وهـو أنك قمت بكتابة نقطتان فوق بعض بدلاً من علامـة الفاصلة المنقوطـة ، وبالرغـم من صغر هذا الخطأ فإن المترجم لن يستطيع اكتشافه...

ملاحـظـة: لا تستعـملي مساحـة الأسماء القياسية std الآن واستخدمي المكتبات القديمـة التي لا تتضمنها ... وفي حال أردت استخدام مساحـة الأسماء القياسية ، فاستخدمي التوجيه العام ، هكذا:

using namespace std;

والسبب في ذلك هـو أن المكتبات التي استخدمتيه مثل cstring لم أجد لها أي توجيه بـ using مثل البقية ، وهذا خطأ لم يكتشفه المترجم بسبب القوالب........

كنت أتـمنى أن أفيدك بأكثر من ذلك ولكني حالياً مشغـول طيلة هذا الأسبوع

#9

بصراحة القوالب مشكلة وماستعملتهاالا بسبب ان الاستاذة طلبت هالشي

والا انا ماحبذها

باسوي طريقتك واحاول

والله يعافيك

#10

اعتقد يمكن تسهيل طريقة Sultan_Althibity عن طريق عمل define# صغير يعرف مثلا TYPE على انها char .. و لما تخلص هذه المرحلة و تريد تحولها الى قالب, تحذف الـ define# و تستخدم template

#11

عدلت في الكود طلع بدون اخطاء بس موراضي يطبع لي الملف ولا يقراه :unsure:

:wacko: احولت عيوني من كثر ماطالعت فيه بدون فايدة

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<cstdlib>

#include<fstream>
using std::ifstream;
using std::ofstream;

#include<cstring>
using namespace std;
/*===========================*/
struct NODE
{
	//NODE	link;  // self-referential poinetr
	int data;
};

struct  student
{
	char	*name;
	int  id;	
	int  level;
	int  phone;
	student *link;


	student()  // constructor
	{
  /*name = new char[150];
  for(int i=0; i<150; i++)
 	 *(name+i) = '\0';

  id	= 0;
  level  = 0;
  phone	= 0;*/
	}

	void displaystudent(void) 
	{
  cout << "   Name    : "<< name << endl
    << "   ID   : "<< id << endl
    << "   Level      : "<< level << endl
    << "   Number of Phone  : "<< phone << endl
    << "---------------------------\n";
	}

};

/*===========================*/
class List
{
private:
	student	*head;
	int  count;	

	bool	_insert(student v_in, student *pPre);
	void	_delete(student *pPre, student *pLoc, student *v_outPtr);
	bool	_search(int target, student **pPre, student **pLoc);

public:
	List(void);
	~List(void);
	void	buildList();
	int  add(student v_in);
	bool	remove(int id, student *v_outPtr);
	bool	retrieve(int id,student& v_out);
	void	displayList(void);
	int  Count(void);

};
/*===========================*/
// constructor
List::List(void)
{
	head	= NULL;
	count	=	0;
}

/*===========================*/
// destructor
List::~List(void)
{
	student *deletePtr;
	if(head)
	{
  while( count > 0 )
  {
 	 deletePtr = head;
 	 head = head->link;
 	 count--;
 	 delete deletePtr;
  }
	}

}

/*===========================*/
void List::buildList()
{
	student vec;
	student *pPre, *pLoc;

	ifstream file;
	file.open("student.txt");

	while(! file.eof())
	{
  file.getline( vec.name , 150, '\n');
  file >> vec.id;
  file >> vec.level;
  file >> vec.phone;
	}

  _search(vec.id,&pPre,&pLoc);
  _insert(vec,pPre);
  vec.name = new char[150];

}
/*===========================*/

// insertion private function
bool List::_insert( student v_in, student *pPre)
{
	student *pNew;
	if(!(pNew = new student))
  return false;  // failed insertion ( memory overflow )

	*pNew  = v_in;
	pNew->link	= NULL;

	if( pPre == NULL ) 
	{ 
  pNew->link	= head;
  head  = pNew;  
	}
	else  
	{
  pNew->link = pPre->link;
  pPre->link = pNew;
	}
	count++;
	return true; // success insertion
}

/*===========================*/
// searching private function
bool List::_search( int target, student **pPre, student **pLoc)
{
	*pPre = NULL; 
	*pLoc = head;

	while( (*pLoc != NULL)  && (target> (*pLoc)->id) )
	{
  *pPre = *pLoc;
  *pLoc = (*pLoc)->link;
	}

	if (*pLoc == NULL) 
  return false;

	if(target < (*pLoc)->id) 
  return true;

	return false; 
}
/*===========================*/

void List::_delete(student *pPre, student *pLoc, student *v_outPtr)
{
	*v_outPtr = *pLoc;

	if(pPre == NULL)
  head = pLoc->link;

	else  
  pPre->link = pLoc->link;

	count--;

	delete pLoc;
}
/*===========================*/

int List::add( student v_in)
{
	student *pPre, *pLoc;

	if(_search(v_in.id, &pPre, &pLoc))
  return 1; 

	if(! _insert(v_in, pPre))
  return -1;   

	return 0; 
}

/*===========================*/

bool List::remove( int target, student *v_outPtr)
{
	student *pPre, *pLoc;

	if( ! _search(target, &pPre, &pLoc)) 
  return false;

	_delete( pPre, pLoc, v_outPtr);  
	return true;
}
/*===========================*/

bool List::retrieve( int target, student &v_out)
{
	student *pPre, *pLoc;

	if (_search(target, &pPre, &pLoc)) 
	{
  v_out = *pLoc;
  return true;
	}

	return false;
}
/*===========================*/
int List::Count()
{
	return count;
}
/*===========================*/

void List::displayList()
{
	student *pWalk = head;
	student s;

	s.displaystudent();
//	l.buildList();

	ifstream file;
	file.open("student.txt");

	if(Count() == 0)
  cout<<"\n Sorry, the student list is empty!\n";
	else
	{
  cout << "\n**** Begin student Print ****\n\n";
  while(pWalk != NULL)
  {
 	 pWalk->displaystudent();
 	 pWalk = pWalk->link;
  }
  cout << "\n**** End student Print ****\n\n";
	}
}
/*===========================*/

int main(void)
{
	char ch;
	bool valid = true;
	student vec;
	int test;
	List list;

	ifstream file;
	file.open( "student.txt");

	if(file.fail())
  cout<<"\nThe file: student.txt can NOT be opened! \n\n";

	else
	{
  list.buildList();
  file.close();
	}
	do
	{
  cout<< "    student Menu\n"
 	 << " =====================\n"
 	 << "  1. Add a student\n"
 	 << "  2. Delete a student\n"
 	 << "  3. Retrieve a student\n"
 	 << "  4. Display all student\n"
 	 << "  5. Exit\n"
 	 << "     Enter your choice: ";
  cin >> ch;
  
  if(ch == '1' || ch =='2' || ch =='3' || ch =='4')
 	 switch(ch)
  {
 	 case '1':
    system("cls");
    cout<<"Enter the new student info: \nName of student: ";
    cin.ignore();
    cin.getline(vec.name, 150, '\n');
    cout<<"ID: "; 
    cin>>vec.id;
    cout<<"Level: ";
    cin>>vec.level; 
    cout<<"phone: ";
    cin>>vec.phone;
    test = list.add( vec );
    if( test == 0 )
   	 cout<< "** You add new student succesfully **\n";
    else
   	 if( test == 1 )
      cout <<" NOT added!\n"
        <<" the student name you entered is already in the list\n\n";
   	 else
      cout<<" NOT added!\n"
     	 <<"MEMORY OVERFLOW!\n\n";
    break;

 	 case '2':
    system("cls");
    cout<< "Enter the name of a student to delete it: ";
    cin.ignore();
    cin.getline( vec.name, 150, '\n');
    if(list.remove( vec.id, &vec))
    {
   	 cout<< "The following student is deleted succesfully: \n";
   	 vec.displaystudent();
    }
    else
   	 cout<<" NO student with this name ! \n\n";
    break;

 	 case '3':
    system("cls");
    cout<< "Enter the name of a student to retrieve its info: ";
    cin.ignore();
    cin.getline(vec.name, 150, '\n');
    if (list.retrieve(vec.id, vec))
   	 vec.displaystudent();
    else
   	 cout<<" NO student with this name !\n\n";
    break;

 	 case '4':
    system("cls");
    list.displayList();
    break;	
  }
  else
 	 if(ch != '5')
    cout << " \n\a Invalid choice! Choices are <1,2,3,4,5>\n\n";

	}while(ch != '5');

	return 0;
}

تم تعديل هذه المشاركة بواسطة مبرمجة ++C في 22 أكتوبر 2005 في 03:03

#12

لم أستطع فهـم تركيب البرنامج .. والعلاقة بين الكائنـات......

كما قلت هـناك أخطاء في منطق البرنامج وليس فقط أخطاء نحوية

أنتي إلى الآن في هذا الكـود لم تستخدمي الفئة Node ولكنك استخدمتيها في النسخـة السابقة حينما كانت توجد قوالب.. وبالتحـديد في الصنف List ...........( حتى تتأكدي قومي بحذف الـ Node من الكـود وستجدين أنه يعـمل) ...

أعضاء الفئة أو الصنف List هي student بينما في الإصدار السابق كانت Node <TYPE> //d ....

هـناك تعـديلات كثيرة وضعتيها في الفئة List عـن الفئة السابقة التي تسخدم القوالب....

لم أفهـم إلى الآن ..أي فئة تقوم بالتخزين هل هي الفئة List أم الفئة Node .....

قمت بتنفيذ البرنامج على Visual C++.Net ، ونجح البرنامج في إضافة الطالب الأول ، قمت بإضافة الطالب الثاني ثم طلبت طباعـة جميع الطلاب وطبع الطالب الأول مرتين ، أضفت الطالب الثالث وطبع جميع الطلاب بشكل صحيح...

بقية المهام مثل الحذف وغيرها لم تنجح (عدا الإضافة وطباعة جميع الطلاب ) .....

أريد توضيح نقطـة هـنا وهي مهـمـة .......... القوالب أو template في أغلب الأحيان تستخدم لتخزين البيانات أي في بنى المعطيات ، بالتالي لا تستخدمي القوالب مع الفئة student .. لأنه ليس له داعي كما أنه يريحك من كثير من الأخطاء التي لم أستطع إلى الآن اكتشافها....

حتى ينجح البرنامج بشكل جيد , عليك أولاً تحديد الفئة التي تقوم بالتخزين هل هي list أو Node ، وأنا أفضل list ، ثانياً عـدلي مهام الحذف والدالة التي تقوم بالإستعلام بواسطـة اسم الطالب ، ثالثاً نفذي البرنامج إذا نجح البرنامج في العـمل (وهـو المفترض لأنـه الكـود لم يبق عليه شيء كثير) فقومي بإضافة القوالب إلى الفئة التي قررتي تخزين البيانات فيها ( List أو student ) لا تضيفي القوالب إلى الفئة student ..... نفذي البرنامج وسينجح بشكل مؤكد ..

هـناك أيضاً بعض الأخطاء الصغيرة ولكن لا داعي لكي تقومي بتعـديلها ... ودعي وقت تعـديلها إلى وقت لاحق... فمثلاً إذا نظرنا لدقيقـة إلى الفئة list نجد أنها تقوم بمهام هي ليست من اختصاصها أبداً ، مثل إدخال اسم الطالب ورقم التعريف وغيرها ، هذه الوظيفة ليست من وظيفـة أي فئة أخرى غير الفئة student ... وحتى تنجح الفئة student في هذه الوظيفة فعليك بزيادة تحـميل معامل الإدخال والإخراج .. وفي الأساس فأين هي واجهـة الفئة student ، أين مثلاً محددات الوصول get و set لكل عضو متغير خاص في الكائن ، ولماذا جميع الأعضاء في الفئة أو التركيب student عبارة عـن بيانات عامـة وليست خاصـة .... بالرغـم من أن هذه الأخطاء صغيرة إلا أنها أجبرتك على تعـديل عـمل الفئة list ليس لكي يعـمل مع جميع الفئات الأخرى غير الـ student بل لكي يعـمل فقط مع الـ student ولا فئة غيره...

ملاحـظـة: إذا كنت تقصدين بالـ list أنه يقوم بتنظيم عـمل الـفئة Node ، فأنتي لم تفعلي ذلك بل جعلتي الفئة list هي التي تقوم بالتخزين ... حاولي تعـديل عـمل الفئة list بشكل جيد وراجعي معلوماتك عـن هياكل البيانات Data Structurs .

بإمكاني أن أحل الكـود بشكل كامل ولكن ماهـو السؤال ، هل هـناك متطلبات جـديدة مثل الاستعلام عـن المستوى .. وغيرها

وأعتذر أشد الاعتذار عـن الإطالة والفلسفـة الزائدة........

#13

بصراحة شرح وافي بس والله نص الكلام مافهمته :unsure:

بس بالنسبة ل NODE بصراحة لما احطها NODE *link

يطلع لي اخطاء وانا عدلت في الكود الاول وغيرت فيه

يسوي اضافة ومسح ولكن لا يطبع نهائيا مادري ليه طبع معك

البرنامج اصلا وظيفته يقرى من ملف اسماء طلابهم وارقامهم الجامعية ومستواهم وتلفوناتهم

بعدين يسوي العمليات الي ذكرتها

اضافة طالب جديد .. مسح بيانات طالب.. طباعة جميع الطلاب .. طباعة الطلاب بواسطة المستوى ((يعني اعطيه مستوى 4 مثلا يطبع جميع الطلاب في هذا المستوى )) وهذي طبعا للحين مافكرت فيه ..

وفيه جزء ثاني من السؤال مابعد جيته بسبب عفسة الكود نفسه

وهو عملية دمج بس خلينا في هذا اول ..

بصراحة بديت ايئس واحس اني غبية معلق معي كود زي هذا :wacko:

#14

لقد انتهيت من 90% من الكـود ... وصراحـة فلقد جلست عليه مدة طويلة للغاية .. والسبب أني لم أقـم بمراجعـة مواضيع مثل الملفات والقوائم المترابطـة والمؤشرات مما جعلني أعـود إلى مراجعتها من جـديد....

بقي لي الآن أمر الملفات وكيف سيقرأ وكيف سيفعل سأحاول سأحاول (ولكني لا أعد) أنني سأنتهي منها اليوم ... بالرغـم من أني مشغـول بالجامعة

#15

أنا باحاول الحين ..

ماضبط معي بس وش اسوي والمشكلة باقي جزء من السؤال وهو دمج قائمتين في بعض

بحيث ادمجهم في قائمة ثالثة بدون التاثير على القائميتن الاصلية؟؟

وتكون دمج بشكل مرتب يعني مثلا

القائمة الاولي 5 9 7

الثانية 1 2 3

الدمج رح يكون 9 7 5 3 2 1

#16

بصراحة صعب متابعة هذا الكود الطويل .. و انا حاليا ما عندي كومبايلر جاهز اقدر استخدمه ..

و لكن, لاحظت من خلال نظرة سريعة وجود مشاكل اساسية:

أولا, الـ pointers يجب دائما ان نعمل لها initialization و نعطيها القيمة null (او 0 ) في الـ constructor, خصوصا الـ next او الـ link في هذه الحالة.

ثانيا, التعامل يجب ان يكون دائما مع الـ pointers و ليس by value ..

لا ادري مثلا ما الفائدة من كتابة الدالة بهذه الطريقة:

bool List::_insert( student v_in, student *pPre)

حيث تقوم الدالة بمحاولة انشاء كائن جديد من المؤشر و من ثم نسخه من v_in .. يعني دوخة راس, عملية الـ insertion في الـ linkedlist بسيطة جدا و ليس من المفروض ان يتم تعقيدها أكثر من اللازم.

void List::insert( Node * n )
{
    tail->next = n;
}

هذا على فرض ان القائمة ذات اتجاه و احد و اننا نريد اضافة العنصر الى نهايتها.

لو كنتي تستطيعين ان تقدمي لنا الفكرة من طريقة عمل الكود فهذا قد يساعد أكثر على فهم المشكلة إن شاء الله.

#17

:rolleyes: مشى معي الكود

بس باقي كيف ادمج قائمتين بديت فيه بس ماعرفت

عندي الخوارزمية جاهزة بس ابي من يترجمها عشان تمشي مع البرنامج

ندمج القائمة الاولي مع الثانية بحيث احطها في قائمة اخرى ولا يؤثر علي الاصلية

وتكون مرتبة ..

اما الفكرة من عمل البرنامج قراءة بيانات طلاب .. اضافة .. مسح .. طباعة

الملف فيه الخوارزمية مع البرنامج(ملف مضغوط) ياليت تساعدوني بكرة التسليم

linkedlist lap.zip

#18

بما أن التسليم هـو اليوم .... فبالتالي لن أفيدك وخاصـة أني لم أقرأ بقية الردود إلا اليوم

على العـموم سأكمل أنا بقية الكـود وسأقوم بتطويره ليقوم بوظائف أكثر وأكثر وسأضعـه في المنتدى كموضوع تعليمي مستقل وسأستخدم فيه طريقة أفضل من الطريقة المستعـملة في كودك وأتـمنى أن يفيدك......

#19

بالنسبة للبرنامج سلمته بأخطائه والدمج ماضبط معي

بس الله يجزاك خير والله نستفيد اذا نزلته .. بس ياليت ترسل لي على الخاص اذا نزلته واكون شاكرة

#20

على العـموم سأترك الكـود لدي هـنا وسأقوم يومياً بإضافة شيء جديد إليه كل يوم .. وحالياً أنا سأقوم بإلغاء الطريقة التي استخدمتيها في تخزين بيانات الطلاب وسأستخدم إما الأشجار أو الـ vector بدون الاعتماد على الحاويات الموجودة في المكتبات الجاهـزة (مكتبات الـ std )

#21

مافهمت وش تقصد بالاشجار هل تقصد تستخدم tree بدل linked list

ترى والله ماعرف مصطلحاتك!

بس انا تقيدت بالطريقة هذي لان هذا المطلوب والا اكيد له طرق كثيرة في الحل

بس وش تسوي فيهم متعصبين

هذا الموضوع مغلق.

مواضيع مشابهة