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

ممكن مسآعده في linked list

بدأه Nouf Bint Turki في 1 ديسمبر 2010 · 14 رد · 1,436 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلآم عليكم ورحمه الله و بركآته

اولاً .. اشكر كل القآئمين على هذآ المنتدى الرائع ..

يعطيكم الف عآفيه و الله يجعله في ميزآن حسنآتكم ان شاء الله ..

ندخل في موضوعي wub.gif

الدكتور طلب مني اسوي فنكشن اسمهآ DeleteBefore

وظيفه هآذي الفنكشن انها تمسح لي النود اللي قبل النود اللي انا اعطيها اياه

يعني اذا كآنت القيم اللي عندي 6<-4<-2-<

وانا قلت له ابي امسح الرقم اللي قبل 4

يطلع لي

6<-4<-

مع العلم انا ما اخذت الـ search function

لان في وحده قالت لي اسويه فيهآ

المهم هذآ الكود اللي انا سويته بس في شي غلط و عجزت اعرفه wacko.gif

مو طآلع عندي اخطآء بس الفنكشن ما تسوي وظيفتها صح !!!

#include <iostream>
using namespace std;

class Node
{
public:
	int value;
	Node * next;
	Node ();
	Node(int v);

	};
Node::Node()
{
	value=0;
	next= NULL;
}
Node::Node(int v)
{
	value=v;
	next= NULL;
}

void Print (Node *h)
{   if(!h)
 	cout<<"empty"<<endl;
	while (h)
	{
		cout<<h->value<<"->";
		h=h->next;
	}
}



void DeleteBefore (Node* h, int v)
{

	if (h)
	{
		if (h->value !=v)
		{
			if (h->next)
			{
				Node *n=h;
				Node *tmp=h->next;
				if (tmp->value !=v)
				{
					while (tmp->next)
					{
						if (tmp->next->value==v)
						{
							n=tmp->next;
							delete tmp;
						}
						else 
						{
							tmp=tmp->next;
							n->next=tmp;
						}
					}
				}
				else
				{
					h=h->next;
					delete n;
				}
			}
			else {cout<<"There is no more Nodes !!"<<endl;}


		}else 
			{cout<<"There is no Node befor to delete !!"<<endl;}
	}
	else {cout<<"list is empty !!"<<endl;}

}
int main()
{
	Node * head;
	head= new Node(2);
	Node * n;
	n= new Node(4);
	Node * m;
	m= new Node (6);
	head->next=n;
	n->next= m;
	Print(head);
	cout<<"Delete the value before 6"<<endl;
	DeleteBefore (head, 6);
	Print (head);



	return 0;
}

*احتآجه بكرا ضروري blink.gif

وشكراً مقدماً smile.gif

تم تعديل هذه المشاركة بواسطة Nouf Bint Turki في 1 ديسمبر 2010 في 03:21

#2

الكود شغال لكن لم يسبق لي ان درست السي ++ طبقت ماتعلمته في سي اظن ان المتغيرات التي قمت بحجزها في الداله سيتم حذفها تلقائيا

#include <iostream>
using namespace std;

class Node
{
public:
        int value;
        Node * next;
        Node ();
        Node(int v);

        };
Node::Node()
{
        value=0;
        next= NULL;
}
Node::Node(int v)
{
        value=v;
        next= NULL;
}

void Print (Node *h)
{   if(!h)
        cout<<"empty"<<endl;
        while (h)
        {
                cout<<h->value<<"->";
                h=h->next;
        }
}



Node * DeleteBefore(Node * h,int v)
{
    Node *yh,*ah;
    ah=yh=h;

if(yh->value == v)
    {

        delete yh;
         return yh->next;
    }
else
    {
                    while((h->next)!=NULL)
                        {
                            yh=h;
                            h=h->next;
                            if(h->value == v)
                            {
                               yh->next=h->next;
                               delete h;
                               return ah;
                            }

                        };
                    return ah;
    }


}
int main()
{       int vnode;
        Node * head;
        head= new Node(2);
        Node * n;
        n= new Node(4);
        Node * m;
        m= new Node (6);
        head->next=n;
        n->next= m;
        Print(head);
        cout<<"\ninsert the value of node that u want to delete \n";
        cin>>vnode;
        head=DeleteBefore(head,vnode);
        Print (head);



        return 0;
}
1
#3

يعطيك العآفيه اخوي smile.gif

بس الفنكشن اللي انت سويتها وظيفتها انها تمسح نفس النود اللي يحمل القيمه المُدخله ..

