試題四
一個關(guān)于hash的數(shù)據(jù)結(jié)構(gòu)題,答案不唯一...
#define NULLKey -1 /*散列桶的空閑單元標識*/
#define P 7 /*散列文件中基桶的數(shù)目*/
#define ITEMS 3 /*基桶和溢出桶的容量*/

typedef struct BucketNode
{ /**//*基桶和溢出桶的類型定義*/
int KeyData[ITEMS];
struct BucketNode *Link;
}BUCKET;

BUCKET Bucket[P]; /**//*基桶空間定義*/
[函數(shù)]

int InsertToHashTable(int NewElemKey)
{

/**//*將元素NewElemKey插入散列桶中,若插入成功則返回0,否則返回-1*/

/**//*設(shè)插入第一個元素前基桶的所有KeyData[]、Link域已分別初始化為NULLKEY、NULL*/

int Index; /**//*基桶編號*/
int i,k;
BUCKET *s,*front,*t;
____(1)____;//(1)Index=NewElemKey%P

for(i=0; i<ITEMS; i++) /**//*在基桶查找空閑單元,若找到則將元素存入*/

if (Bucket[Index].KeyData[i] == NULLKEY)
{
Bucket[Index].KeyData[i] = NewElemKey; break;
}
if (____(2)____)return 0;//(2)i<ITEMS

/**//*若基桶已滿,則在溢出桶中查找空閑單元,若找不到則申請新的溢出桶*/
_____(3)_____; t = Bucket[Index].Link;//(3)front=&Bucket[Index],或front=Bucket+Index

if (t != NULL)
{ /**//*有溢出桶*/

while (t != NULL)
{
for(k = 0;k < ITEMS; k++)

if (t -> KeyData[k] == NULLKEY)
{ /**//*在溢出桶鏈表中找到空閑單元*/
t -> KeyData[k] = NewElemKey; break;

}/**//*if*/
if (____(4)____) t = t-> Link;//(4)k>=ITEMS
else break;

} /**//*while*/

} /**//*if*/

if (____(5)____)
{ /**//*申請新溢出桶并將元素存入*///(5)t==NULL
s = (BUCKET *)malloc(sizeof(BUCKET));
if (!s) return -1;
s->Link = NULL;
for(k = 0; k < ITEMS; k++)
s->KeyData[k] = NULLKEY;
s->KeyData[0] = NewElemKey;
_____(6)_____;//(6)front->Link=s;

} /**//*if*/
return 0;

}/**//*InsertToHashTable*/

試題五
#include <iostream>
const OBS_MAXNUM = 20 //最多與OfficeDoc對象相關(guān)聯(lián)的DocExplorer對象的個數(shù)
____(1)____; //(1)class OfficeDoc


class DocExploer
{ //關(guān)注OfficeDoc公文對象的類
public:
DocExplorer (____(2)____ *doc); //構(gòu)造函數(shù)
//(2)OfficeDoc
_____(3)____ void update(OfficeDoc *doc)=0; //更新自身狀態(tài)的函數(shù)
//(3)virtual
//其它相關(guān)屬性和方法省略
}


class OfficeDoc
{ //公文類
private:
DocExploer *myObs[OBS_MAXNUM];
//關(guān)注此公文類的DocExplorer類對象指針數(shù)組
int index; //與OfficeDoc對象關(guān)聯(lián)的DocExploer對象的個數(shù)
public:

OfficeDoc()
{
index=0;
}

void attach(DocExploer *o)
{
//將一DocExploer對象與OfficeDoc對象相關(guān)聯(lián)
if (index >= OBS_MAXNUM || o == NULL) return;
for (int loop = 0; loop < index; loop++)
if (myObs[loop] == 0) return;
myObs[index] = o;
index++;
}

void detach(DocExploer *o)
{
//解除某DocExploer對象與OfficeDoc對象的關(guān)聯(lián)
if(o==NULL) return;

for(int loop = 0 ;loop < index; loop++)
{

if(myObs[loop] == o)
{
if (loop <= index-2) myObs[loop] = myObs[index-1];
myObs[index-1] = NULL;
index--;
break;
}
}
}
private:

void notifyObs()
{ //通知所有的DocExplorer對象更改自身狀態(tài)

for(int loop = 0; loop <index; loop++)
{
myObs[loop]->____(4)____; //DocExplorer對象更新自身狀態(tài)
//(4)update(this)
}
}
//其它公文類的相關(guān)屬性和方法
};


