السلام عليكم
لدي الكود التالي الذي هو تحقبق لجدول table باستخدام لئحة مترابطة و ذلك دون استخدام توابع hash على فرض أنه يتم إدخال key من المستخدم و فيه التوابع التالية :
*تابع insert لإدخال حد جديد (سوف أعتبر أن إضافة العقدة node الجديدة من النهاية )
*تابع remove لحذف عقدة عبر الkey المُمرر كوسيط (آلية الحذف التي اتبعتها عي نسخط قيمة عقدة نهاية اللائحة إلى موضع الحذف ثم حذف الذيل tail )
*تابع lookup للتأكد من وجود حد يحتوي على كيمة key ممررة و من ثم يسند في حال تحقق ذلك قيمة data العقدة إلى الوسيط data
*تابع dump للطباعة .
*تابع search بحث عن حد مطلوب و يتوقف بمؤشر kptr قبله إن وُجد و إلا سوف يعيد 0 (فكرة التوقف قبل الحد المطلوب بمؤشر هي ستلزمني عن الحذف إذا لا بد ريط العقدة السابقة بالعقدة التي تسبق العقدة المطلوبة )
ملاحظة على الأغلب المشكلة لإي تابع search و ذلك بعد تحليلي للمشكلة و لكن لم أعرف ما هو موطن الخطأ .
الكود:
#include<iostream>
using namespace std;
typedef int tkt;
typedef int tdt;
class table{
private:
struct node;
typedef node* link;
struct node{
link next;
tkt key;//table key type
tdt data;//table data type
};
link tail,head,current;
int search_t(tkt key,link kptr)//kptr point to key
{
link pred=head;
while(pred->next!=0&&pred->next->key!=key)
pred=pred->next;
kptr=pred;
if(kptr->next==0)//not found
return 0;
else
return kptr->next->key;
}
public:
table(){head=tail=current=0;}
void insert(tkt insertkey,tdt data)
{
link addednode=new node;
addednode->data=data;
addednode->key=insertkey;
if(head==0)
{addednode->next=0;tail=head=addednode;}
else
{
link kptr;
int pos=search_t(insertkey,kptr);
if(pos==0)//not found
{head->next=addednode;
addednode->next=0;
tail=addednode;
}
else//update value of data if key is duplicated
{
kptr->next->data=data;
}
}
}
bool lookup(tkt lookupkey,tdt &data)
{
link kptr;
int pos=search_t(lookupkey,kptr);
if(pos==0)
return false;
else
data=kptr->next->data;
return true ;
}
void remove(tkt delkey)
{
link kptr;
int pos=search_t(delkey,kptr);
if(pos==0)
return;
else
{
tail=kptr;
delete tail->next;
tail->next=0;
}
}
void dump()
{
link pred=head;
cout<<"key"<<"\t"<<"data"<<endl;
while(pred->next!=0)
{
cout<<pred->key<<"\t"<<pred->data<<endl;
pred=pred->next; }
}
};
int main()
{
table T;int data;
T.insert(1,5);
T.insert(2,3);
T.insert(3,0);
T.insert(100,100);
T.lookup(1,data);
// T.remove(3);
cout<<data<<endl;
T.dump();
int quit;//press any key to continue
cin>>quit;
return 0;
}