واللي انا احتآجهآ انها تمسح النود اللي قبل النود اللي يحمل القيمه المدخله

يعني اذا كان عندي

8<-6<-4<-2<-

و انا دخلت 4 الرقم اللي بينمسح هو 2 يعني بيصير

8<-6<-4<-

واذا دخلت 2 يقولي انه مافي نود قبل عشان يمسحه !!

و إذا دخلت رقم مو موجود يقولي انه مو موجود ..

بس في شي ما عرفته في الكود اللي سويته 016.gif

Node * DeleteBefore(Node * h,int v)

ليش حطيت (*) يعني الفنكشن بوينتر !!

ياليت توضح لي اكثر ..

و سوبر شكرا 046.gif

#4

No one can help :mellow:

#5

اعمل 2 بوينتر واحد يكون سابق للبوينتر الثاني و سايهم بمقدمة اللينك

و اذا بتقدر تعمليه على الضبل لنك احسنلك

بفنكشن الحذف اعمل if لتفحص اذا كان البوينتر اب ارو للفايلو = القيمة الي بدك تحذفيها او لأ

اذا نعم بتحكي البوينتر اب ارو للباك = البوينتر السابق اب ارو للباك و البوينتر السابق اب ارو للنكست = البوينتر اب ارو للنكست

و ديليت للبوينتر

هذه الفكرة بشكل سريع حاول تعملها :lol:

1
#6
اقتباس
اعمل 2 بوينتر واحد يكون سابق للبوينتر الثاني و سايهم بمقدمة اللينك

انا سويت 2 بوينتر n و tmp

و tmp سابق ال n بس الفنكشن ما تأدي وظيفتها صح !!!

شوفي لي الكود الله يعافيك ما ادري ايش الغلط فيه يمكن طريقتي كلها غلط !!

هذآ حق الفنكشن اللي تمسح

void DeleteBefore (Node* h, int v)
{

        if (h)
        {
                if (h->value !=v)
                {
                        if (h->next)
                        {
                                Node *n=h;
                                Node *tmp=h->next;
                                if (tmp->value !=v)
                                {
                                        while (tmp->next)
                                        {
                                                if (tmp->next->value==v)
                                                {
                                                        n=tmp->next;
                                                        delete tmp;
                                                }
                                                else 
                                                {
                                                        tmp=tmp->next;
                                                        n->next=tmp;
                                                }
                                        }
                                }
                                else
                                {
                                        h=h->next;
                                        delete n;
                                }
                        }
                        else {cout<<"There is no more Nodes !!"<<endl;}


                }else 
                        {cout<<"There is no Node befor to delete !!"<<endl;}
        }
        else {cout<<"list is empty !!"<<endl;}

}

و الكود حق البرنامج كامل فوق في اول رد

صحيح ما قلت لك انا ما اخذت الدبل لينك اذا بتشرحينه لي بكون شاكره لك و اذا ما عندك وقت خلاص عآدي ..

انتظر ردك smile.gif

#7

فكرة الضبل لنك انك مثل ما بتعملي مؤشر next تعملي back بحيث انه يؤشر على العنصر الي قبله

و هيك بمكنك من انه ترجعي عنصر للوراء مثل ما كنا نمشي للامام بكل سهولة

على العموم انا عملت البرنامج نفسه لكن بطريقة ثانية بقدر اتحكم بالعناصر الي معي و اتحكم بعددها ايضا

و هذا الكود .. و ان شاء الله بتستفيدي منه و بوفس الغرض :)

#include <iostream>

class Node
 {
   public :
      Node ();
      void add (int item) ;
      void deleteBefor(int deleteItem);
      void print() ;

   private :
      int info ;
      Node *next ;
      Node *newNode ;
      Node *first ;
      Node *last ;

 } ;

Node::Node ()
 {
   first = NULL ;
   last = NULL ;
 }

void Node::add(int item)
  {
    newNode = new Node ;
    newNode->info = item;
    newNode->next = NULL ;

    if (first == NULL )
      {
        first = newNode ;
        last = newNode ;
      }

    else
      {
        last->next = newNode ;
        last = newNode ;
      }

  }


void Node::deleteBefor (int deleteItem)
  {
    Node *current;
    Node *temp;

    current = first ;
    temp = first ;
    temp = temp->next ;

     if (first == NULL )
       cout<<"can't delete from empty link ! ";

     else
      {

        while (temp->next!=last->next)
         {
            if (temp->next->info == deleteItem )
                {
                  cout<<"you delete : "<<temp->info ;
                  current ->next = temp->next ;
                  temp->next=NULL ;
                  delete temp ;
                }
            else
            {
              current = temp ;
              temp = temp->next ;

            }
         }
        }
  }