DocExplorer::DocExplorer(OfficeDoc *doc)
{ //DocExploer類對象的構(gòu)造函數(shù)
doc->____(5)____; //將此DocExplorer對象與doc對象相關(guān)聯(lián)
//(5)attach(this)
}
試題七
用C實現(xiàn)試題五
#include <stdio.h>
#define OBS_MAXNUM 20 /*一個OfficeDoc變量最多能夠關(guān)聯(lián)的DocExplorer變量的個數(shù)*/
typedef void (____(1)____) (struct OfficeDoc * ,struct DocExplorer *);
//(1)*func


struct DocExplorer
{

func update; /**//*DocExplorer結(jié)構(gòu)采用的更新函數(shù)*/

/**//*其它的結(jié)構(gòu)字段省略*/

};


struct OfficeDoc
{
___(2)____myObs[OBS_MAXNUM]; //(2)struct DocExplorer*

/**//*存儲所有與OfficeDoc相關(guān)聯(lián)的DocExplorer結(jié)構(gòu)指針*/

int index; /**//*與OfficeDoc結(jié)構(gòu)變量相關(guān)聯(lián)的DocExplorer結(jié)構(gòu)變量的個數(shù)*/
};


void attach(struct OfficeDoc *doc, struct DocExplorer *ob)
{

/**//*關(guān)聯(lián)Obersver結(jié)構(gòu)ob與OfficeDoc結(jié)構(gòu)doc*/
int loop = 0;
if (doc -> index >= OBS_MAXNUM || ob == NULL) return;
for(loop = 0; loop < doc->index; loop++)
if (doc -> myObs[loop] == ob) return;
doc->myObs[doc->index] = ob;
doc->index++;
}


void detach(struct OfficeDoc *doc, struct DocExplorer *ob)
{

/**//*解除doc結(jié)構(gòu)與ob結(jié)構(gòu)間的關(guān)系*/
int loop;
if(ob == NULL) return;

for(loop = 0;loop < doc->index; loop++)
{

if(doc->myObs[loop] == ob)
{
if (loop <= doc->index - 2)
doc->myObs[loop] = doc->myObs[____(3)____];//(3)doc->index-1
doc->myObs[doc->index-1] = NULL;
doc->index--;
breack;
}
}
}


void update1(struct OfficeDoc *doc, struct DocExplorer *ob)
{

/**//*更新ob結(jié)構(gòu)的值,更新代碼省略*/
}


void update2(struct OfficeDoc *doc, struct DocExplorer *ob)
{

/**//*更新ob結(jié)構(gòu)的值,更新代碼省略*/
}


void notifyObs(struct OfficeDoc *doc)
{

/**//*當doc結(jié)構(gòu)的值發(fā)生變化時,通知與之關(guān)聯(lián)的所有DocExplorer結(jié)構(gòu)變量*/
int loop;

for(loop = 0; loop < doc->index; loop++)
{
(doc->myObs[loop])->update(____(4)____);//(4)doc,doc->myObs[loop]
}
}


void main()
{

struct OfficeDoc doc; /**//*定義一OfficeDoc變量*/

struct DocExplorer explorer1,explorer2; /**//*定義兩個DocExplorer變量*/

/**//*初始化與OfficeDoc變量相關(guān)的DocExplorer變量個數(shù)為0*/
doc.index = 0;

explorer1.update = update1; /**//*設(shè)置explorer1變量的更新函數(shù)*/

explorer2.update = update2; /**//*設(shè)置explorer2變量的更新函數(shù)*/

attach(&doc , &explorer1); /**//*關(guān)聯(lián)explorer1與doc對象*/

attach(&doc , &explorer1); /**//*關(guān)聯(lián)explorer1與doc對象*/

/**//*其它代碼省略*/

_____(5)____;/**//*通知與OfficeDoc相關(guān)的所有DocExploer變量*/
//(5)notifyObs(&doc)
return;
}