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

[ تمت الإجابة ]سؤال : عن Linked List

بدأه memo_elmasry في 29 ديسمبر 2012 · 4 رد · 967 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

موضوع القوائم المتصلة " linked list " مجنني مش فاهمه خلاص ليا يومين بحاول استوعبه برضوا مش فاهمه

فهمتوا بطريقة لقيت دكتور المادة ماشي بطريقة تانية

انا بجد قلقان اوي ونفسي افهم الموضوع ده لانه جي في العملي

ياريت تساعدوني بشرح بسيط بالعربي بس يكون مبسط

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

والكود ده يعتبر فيه كل العمليات اللي مقررة علينا

ياريت حد يتكرم ويشرحولي

#include <iostream>      
//preprocessor directive
 using namespace std;            

struct NodeType
{
	int  info;
	NodeType* next;
};

NodeType *listData;
int length;

void create()
{
	length  =  0 ;
	listData = NULL;
}

int  LengthIs(  )
{
	return length;
}

bool IsFull(NodeType *location)
{
  if(location == NULL)
	{
		return true;
	}
  else
  	return false;
}

void insertItem(int item)
{
  NodeType *location ;
  location = new  NodeType;
  if (IsFull(location ))
		cout << "the memory is full";
  else
   {
    location->info = item ;
    location->next = listData ;
    listData = location ;
    length++ ;
   }
}


void DeleteItem(int item)
{
  NodeType* preLocation = NULL;
  NodeType*  location = listData;
  if(item == location->info)
   listData = location->next;
  else
   {
	 preLocation = location;
    location = location->next;
    while(item != location->info)
     {
       preLocation = location;
       location=location->next;
     }
    preLocation->next = location->next;
   }
  delete location;
  length--;
}

void MakeEmpty( )
{
	NodeType*  tempPtr;
	while(listData != NULL)
	{
		tempPtr =  listData;
		listData = listData->next;
		delete tempPtr;
	}
}

void FindItem(int item,bool &found,  NodeType *currentPos)
{
  bool  moreToSearch ;
  currentPos= listData;

	found = false ;
	moreToSearch = ( currentPos  !=  NULL ) ;
  while ( moreToSearch  &&  !found )
{
   if ( item == (currentPos ->info ))
       found = true ;
   else
	 {
     currentPos = currentPos ->next ;
	  moreToSearch = (currentPos != NULL) ;
    }
  }
}

void Display()
{
     NodeType*  tempPtr = listData;
	while(tempPtr!= NULL)
	{
		cout<< tempPtr-> info << endl;
		tempPtr = tempPtr ->next;
	}
}


void main()
{

create();
	int x;
	int k;

	cout << "Enter the number of item in Linked List: ";
	cin >> k;

	for (int i = 0; i < k; i++)
	{
		cout << "Please, Enter Number: ";
		cin >> x;
		insertItem(x);
	}

	Display();

	cout << endl << endl;

}

ياريت في اسرع وقت لان الامتحان بعد بكرة :mellow:

#2

هذا درس ممتاز بالصور عن: القوائم المتصلة

فلنأتي للكود:

struct NodeType {         int  info;         NodeType* next; };

وهذا تعريف هيكل البيانات اﻻساسي(العقدة) الذي يوم بوظيفتين ان يحمل قيمة العنصر الحالي فى المتغير length ويشير التى هيكل البيانات التالي بــ next.

NodeType *listData;

وفية اﻻعلان عن متغير مؤشر عام من نوع NodeType لكي يكون نقطة البداية لكل العقد التالية فى السلسلة المتصلة .

وﻻحظ انه اعلانه عاماً لكي تصل الية كل الدوال التالية اﻻخري مثل الحذف واﻻضافة ... .

int length;

وايضا منغير عام يسجل فية كل طول او عدد عقد القائمة الموصولة.

void create() {         length  =  0 ;         listData = NULL; }

هذة الدالة هي دالة التهيئة اﻻولي للقائمة الموصولة listData ووظفيتها اعطاء القائمة القيمة اﻻوليه لها وهي الطول او عدد العقد = صفر ، وبالنسبة لهيكل البيانات = null أى ﻻ يشير الى اى شئ.

int  LengthIs(  ) {         return length; }

دالة ترجع طول او عدد العقد فى القائمة الموصولة بارجع المتغير length

نكمل بعد قليل ...

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

ما شاء الله عليك
ربنا يزيدك ويكرمك
انا مش عارف اشكرك ازاي كل اللي اقدر عليه اني ادعيلك بوجه الغيب
لغاية دلوقتي فل والحمد لله ننتظر باقي الدوال وشكرا ليك مرة تانية

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 5 نوفمبر 2013 في 19:49 — السبب: ازالة الاقتباس

#4
bool IsFull(NodeType *location)
{
  if(location == NULL)
    	{
            	return true;
    	}
  else
    	return false;
}

وهذة الدالة وظفتها ان تتحقق من ان عملية حجز عقدة جديدة فى الذاكرة تمت بنجاح ام ﻻ. وهي تختبر قيمة المؤشر الممرر اليها عندما يكون null هذا معناه ان سي++ فشلت فى حجز مساحة الذاكرة لهذة المتغير وماعدا يعتبرة نجاح فى عملية الحجز، وهذا يظهر فى الكود التالي.

وتتم عملية الحجز بــ كلمة new فى سي++

void insertItem(int item)
{
  NodeType *location ;
  location = new  NodeType;
  if (IsFull(location ))
            	cout << "the memory is full";
  else
   {
	location->info = item ;
	location->next = listData ;
	listData = location ;
	length++ ;
   }
}

هذة الدالة تقوم بأدراج عقدة جديدة فى القائمة الموصولة وتبدأ باختبار حجز الذاكرة isFull() اذا تم الحجز بنجاح تمرر قيمة المتغير item الى متغير location->info فى العقدة الجديدة، ثم نجعل العقدة الجديدة تشير الى العقدة اﻻساسية عن طريق next وطبعا العقدة اﻻساسية قيمتها NULL فى المرة اﻻولي لكن فى المرات القادمة اى عند حجز عقد جدية لن تكون NULL وستحمل عنوان العقدة السابقة للعقدة الجديدة، يجب علينا اﻵن ان نجعل العقدة اﻻساسية listData تشير الى العقدة المضافة اﻵن.

وسوف تلاحظ ان العقد الجديدة يتم ادراجها فى بداية القائمة الموصولة وليس فى نهايتها . وبعد عملية اضافة عقدة جديدة وضبط العقدة اﻻساسية لكي تشيرا لى العقدة الجديدة نقوم بزيادة متغير العداد بقيمة 1 length++

ونكمل بعد قليل

تم تعديل هذه المشاركة بواسطة محمد عودة في 29 ديسمبر 2012 في 07:32

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#5

ياريت شرح باقي الكود للاهمية يا غالي

وشكرا ليك مرة تانية :)

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