锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
8.11
typedef struct {
char *start;
int size;
} fmblock; //絀洪棽鍧楃被鍨?/SPAN>
char *Malloc_Fdlf(int n)//閬靛驚鏈鍚庡垎閰嶈呮渶鍏堥噴鏀捐鍒欑殑鍐呭瓨鍒嗛厤綆楁硶
{
while(Gettop(S,b)&&b.size<n)
{
Pop(S,b);
Push(T,b); //浠庢爤欏墮愪釜鍙栧嚭絀洪棽鍧楄繘琛屾瘮杈?/SPAN>
}
if(StackEmpty(S)) return NULL; //娌℃湁澶у皬瓚沖鐨勭┖闂插潡
Pop(S,b);
b.size-=n;
if(b.size) Push(S,{b.start+n,b.size});//鍒嗗壊絀洪棽鍧?/SPAN>
while(!StackEmpty(T))
{
Pop(T,a);
Push(S,a);
} //鎭㈠鍘熸潵嬈″簭
return b.start;
}//Malloc_Fdlf
mem_init()//鍒濆鍖栬繃紼?/SPAN>
{
...
InitStack(S);InitStack(T); //S鍜?/SPAN>T鐨勫厓绱犻兘鏄?/SPAN>fmblock綾誨瀷
Push(S,{MemStart,MemLen}); //涓寮濮?/SPAN>,鏍堜腑鍙湁涓涓唴瀛樻暣鍧?/SPAN>
...
}//main
8.12
void Free_Fdlf(char *addr,int n)//涓庝笂涓棰樺搴旂殑閲婃斁綆楁硶
{
while(Gettop(S,b)&&b.start<addr)
{
Pop(S,b);
Push(T,b);
} //鍦ㄦ寜鍦板潃鎺掑簭鐨勬爤涓壘鍒板悎閫傜殑鎻掑叆浣嶇疆
if(Gettop(T,b)&&(b.start+b.size==addr)) //鍙互涓庝笂閭誨潡鍚堝茍
{
Pop(T,b);
addr=b.start;n+=b.size;
}
if(Gettop(S,b)&&(addr+n==b.start)) //鍙互涓庝笅閭誨潡鍚堝茍
{
Pop(S,b);
n+=b.size;
}
Push(S,{addr,n}); //鎻掑叆鍒扮┖闂插潡鏍堜腑
while(!StackEmpty(T))
{
Pop(T,b);
Push(S,b);
} //鎭㈠鍘熸潵嬈″簭
}//Free_Fdlf
8.13
void Free_BT(Space &pav,Space p)//鍦ㄨ竟鐣屾爣璇嗘硶鐨勫姩鎬佸瓨鍌ㄧ鐞嗙郴緇熶腑鍥炴敹絀洪棽鍧?/SPAN>p
{
n=p->size;
f=p+n-1; //f鎸囧悜絀洪棽鍧楀簳閮?/SPAN>
if((p-1)->tag&&(f+1)->tag) //鍥炴敹鍧椾笂涓嬮偦鍧楀潎涓哄崰鐢ㄥ潡
{
p->tag=0;f->tag=0;
f->uplink=p;
if(!pav)
{
p->llink=p;
p->rlink=p;
}
else
{
q=pav->llink;
p->llink=q;p->rlink=pav;
q->rlink=p;pav->llink=p;
}
pav=p;
}//if
else if(!(p-1)->tag&&(f+1)->tag) //涓婇偦鍧椾負絀洪棽鍧?/SPAN>
{
q=(p-1)->uplink;
q->size+=n;
f->uplink=q;
f->tag=0;
}
else if((p-1)->tag&&!(f+1)->tag) //涓嬮偦鍧椾負絀洪棽鍧?/SPAN>
{
q=f+1;
s=q->llink;t=q->rlink;
p->llink=s;p->rlink=t;
s->rlink=p;t->llink=p;
p->size+=q->size;
(q+q->size-1)->uplink=p;
p->tag=0;
}
else //涓婁笅閭誨潡鍧囦負絀洪棽鍧?/SPAN>
{
s=(p-1)->uplink;
t=f+1;
s->size+=n+t->size;
t->llink->rlink=t->rlink;
t->rlink->llink=t->llink;
(t+t->size-1)->uplink=s;
}
}//Free_BT,璇ョ畻娉曞湪璇炬湰閲屾湁璇︾粏鐨勬弿榪?/SPAN>.
8.14
void Free_BS(freelist &avail,char *addr,int n)//浼欎即緋葷粺鐨勭┖闂插潡鍥炴敹綆楁硶
{
buddy=addr%(2*n)?(addr-n):(addr+n); //姹傚洖鏀跺潡鐨勪紮浼村湴鍧
addr->tag=0;
addr->kval=n;
for(i=0;avail[i].nodesize<n;i++); //鎵懼埌榪欎竴澶у皬鐨勭┖闂插潡閾?/SPAN>
if(!avail[i].first) //灝氭病鏈夎澶у皬鐨勭┖闂插潡
{
addr->llink=addr;
addr->rlink=addr;
avail[i].first=addr; //浣滀負鍞竴涓涓澶у皬鐨勭┖闂插潡
}
else
{
for(p=avail[i].first;p!=buddy&&p!=avail[i].first;p=p->rlink);//瀵繪壘浼欎即
if(p==buddy) //浼欎即涓虹┖闂插潡,姝ゆ椂榪涜鍚堝茍
{
if(p->rlink==p) avail[i].first=NULL;//浼欎即鏄澶у皬鐨勫敮涓絀洪棽鍧?/SPAN>
else
{
p->llink->rlink=p->rlink;
p->rlink->llink=p->llink;
} //浠庣┖闂插潡閾句腑鍒犲幓浼欎即
new=addr>p?p:addr; //鍚堝茍鍚庣殑鏂板潡棣栧潃
Free_BS(avail,new,2*n); //閫掑綊鍦板洖鏀舵柊鍧?/SPAN>
}//if
else //浼欎即涓哄崰鐢ㄥ潡,姝ゆ椂鎻掑叆絀洪棽鍧楅摼澶撮儴
{
q=p->rlink;
p->rlink=addr;addr->llink=p;
q->llink=addr;addr->rlink=q;
}
}//else
}//Free_BS
8.15
FBList *MakeList(char *highbound,char *lowbound)//鎶婂爢緇撴瀯瀛樺偍鐨勭殑鎵鏈夌┖闂插潡閾炬帴鎴愬彲鍒╃敤絀洪棿琛?/SPAN>,騫惰繑鍥炶〃澶存寚閽?/SPAN>
{
p=lowbound;
while(p->tag&&p<highbound) p++; //鏌ユ壘絎竴涓┖闂插潡
if(p>=highbound) return NULL; //娌℃湁絀洪棽鍧?/SPAN>
head=p;
for(q=p;p<highbound;p+=cellsize) //寤虹珛閾捐〃
if(!p->tag)
{
q->next=p;
q=p;
}//if
p->next=NULL;
return head; //榪斿洖澶存寚閽?/SPAN>
}//MakeList
8.16
void Mem_Contract(Heap &H)//瀵瑰爢H鎵ц瀛樺偍绱х緝
{
q=MemStart;j=0;
for(i=0;i<Max_ListLen;i++)
if(H.list[i].stadr->tag)
{
s=H.list[i].length;
p=H.list[i].stadr;
for(k=0;k<s;k++) *(q++)=*(p++); //绱х緝鍐呭瓨絀洪棿
H.list[j].stadr=q;
H.list[j].length=s; //绱х緝鍗犵敤絀洪棿琛?/SPAN>
j++;
}
}//Mem_Contract
1.16
void print_descending(int x,int y,int z)//鎸変粠澶у埌灝忛『搴忚緭鍑轟笁涓暟
{
scanf("%d,%d,%d",&x,&y,&z);
if(x<y) x<->y; //<->涓鴻〃紺轟氦鎹㈢殑鍙岀洰榪愮畻絎?/SPAN>,浠ヤ笅鍚?/SPAN>
if(y<z) y<->z;
if(x<y) x<->y; //鍐掓場鎺掑簭
printf("%d %d %d",x,y,z);
}//print_descending
1.17
Status fib(int k,int m,int &f)//姹?/SPAN>k闃舵枑娉㈤偅濂戝簭鍒楃殑絎?/SPAN>m欏圭殑鍊?/SPAN>f
{
int tempd;
if(k<2||m<0) return ERROR;
if(m<k-1) f=0;
else if (m==k-1 || m==k) f=1;
else
{
for(i=0;i<=k-2;i++) temp[i]=0;
temp[k-1]=1;temp[k]=1; //鍒濆鍖?/SPAN>
sum=1;
j=0;
for(i=k+1;i<=m;i++,j++) //姹傚嚭搴忓垪絎?/SPAN>k鑷崇m涓厓绱犵殑鍊?/SPAN>
temp[i]=2*sum-temp[j];
f=temp[m];
}
return OK;
}//fib
鍒嗘瀽: k闃舵枑娉㈤偅濂戝簭鍒楃殑絎?/SPAN>m欏圭殑鍊?/SPAN>f[m]=f[m-1]+f[m-2]+......+f[m-k]
=f[m-1]+f[m-2]+......+f[m-k]+f[m-k-1]-f[m-k-1]
=2*f[m-1]-f[m-k-1]
鎵浠ヤ笂榪扮畻娉曠殑鏃墮棿澶嶆潅搴︿粎涓?/SPAN>O(m). 濡傛灉閲囩敤閫掑綊璁捐,灝嗚揪鍒?/SPAN>O(k^m). 鍗充嬌閲囩敤鏆傚瓨涓棿緇撴灉鐨勬柟娉?/SPAN>,涔熷皢杈懼埌O(m^2).
1.18
typedef struct{
char *sport;
enum{male,female} gender;
char schoolname; //鏍″悕涓?/SPAN>'A','B','C','D'鎴?/SPAN>'E'
char *result;
int score;
} resulttype;
typedef struct{
int malescore;
int femalescore;
int totalscore;
} scoretype;
void summary(resulttype result[ ])//姹傚悇鏍$殑鐢峰コ鎬誨垎鍜屽洟浣撴誨垎,鍋囪緇撴灉宸茬粡鍌ㄥ瓨鍦?/SPAN>result[ ]鏁扮粍涓?/SPAN>
{
scoretype score[MAXSIZE];
i=0;
while(result[i].sport!=NULL)
{
switch(result[i].schoolname)
{
case 'A':
score[ 0 ].totalscore+=result[i].score;
if(result[i].gender==0) score[ 0 ].malescore+=result[i].score;
else score[ 0 ].femalescore+=result[i].score;
break;
case 'B':
score[ 0 ].totalscore+=result[i].score;
if(result[i].gender==0) score[ 0 ].malescore+=result[i].score;
else score[ 0 ].femalescore+=result[i].score;
break;
鈥︹?/SPAN> 鈥︹?/SPAN> 鈥︹?/SPAN>
}
i++錛?/SPAN>
}
for(i=0;i<5;i++)
{
printf("School %d:\n",i);
printf("Total score of male:%d\n",score[i].malescore);
printf("Total score of female:%d\n",score[i].femalescore);
printf("Total score of all:%d\n\n",score[i].totalscore);
}
}//summary
1.19
Status algo119(int a[ARRSIZE])//姹?/SPAN>i!*2^i搴忓垪鐨勫間笖涓嶈秴榪?/SPAN>maxint
{
last=1;
for(i=1;i<=ARRSIZE;i++)
{
a[i-1]=last*2*i;
if((a[i-1]/last)!=(2*i)) reurn OVERFLOW;
last=a[i-1];
return OK;
}
}//algo119
鍒嗘瀽:褰撴煇涓欏圭殑緇撴灉瓚呰繃浜?/SPAN>maxint鏃?/SPAN>,瀹冮櫎浠ュ墠闈竴欏圭殑鍟嗕細鍙戠敓寮傚父.
1.20
void polyvalue()
{
float temp;
float *p=a;
printf("Input number of terms:");
scanf("%d",&n);
printf("Input value of x:");
scanf("%f",&x);
printf("Input the %d coefficients from a0 to a%d:\n",n+1,n);
p=a;xp=1;sum=0; //xp鐢ㄤ簬瀛樻斁x鐨?/SPAN>i嬈℃柟
for(i=0;i<=n;i++)
{
scanf("%f",&temp);
sum+=xp*(temp);
xp*=x;
}
printf("Value is:%f",sum);
}//polyvalue