int main ()
  {
    Node T ;
    int item ;
    int deleteNum  ;
    int n ;

    cout<<"enter how manay item you want to add : ";
    cin>>n;

    for (int i=0;i<n;i++)
      {
        cout<<"enter your item :> ";
        cin>>item;
        T.add(item);
      }

    cout<<"enter your number to delete befor :> ";
    cin>>deleteNum ;
    T.deleteBefor(deleteNum);

    }
1
#8

يعطيك العافيه البرنآمج شغال اوكي و يأدي المطلوب ..

بس حسيته صعب شوي بالنسبه لي كـ مبتدأه ..!!

طلب اخير يالغآليه و سوري لاني ثقلتها عليك .. اذا ما عليك امر تشرحين لي الكود حقك بس مو ضروري الحين ..

ولا تدرين انا بكرا ان شاء الله بكون فاضيه وبقعد عليه وبحاول افهمه واذا ما فهمته قلت لك ..

ما قلتي لي الكود اللي انا سويته ايش الغلط فيه " ولا كله خطأ و مافي مجال للتصحيح !!

يسعدك ربي و مره شكرا 3>

تم تعديل هذه المشاركة بواسطة Nouf Bint Turki في 3 ديسمبر 2010 في 21:52

#9

ماشي .. أي كو بالبرنامج مو فاهميته رح وضحلك اياه

#10

blink.gif مآ فهمت !!

 
class Node
 {
   public :
      Node ();
      void add (int item) ;
      void deleteBefor(int deleteItem);
      void print() ;

   private :
      int info ;
      Node *next ;
      Node *newNode ;
      Node *first ;
      Node *last ;

 } ;

اممممم مو عارفه كيف اسال << شفتي تناحه زي كذآ XD

المهم

النود اللي انا سويته يحمل value و pointer next

بس حقك فيه كذا شي ما عرفت ممكن توضحين لي !!

#11
Node *next ;

هذا مؤشر يؤشر على العقدة التالية , كل عقدة تتكون من value و مؤشر يؤشر على اللي بعدها ,

Node *newNode ;

هذا مؤشر , عند إضافة Node , نستخدمه نؤشر على عقدة جديدة ..

 Node *first ;

هذا مؤشر يؤشر على بداية القائمة , ضروري للطباعة , او البحث ..

  Node *last ;

وهذا يؤشر على نهاية القائمة ,

بالتوفيق :happy: ,

1

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#12

يعني اذا انا كتبت في الـ main

Node * head;

// الـ head تتكون من

int info ;
      Node *next ;
      Node *newNode ;
      Node *first ;
      Node *last ;

يعني اقدر اكتب !!

head->info;
head->next;
head->newNode;
head->first;
head->last;

تم تعديل هذه المشاركة بواسطة Nouf Bint Turki في 5 ديسمبر 2010 في 01:48

#13

مرحبا ,

الـ Head , مؤشر يؤشر على Node .. تحتوي على info , و مؤشر next اللي يؤشر على الـNode التالية .. فقط !

اما الـ newNode , مؤشر تستخدمينه وقت إضافة Node جديدة ,

و الـ First , مؤشر يؤشر على اول Node في القائمة , و لا يتغير ..

والـ last , بعد مؤشر يؤشر على آخر Node في القائمة ..

واضح ؟

عزيزتي نوف , اطلعي على هالموضوع بيفيدج :happy: ..

بالتوفيق ,

1

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#14
Nouf Bint Turki كتب:

يعني اذا انا كتبت في الـ main

Node * head;

// الـ head تتكون من

int info ;
      Node *next ;
      Node *newNode ;
      Node *first ;
      Node *last ;

يعني اقدر اكتب !!

head->info;
head->next;
head->newNode;
head->first;
head->last;

السلام عليكم ورحمة الله

لا نستطيع التعامل مع أي بيانات مغلفة private بطريقة مباشرة من خارج الكلاس والفنكشن الموجودين فيه

الدالة الرئيسية main ليست جزءاً من الكلاس لذلك لا نستطيع التعامل مع next و first ووو الموجودين في قسم private بهكذا طريقة مباشرة... :happy:

موفقة يارب :happy:

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#15

الاساتذه ..

clrscr_funct .. صمت الفرآشآت .. أشرآقه فجر .. حمره الورد ..

شكراً من القلب 3>

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