اذهب إلى المحتوى

السؤال

نشر

My teacher tells me: you are still calling delete on a null pointer instead of deallocating the nodes.

 

// Stack Using Linked List Implementation.cpp "Using Pointer"
// Val1->Val2->...Val15->Null
// Val + Pointer = Node
#include <iostream>
using namespace std;

// To Accommodate More Than One Data Type
template <class T>
class Stack
  {
  // Create (Node) As A struct
  struct Node {

  T Val;
  // Create Pointer (Next) Points On Node
  Node* Next;
  };
  Node* Top, * X;

  public:
  // Empety Constaractor To Initialize (Top) As NULL
  Stack() {
  Top = NULL;
  }

  // Create Add Function To Add New Element
  void Add(T val) {

  //*Ptr As Pointer Because It Is Linked Stack
  Node* Ptr = new Node;// Use (new) Node
  if (Ptr == NULL)
  cout << "Stack Add Cannot Allocate Memory";
  else{
  // Assigning The Value To The Pointer
  Ptr->Val = val;// Use (->) Because We Are Dealing With Pointer
  Ptr->Next = Top;
  Top = Ptr;
  }
  }

  // To Check Stack Is Empety Or No
  bool CheckIsEmpety() {
  // Case Top == NULL That's Mean The Stack Is Empety
  return Top == NULL;
  }

  // To Erase The Elemets
  void Erase() {
  if (CheckIsEmpety()) {
  cout << "Stack Is Empety";
  }
  else {
  // Create Temporary Pointer Points To *Top
  Node* Temp = Top;

  // To Move Top A Step Down
  Top = Top->Next;

  // Make The Temporary Pointer NULL
  Temp = Temp->Next = NULL;

  // Then Delete Temp
  delete Temp;
  }
  }

  // To Save Temp Value's Before Delete It
  void Save(T&SaveValue) {
  if (CheckIsEmpety()) {
  cout << "Stack Is Empety";
  }
  else {
  // To Save Top Value Before Delete It
  SaveValue = Top->Val;
  cout << "Save Value : " << SaveValue;
  }
  }

  // To Get Top Element
  void GetTop(T&Value) {
  if (CheckIsEmpety())
  cout << "Stack Is Empety";
  else
  Value = Top->Val;
  cout << "\nThe Top Element : " << Value << "\n";

  }

  // Print Function
  void Print() {
  X = Top;
  cout << "\nElements In The Stack : [";
  while (X != NULL)
  {
  cout << X->Val << " ";
  X = X->Next;
  }
  cout << "]\n";
  }

  };

  int main()
  {
  Stack<int> obj;

  // Add Some Values
  obj.Add(15);
  obj.Add(70);
  obj.Add(23);
  // Print The Values
  obj.Print();
  //Get The Top
  int k = 0;
  obj.GetTop(k);
  obj.Save(k);
  // After Remove Top Element
  obj.Erase();
  // Print After Remove Top Element
  cout << "\nAfter Remove Top Element";
  obj.Print();

}

 

Recommended Posts

  • 1
نشر

في الجزء التالي:

  // To Erase The Elemets
  void Erase() {
  if (CheckIsEmpety()) {
  cout << "Stack Is Empety";
  }
  else {
  // Create Temporary Pointer Points To *Top
  Node* Temp = Top;_____________________________________________ هنا

  // To Move Top A Step Down
  Top = Top->Next;

  // Make The Temporary Pointer NULL
  Temp = Temp->Next = NULL;

  // Then Delete Temp
  delete Temp;
  }
  }

يجب أن نشير للعقدة من عنوانها في الذاكرة وليس نسخ قيمتها كما هو الحال في الشيفرة لديك.

كما أن حذف العقدة Temp (لديك في نف الشيفرة) هو غير ضروري لأنه متغير مؤقت ضمن الجزء else أي سوف يتم التخلص منه تلقائيا.

- يجب أخذ عنوان Top& عندتعريف temp و من ثم حذف temp سيعمل بشكل صحيح.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...