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

[ تمت الإجابة ]أرجو المساعدة في ترتيب مصفوفة، كل عنصر فيها عبارة عن linked list

بدأه سماء في 22 أكتوبر 2013 · 2 رد · 893 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مرحبا

 

لدي برنامج يطلب من المستخدم ادخال  Transaction

 

بحيث أن كل Transaction يحتوي على مجموعة من items، يحددها المستخدم

مثلا
اليوزر دخل عدد ال Transaction =2

بعدين دخل عدد items في كل Transaction
مثلا
number of items in T[0]=3
T[0] = 1,4,3

number of items in T[1]=2
T[1] = 8,9
-
 

-

أريد أني أبني tree، بحيث بعد أن أقوم بترتيب الـ nodes فيها تصاعديا (كل Transaction يحتوي على مجموعة من items، وأقوم بترتيب  items تصاعديا)

مثلا

T[0] = 1,4,3
تصبح بعد الترتيب

T[0] = 1,3,4
 

 

بعد أن أقوم بترتيب الـ items لكل Transaction

أقوم بعمل  traverse بطريقة breadth first search

 

 

قمت بكتابة كود البرنامج كالتالي (ونتائج الترتيب تظهر خطأ)

struct Transaction
{
 int Item;
 Transaction *next;
};</p>
<p>#define ItemNum 1000
Transaction *Trans[ItemNum]; //Adjacency list stors list of Items in each Transactions.
int TransNum; //No. of Transactions.</p>
<p>void SortItems(int,int);

وفي الدالة Build_Tree()
أنادي دالة الترتيب، كل مرة يدخل اليوز عناصر ال Transaction

int Itemsets, Itemsets_Data; Transaction *NewItem,*FollowingItem;</p><p> for(int a=0;a<=ItemNum-1;a++)  Trans[a] = NULL;</p><p> for(int i=0;i<=TransNum-1;i++) {  FollowingItem=NULL;  cout<<"\n\n Please Enter the number of items of Transaction #"<<i+1<<" = ";  cin>>Itemsets;</p><p>  for(int j=0;j<=Itemsets-1;j++)  {   cout<<"\n Please Enter Itemes #"<<j+1<<" = ";   cin>>Itemsets_Data;</p><p>   NewItem= new Transaction;   NewItem->Item = Itemsets_Data;   NewItem->next = NULL;</p><p>   if(Trans == NULL)    Trans= FollowingItem = NewItem;</p><p>   else    {    FollowingItem->next = NewItem;    FollowingItem = NewItem;       }    }    </p><p>  SortItems(Itemsets, i);</p><p> // print  int r =0;  while ( (r <=Itemsets-1) &&  (Trans != NULL))  {    cout<<"\n"<<Trans->Item;    Trans = Trans->next;      r+=1;   }     }    }

دالة الترتيب

void SortItems(int Itemlist, int loc)
{
 Transaction *Temp; 
Temp= new Transaction;
 int num=0, num1=1;
 while ( (num <Itemlist) &&  (Trans[loc]->next != NULL))  
    {    
while ( (num1 <Itemlist-1) &&  (Trans[loc]->next != NULL))
  
  {    
if (Trans[loc]->Item > Trans[loc] ->next->Item)      
{    Temp->Item =  Trans[loc]->Item;  
  Trans[loc]->Item = Trans[loc]->next->Item;   
 Trans[loc]->next->Item = Temp->Item;      
} 
  Trans[loc] ->next->Item = Trans[loc] ->next->Item;   
  num1+=1;    
}   
Trans[loc]->Item  =Trans[loc]->Item  ;    
 num+=1;
 }

}

لو قمت مثلا، بادخل عدد الـ  Transaction=1

وعدد الـ Items في Transaction = 4

مثلا

Trans[0]=3,2,5,4

 

ف النتيجة بعد الترتيب تظهر كالتالي
   

Trans[0]=2,3,5,4

 

أي أن دالة الترتيب قامت بترتيب أول عنصرين فقط

 

 

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

 

تم تعديل هذه المشاركة بواسطة سماء في 22 أكتوبر 2013 في 23:39

#2

تم حل مشكلة الترتيب كما يلي:

 
void SortItems(int Itemlist, int loc)
{
int Temp;
Transaction 
*tmp;
tmp= 
new Transaction;
tmp=Trans[loc] 
;

for (int i=0; i<Itemlist; i++)
{
while ( Trans[loc]->next )
{
if (Trans[loc]->Item > Trans[loc]->next->Item) 

{
Temp = 
Trans[loc]->Item;
Trans[loc]->Item = Trans[loc]->next->Item;
Trans[loc]->next->Item = Temp;
}
else 
Trans[loc]= 
Trans[loc]->next;//increment node
} 

Trans[loc] = 
tmp; 

}
}
1
#3

مرحبا

 

حاولت تنسيق الكود بلا فائدة، لذلك قمت باضافة البرنامج كمرفق، بنصيحة أحد الأخوة، لتعم الفائدة

 

وشكرا

sort linked list.rar

1

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…