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

برنامجي بال linke list

بدأه mr.4one في 29 أبريل 2010 · 15 رد · 1,079 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

.. اليوم تعلمت من الاخ Time1 الـ قوائم المترابطه .. وجزاه الله خير .. ولكن هناك بعض الاشياء التي مافهمتها

وهذا برنامجي ..

#include<iostream>
using namespace std;

struct node {
	int num;
	char cx[10];
	node *next;
};
typedef node *node_ptr;
void add_nod(node_ptr &frist,int n,char nam[10])
{     
	if(frist=NULL)
	{
	frist=(node*)malloc(sizeof(node));
	frist->num=n;
	strcpy(frist->cx,nam);
	frist->next=NULL;
	}


}
void print_node(node_ptr &q)
{
	node_ptr p;
	p=q;

	cout<<p->num<<endl;
	cout<<p->cx;
}

void main()
{
	node_ptr as;
	int b;
	char mn[10];
	cin>>b;
	cin>>mn;
	add_nod(as,b,mn);
	print_node(&as);
}

ع حسب مافهمت هل معنى هالسطر

typedef node *node_ptr;

أي ان جعلنا الـ node مؤشر ؟ تعامل معامله المؤشر .. !!!

void add_nod(node_ptr &frist,int n,char nam[10])

هل الـ node_ptr &frist .. ( الي افهمه ان &frist تعنى عنوان متغير او عنوان مؤشر .. ؟ وكيف قمنا بـ node_ptr &frist ونحن لم نحجز لـ frist بـ node_ptr مكان

اي ان لايمكن ان نقول &X ونحن ماعرفنا بـ X انها متغير صحيح او الخ ..

ومامعنى هالسطر بشكل ادق .. ؟

	frist=(node*)malloc(sizeof(node));

واهم سؤال .. الطباعه عندي خاطئه .. ..؟؟؟

اخر وسؤال .. كيف ان اعمل مؤشر يؤشر الى اول قائمه .. ؟؟؟ ولو مثـلا كانت عندي 10 قوائم .. واريد المؤشر يؤشر الى اول قائمه ..

وشكرااا

تم تعديل هذه المشاركة بواسطة mr.4one في 29 أبريل 2010 في 12:48

#2

UP

#3
mr.4one كتب:

ع حسب مافهمت هل معنى هالسطر

 typedef node *node_ptr;

أي ان جعلنا الـ node مؤشر ؟ تعامل معامله المؤشر .. !!!

بشرح لك الأمر typedef ..

مثلاً لو كان عندي برنامج كبير و فيه متغيرات كثير و كانت من نوع واحد int مثلاً ..

وأحتجت أنك تغير نوع المتغيرات إلى float .. و أنت عندك عدد كبير من المتغيرات .. بتغير واحد واحد أبد ما ينفع :wink: ,

للتوضيح أكثر أنظر للكود التالي ..

typedef int INT ;
INT value1 , value2 ;

تحتاج إلى تغير int إلى float و بس ..

أتمنى تكون فهمت الأمر typedef ..

ننتقل لسؤالك ..

عند كتابه برنامج القوائم المتصلة .. نحتاج لتعريف بنية تحتوي على البيانات و مؤشر ..

ونحتاج إلى مؤشر آخر يؤشر على بداية القائمة أو تعريف مؤشر للتنقل بين العقد للطباعه أو البحث .. وكل هالمؤشرات من نوع التركيبة ..

فنكتب هالسطر ..

typedef node *node_ptr

نسوي نوع متغير من النوع node و أسمه node_ptr ..

وبيصير إذا أردنا تعريف مؤشر من النوع node نكتب هالسطر ..

node_ptr  p ;

وللعلم مب مقيد أنك تسوي هالأشياء .. أي يمكن تعريف المؤشر بطريقة أخرى ..

مثل ..

node *p ;

إن شاء الله تكون فهمت ..

و أسئلتك الأخرى ياليت لو توضحها أكثر ..

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

1

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

#4

يعطيكي العافيه ..

بس ياليت تصلحين برنامج لكي يطبـع .. عشان افهم بشكل واضح ..

وبخصوص الـ typedef

typedef int INT ;
INT value1 , value2 ;

بدال الـ INT احط folat قصدك ..؟

وبخصوص سؤالي الغير مفهوم .. هو

void add_nod(node_ptr &frist,int n,char nam[10])

شفتي البارمتر هذا .. يوجد فيه node_ptr &frist

ياليت تشرحين لي الجمـله هذي ومامعنى ( node_ptr &frist ) < بس هذي الي مو فاهمها .. ؟

و

typedef node *node_ptr

الي فهمته .. ان node_ptr حولناها الى مؤشر .. ؟ صحيح لكي تكون دينامكيه ..

واشكرك ع الاجابه والتوضيح

#5
mr.4one كتب:

وبخصوص الـ typedef

typedef int INT ;
INT value1 , value2 ;

بدال الـ INT احط folat قصدك ..؟

لا أنا أقصد بدال int لأن قصدنا نغير المتغير نفسه مب اللي مسوينه :wink: ..

يعني بيصير كذا ..

typedef float INT ;
INT value1 , value2 ;

اقتباس

ياليت تشرحين لي الجمـله هذي ومامعنى ( node_ptr &frist ) < بس هذي الي مو فاهمها .. ؟

ترسل للدالة المؤشر اللي بيأشر على بداية القائمة ,

إذا ارسلت متغير من دالة إلى أخرى بدون هذه العلامة ما راح تتغير قيمتها لو رجعنا للدالة الأصلية . ,

وضعنا & عشان يكون التغير في قيمة الـ first حتى لو رجعنا للدالة الأصلية .. ,

و تقدر تعرف المتغير first متغير عام ..

إن شاء الله يكون مفهوم ..

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

#6

ربي يعطيكي الف عافيه .. مفهـومـه 100%

وبحاول اسوي link list واذا اخطيت إًُتمنى انك تتحمليني ..

مشكوره

#7

هذه محاولتي ..

#include<iostream>
using namespace std;

struct node {
	int a;
	char b;
	node *next;
};
void aded(node *p)
{
	int data;
	char x;
	cin>>data;
	cin>>x;
	p->a =data;
	p->b =x;
	p->next =new node;
	p=p->next;
}
void print(node *pt)
{
	while(pt->next!=NULL)
	{
		cout<<pt->a<<endl;
		cout<<pt->b<<endl;
	}
}


int main()
{

	node *mynode = new node;
	aded(mynode);
	print(mynode);
	return 0;

}

بس ليــه متكرر الى مالى نهايــه ...؟

#8

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

وطبعا كله من شرحك ( ربي يعطيك العافيه ) .

#include<iostream>
using namespace std;
struct emp {
	int a;
	char x;
	emp *next;
	emp *prev;
};

void aded(emp *node)
{
	emp *tmp;
	int a,b;
	char x;
	for( ; ; )
	{
		tmp->next=node->next;
		cout<<"Enter the vlaue A & X"<<endl;
		cin>>a>>x;
		node->a=a;
		node->x=x;
		node->next= new node;
		node = node->next;
		node->prev=tmp->next;
		cout<<"If u want stoped Enter 0"<endl;
		cin>>b;
		if(b!=0)
		{
			break;
		}
	}

}



void main()
{

	emp *list;
	aded(list);
}

تم تعديل هذه المشاركة بواسطة mr.4one في 1 مايو 2010 في 13:21

#9

السلام عليكم ورحمة الله وبركاته .. ,

الكود هذا فيه أخطاء , الأفضل أنك تتعلم كيفية إنشاء عقدة واحدة وتعبئتها بالبيانات و من ثم طباعتها ,

و بعد ذلك تعلم كيفية ربط العقد مع بعضها , (نصيحة لا أكثر :wink: )

void aded(node *p)
{
        int data;
        char x;
        cin>>data;
        cin>>x;
        p->a =data;
        p->b =x;
        p->next =new node;
        p=p->next;
}

أستقبلت هذه الدالة المؤشر اللي يأشر على بداية القائمة , لأنك في الـ main كتبت هالسطر ,

node *mynode = new node;

إذا هالدالة نفذت أوامرها , و رجعت للـ main .. بتلقى فيه أمر إستدعاء دالة الطباعة .. وإرسال المؤشر لها أيضاً ..

وهنا الخطأ , أما ترسل المؤشر قبله & , عشان أي تغير في قيمته يصبح مرئي من قبل جميع دوال البرنامج ..

وفي كودك , قيمة المؤشر تغيرت في الدالة الأولى ولن يرى التغير من قبل الدالة الثانية ..

فمن الأفضل تعريف المؤشر متغير عـــام ..

واضح ؟

ثانياً : لا حاجة لتعريف المتغيرات مرة أخرى ..

يعني تقدر تسوي كذا ..

cin>>p->a;
cin>>p->b;

وفي نهاية الكود ما حفظت الـ header (المؤشر اللي يأشر على بداية القائمة ,من خلاله تبحث و تضيف و .. مهم جداً ) ..

فالكود فيه أخطاء .. ,

سويت كود لإدخال أسم و عمر و طباعتهم ,

أفهم الكود و بعدين فكر تسويه أكثر من عقده ..

#include <iostream>
using namespace std ;
struct node
  {  char name[20];    
     int age;          
     node *next;      
  };
node *head = NULL;
void add ()
{
	node *p = new node ;
	cout << "Please enter the name : ";
    cin >> p->name;
    cout << "Please enter the age : ";
    cin >> p->age;
    p->next = NULL;
	if (head == NULL)
    head=p;
}
void print()
{
node *p = head; 
          cout << "Name : " << p->name << endl;
          cout << "Age : " << p->age << endl;
}
int main()
{
add();
print();
system("pause");
}

إن شاء الله يكون واضح ..

بالتوفيق :happy:

2

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

#10

معليش اختي مافهمت تماما .. عن الـ & .. الي افهمه ان الـ & اذا حطيتها قبل المتغير .. بتصير ( مرجع ) وثأنيا تعني الموٍقع المتغير بالذاكره ..

وبخصوص .. برنامج فيه خطاء انه مايربط بين الطباعه والاضافه بجميع العناصر .. فقط العنصر الاول .. ؟

وهذا تغيري لـ كودك .. لكي يتم ادخال واخراج 3 متغيرات

#include <iostream>
using namespace std ;
struct node
  {  char name[20];    
     int age;          
     node *next;      
  };
node *head = NULL;
void add ()
{
        node *p = new node ;
        cout << "Please enter the name : ";
    cin >> p->name;
    cout << "Please enter the age : ";
    cin >> p->age;
    p->next = NULL;
        if (head == NULL)
    head=p;
}
void print()
{
node *p ; 
p=head;
for (int i=0;i<3;i++)
{

          cout << "Name : " << p->name << endl;
          cout << "Age : " << p->age << endl;
}
}
int main()
{
	for(int i =0;i<3;i++)
	{
add();

	}
	print();
system("pause");
}

واعتقد الخطاء هنــا

if (head == NULL)
    head=p;

لانه راح يضيف لـ Head اول ادخال .. لانه اول شي يساويي NULL وبعدها ماراح يساوي قيمــه .. وماراح ينفذ الشرط

#11

وياليت تقولين لي كيف يعني يأشر ع اول قيمه وانتي خليتيــه NULL بالتعريف العام .. !! ياليت بشكل مفصل

ربي يعافيك

#12

السلام عليكم ,

أعتذر ع التأخير , كان عندي إمتحان اليوم :wacko: .. ,

كتبت لك كود يدخل المستخدم عدد الأشخاص اللي يبي يدخل بياناتهم , و يطبعهم ,

#include <iostream>
using namespace std ;
struct node
  { 
	  char name[20];    
       int age;          
     node *next;      
  };
node *head =NULL;

void add ()
{
if (head==NULL)
{
head = new node;
cout << "Please enter the name : ";
        cin >> head->name;
        cout << "Please enter the age : ";
        cin >> head->age;
head->next=NULL;
}
else
{
node *p=head;
node *n;
while(p->next!=NULL)
p = p->next;
n = new node ;
cout << "Please enter the name : ";
        cin >> n->name;
        cout << "Please enter the age : ";
        cin >> n->age;
n->next=NULL;
p->next=n;
} 
}

void print()
{
          node *p ;
		  p=head;
while(p!=NULL)
{
          cout << "Name : " << p->name << endl;
          cout << "Age : " << p->age << endl;
		  p=p->next;
}
}
int main()
{
int x ;
	    cout<<"Enter the number of persons "<<endl;
	    cin>>x;
        for(int i=0;i<x;i++)
         add();
        print();
system("pause");
}

بشرح لك الكود , وإذا فيه شي مب واضح .. أسأل ..

بداية من الـ main ..

نسأل المستخدم عن عدد الأشخاص المراد إدخال بياناتهم ,

نسوي for على عدد المدخل ..

و نستدعي دالة الإدخال ..

في دالة الإدخال ,

إذا كان الـ header يساوي NULL .. بمعنى أن القائمة لا تحتوي على عقد ..

ننشأ العقدة الأولى و نخلي الـ header يؤشر عليها ..

و ندخل البيانات ..

عند إدخال بيانات العقدة التالية .. ما راح نغير قيمة الـ header ..

نعرف مؤشر آخر يأخذ قيمة الـ header عشان يلف على القائمة و يصل إلى النهاية

و من ثم نعرف مؤشر يؤشر على عقدة جديدة ..

و نعبي البيانات .. (بتصير هذه العقدة مب مربوطة مع القائمة) ..

من ثم نربطها مع القائمة ..

في دالة الطباعة ,

نستدعيها مرة واحدة ,

و نعرف مؤشر يأخذ قيمة الـ header .. و يطبع بيانات العقدة الأولى

ومن ثم ينتقل إلى العقدة التالية و يطبع بياناتها ..

وهكذا إلى أن نصل إلى النهاية .. ,

بالتوفيق يارب ..

1

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

#13

ربي يوفقك بالامتحانات ..

وانا بجرب وادرس برنامجك .. " وبكتب برنامج ان شاءالله يكون صحيح "

وشاكر لك ع شرحــك التفصيلي وصبرك علي

#14

هذا برنامجي بدون اخطاء .. بس فيه اخطاء من طريقه البرمجه ..

انا لا اريد كل ماضيف عنصر ان يمر بالهيدر الى ان يوصل الى فارغ .. هذا مشوار لذاكره ..

وسويت هالطريقه ان فيه عنصر last يمسك اخر عنصر انكتب فيه .. وهكذا .. ولكن جربيه يطلع لك خطاء .. ؟

#include <iostream>
using namespace std;
struct emp {
	int x;
	char cx;
	emp *next;
};
emp *header = NULL;
emp *last = header;
void add(emp *head)
{
	if(head==NULL)
	{
		cin>>head->x;
		cin>>head->cx;
		head->next = NULL;
	}
	else {

	emp *p = last; 
	last = new emp;
	p->next= last;
	cin>>last->x>>last->cx;
	last->next = NULL;
	}

}
void print (emp *ptr)
{
	ptr = header;
	while(header!=NULL)
	{
		cout<<ptr->cx<<ptr->x;
		ptr=ptr->next;
	}
}


void main()
{
	add(header);
	print(header);

}
#15

عرفت مؤشر البداية (header) و مؤشر النهاية (last) ..

عند تعريفهم , قلت أن الـ header يساوي NULL .. معناته أن المؤشر لا يؤشر على شيء ..

و قلت أن الـ last يساوي الـ header أيضاً لا يؤشر على شيء .. ,

عند الإدخال أول مرة ,

سيكون الـ header يساوي NULL ..

و سينفذ الكود .. ,

if(head==NULL)
        {
                cin>>head->x;
                cin>>head->cx;
                head->next = NULL;
        }

بمعنى أنه ستتم تعبئة البيانات داخل العقدة ..

مع ملاحظة وجود خطأ , وهي أن الـ header يساوي NULL و لا قلت أنه يشير إلى عقدة جديدة ..

يعني بتضيف هالسطر .. قبل إدخال البيانات ..

head= new emp ;

(وحافظ على أسم المتغير لا تغير فيه , يعني في التعريف كتبت header و في الدالة كتبت head .. للتنبيه فقط .. , )

و عند الإدخال مرة أخرى (إضافة بيانات لشخص آخر ) ..

سيكون الـ header لا يساوي NULL .

و ينتقل لهذا الكود .. ,

emp *p = last;

لا تنسى أن الـ last آخر قيمة له كانت NULL ,

صحيح غيرينا قيمة الـ header لكن الـ last ما تغيرت ..

كلا المؤشرين p , last مساويان للـ NULL

last = new emp;

قلت أن الـ last يشير إلى عقدة جديدة .. ,

p->next= last;

الـ p مب معروفة , هي NULL .. هنا فيه خطأ ,

cin>>last->x>>last->cx;
last->next = NULL;

هنا ما فيه خطأ , لأن سبق وعرفت الـ last بأنه يشير إلى عقدة و قمت بإضافة البيانات ..

و أن المؤشر لهذه العقدة يساوي NULL ,

..

بغض النظر عن الأخطاء .. ما ربطت بين العقد ؟

الأفضل , تعريف مؤشر يساوي الـ header و نضيف من خلاله متى ما وصل للنهاية ..

حتى لو أردت إضافة عنصر في مكان معين , بحث أو تعديل ,

لآبد من تعريف مؤشر يؤشر على بداية القائمة ,

ملاحظ أخيرة , بما أنك عرفت المؤشر header متغير عام , فـ لاحاجة لإرسالة .. هكذا ..

 add();
        print();

بالتوفيق ..,

1

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

#16

ربي يجزاكي الجنـه .. "

وهذا تعديلي .. " والحمدلله صحيح .. .. ولكن بطوره بعد كم يوم عشان الاختبارات وبنزلــه هنا ..

^_^ويعطيكي الف عافيــه ع هيك شرح

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