




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第一章緒論
一、選擇題
1.組成數(shù)據(jù)的基本單位是()
(A)數(shù)據(jù)項(B)數(shù)據(jù)類型(C)數(shù)據(jù)元素(D)數(shù)據(jù)變量
2.數(shù)據(jù)結(jié)構(gòu)是研究數(shù)據(jù)的()以及它們之間的相互關(guān)系。
(A)理想結(jié)構(gòu),物理結(jié)構(gòu)(B)理想結(jié)構(gòu),抽象結(jié)構(gòu)
(C)物理結(jié)構(gòu),邏輯結(jié)構(gòu)(D)抽象結(jié)構(gòu),邏輯結(jié)構(gòu)
3.在數(shù)據(jù)結(jié)構(gòu)中,從邏輯上可以把數(shù)據(jù)結(jié)構(gòu)分成()
(A)動態(tài)結(jié)構(gòu)和靜態(tài)結(jié)構(gòu)(B)緊湊結(jié)構(gòu)和非緊湊結(jié)構(gòu)
(C)線性結(jié)構(gòu)和非線性結(jié)構(gòu)(D)內(nèi)部結(jié)構(gòu)和外部結(jié)構(gòu)
4.數(shù)據(jù)結(jié)構(gòu)是一門研究非數(shù)值計算的程序設(shè)計問題中計算機(jī)的(①)以及它們之間的(②)
和運(yùn)算等的學(xué)科。
①(A)數(shù)據(jù)元素(B)計算方法(C)邏輯存儲(D)數(shù)據(jù)映像
②(A)結(jié)構(gòu)(B)關(guān)系(C)運(yùn)算(D)算法
5.算法分析的目的是()。
(A)找出數(shù)據(jù)結(jié)構(gòu)的合理性(B)研究算法中的輸入和輸出的關(guān)系
(O分析算法的效率以求改進(jìn)(D)分析算法的易懂性和文檔性
6.計算機(jī)算法指的是(①),它必須具備輸入、輸出和(②)等5個特性。
①(A)計算方法(B)排序方法(C)解決問題的有限運(yùn)算序列(D)調(diào)度方法
②(A)可執(zhí)行性、可移植性和可擴(kuò)充性(B)可行性、確定性和有窮性
(C)確定性、有窮性和穩(wěn)定性(D)易讀性、穩(wěn)定性和安全性
二、判斷題
1.數(shù)據(jù)的機(jī)內(nèi)表示稱為數(shù)據(jù)的存儲結(jié)構(gòu)。()
2.算法就是程序。()
3.數(shù)據(jù)元素是數(shù)據(jù)的最小單位。()
4.算法的五個特性為:有窮性、輸入、輸出、完成性和確定性。()
5.算法的時間復(fù)雜度取決于問題的規(guī)模和待處理數(shù)據(jù)的初態(tài)。()
三、填空題
1.數(shù)據(jù)邏輯結(jié)構(gòu)包括__、__、.和—四種類型,其中樹形結(jié)構(gòu)
和圖形結(jié)構(gòu)合稱為_____。
2.在線性結(jié)構(gòu)中,第一個結(jié)點(diǎn)前驅(qū)結(jié)點(diǎn),其余每個結(jié)點(diǎn)有且只有____個前驅(qū)結(jié)點(diǎn);最后
一個結(jié)點(diǎn)_______后續(xù)結(jié)點(diǎn),其余每個結(jié)點(diǎn)有且只有________個后續(xù)結(jié)點(diǎn)。
3.在樹形結(jié)構(gòu)中,樹根結(jié)點(diǎn)沒有______結(jié)點(diǎn),其余每個結(jié)點(diǎn)有且只有________個前驅(qū)結(jié)點(diǎn);葉
子結(jié)點(diǎn)沒有_________結(jié)點(diǎn),其余每個結(jié)點(diǎn)的后續(xù)結(jié)點(diǎn)可以_______o
4.在圖形結(jié)構(gòu)中,每個結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)數(shù)和后續(xù)結(jié)點(diǎn)數(shù)可以________。
5.線性結(jié)構(gòu)中元素之間存在_______關(guān)系,樹形結(jié)構(gòu)中元素之間存在_______關(guān)系,圖形結(jié)構(gòu)中
元素之間存在________關(guān)系。
6.算法的五個重要特性是______、________、_______、________、________。
7.數(shù)據(jù)結(jié)構(gòu)的三要素是指_____、________和_________。
8.鏈?zhǔn)酱鎯Y(jié)構(gòu)與順序存儲結(jié)構(gòu)相比較,主要優(yōu)點(diǎn)是____________________________________。
9.設(shè)有一批數(shù)據(jù)元素,為了最快的存儲某元素,數(shù)據(jù)結(jié)構(gòu)宜用________結(jié)構(gòu),為了方便插入一
個元素,數(shù)據(jù)結(jié)構(gòu)宜用______________結(jié)構(gòu)。
四、算法分析題
1.求下列算法段的語句頻度及時間復(fù)雜度
參考答案:
一、選擇題
1.C2.C3.C4.A、B5.C6.C、B
二、判斷題:
1、J2、X3、X4、義5、J
三、填空題
1、線性、樹形、圖形、集合?;非線性(網(wǎng)狀)2、沒有;1;沒有;13、前驅(qū);1;后繼;
任意多個4、任意多個5、一對一;一對多;多對多6、有窮性;確定性;可行性;輸入;
輸出7、數(shù)據(jù)元素;邏輯結(jié)構(gòu);存儲結(jié)構(gòu)8、插入、刪除、合并等操作較方便9、順序存儲;
鏈?zhǔn)酱嬲?/p>
四、算法分析題
for(i=l;i<=n;i++)
for(j=1;j<=i;j++)
x=x+1;
分析:該算法為一個二重循環(huán),執(zhí)行次數(shù)為內(nèi)、外循環(huán)次數(shù)相乘,但內(nèi)循環(huán)次數(shù)不固定,與
外循環(huán)有關(guān),因些,時間頻度T(n)=l+2+3+…+n=n*(n+l)/2
有l(wèi)/4WT(n)/n2Wl,故它的時間復(fù)雜度為0(n2),即T(n)與n2數(shù)量級相同。2、分析
下列算法段的時間頻度及時間復(fù)雜度
for(i=l;i<=n;i++)
for(j=l;j<=i;j++)
for(k=l;k〈=j;k++)
x=i+j-k;
分析算法規(guī)律可知時間頻度T(n)=1+(1+2)+(1+2+3)+...+(1+2+3+…+n)
由于有1/6WT(n)/n3W1,故時間復(fù)雜度為0(n3)
第二章線性表
一、選擇題
1.一個線性表第一個元素的存儲地址是100,每個元素的長度為2,則第5個元素的地址是()
(A)110(B)108(C)100(D)120
2.向一個有127個元素的順序表中插入一個新元素并保持原來順序不變,平均要移動()
個元素。
(A)64(B)63(C)63.5(D)7
3.線性表采用鏈?zhǔn)酱鎯Y(jié)構(gòu)時,其地址()。
(A)必須是連續(xù)的(B)部分地址必須是連續(xù)的
(C)一定是不連續(xù)的(D)連續(xù)與否均可以
4.在一個單鏈表中,若p所指結(jié)點(diǎn)不是最后結(jié)點(diǎn),在p之后插入s所指結(jié)點(diǎn),則執(zhí)行()
(A)s->next=p;p->next=s;(B)s->next=p-〉next;p->next=s;
(C)s->next=p->next;p=s;(D)p->next=s;s->next=p;
5.在一個單鏈表中,若刪除p所指結(jié)點(diǎn)的后續(xù)結(jié)點(diǎn),則執(zhí)行()
(A)p->next=p->next->next;(B)p=p->next;p->next=p->next->next;
(C)p->next=p->next;(D)p=p->next->next;
6.下列有關(guān)線性表的敘述中,正確的是()
(A)線性表中的元素之間隔是線性關(guān)系
(B)線性表中至少有一個元素
(C)線性表中任何一個元素有且僅有?個直接前趨
(D)線性表中任何一個元素有且僅有一個直接后繼
7.線性表是具有n個()的有限序列(nWO)
(A)表元素(B)字符(C)數(shù)據(jù)元素(D)數(shù)據(jù)項
二、判斷題
1.線性表的鏈接存儲,表中元素的邏輯順序與物理順序一定相同。()
2.如果沒有提供指針類型的語言,就無法構(gòu)造鏈?zhǔn)浇Y(jié)構(gòu)。()
3.線性結(jié)構(gòu)的特點(diǎn)是只有一個結(jié)點(diǎn)沒有前驅(qū),只有一個結(jié)點(diǎn)沒有后繼,其余的結(jié)點(diǎn)只有一個
前驅(qū)和后繼。()
4.語句p=p->next完成了指針賦值并使p指針得到了p指針?biāo)负罄^結(jié)點(diǎn)的數(shù)據(jù)域值。()
5.要想刪除p指針的后繼結(jié)點(diǎn),我們應(yīng)該執(zhí)行q=p-〉next;p->next=q->next;free(q)?
()
三、填空題
1.已知P為單鏈表中的非首尾結(jié)點(diǎn),在P結(jié)點(diǎn)后插入S結(jié)點(diǎn)的語句為:
2.順序表中邏輯上相鄰的元素物理位置()相鄰,單鏈表中邏輯上相鄰的元素物理位置
__________相鄰。
3.線性表匕=(al,a2,an)采用順序存儲,假定在不同的n+1個位置上插入的概率
相同,則插入一個新元素平均需要移動的元素個數(shù)是____________________________
4.在非空雙向循環(huán)鏈表中,在結(jié)點(diǎn)q的前面插入結(jié)點(diǎn)p的過程如下:
p->prior=q->prior;
q->prior->next=p;
p->next=q;
5.已知L是無表頭結(jié)點(diǎn)的單鏈表,是從下列提供的答案中選擇合適的語句序列,分別實現(xiàn):
(1)表尾插入s結(jié)點(diǎn)的語句序列是_____________________________________
(2)表尾插入s結(jié)點(diǎn)的語句序列是_____________________________________
1.p-〉next=s;
2.p=L;
3.L=s;
4.p->next=s->next;
5.s->next=p->next;
6.s->next=L;
7.s->next=nul1;
8.while(p->next!=Q)?p=p-next;
9.while(p->next!=nul1)p=p->next;
四、算法設(shè)計題
1.試編寫一個求已知單鏈表的數(shù)據(jù)域的平均值的函數(shù)(數(shù)據(jù)域數(shù)據(jù)類型為整型)。
2.已知帶有頭結(jié)點(diǎn)的循環(huán)鏈表中頭指針為head,試寫出刪除并釋放數(shù)據(jù)域值為x的所有結(jié)點(diǎn)
的c函數(shù)。
3.某百貨公司倉庫中有一批電視機(jī),按其價格從低到高的次序構(gòu)成一個循環(huán)鏈表,每個結(jié)點(diǎn)
有價格、數(shù)量和鏈指針三個域?,F(xiàn)出庫(銷售)m臺價格為h的電視機(jī),試編寫算法修改原
鏈表。
4.某百貨公司倉庫中有一批電視機(jī),按其價格從低到高的次序構(gòu)成一個循環(huán)鏈表,每個結(jié)點(diǎn)
有價格、數(shù)量和鏈指針三個域?,F(xiàn)新到m臺價格為h的電視機(jī),試編寫算法修改原鏈表。
5.線性表中的元素值按遞增有序排列,針對順序表和循環(huán)鏈表兩種不同的存儲方式,分別編
寫C函數(shù)刪除線性表中值介于a與b(aWb)之間的元素。
6.設(shè)A=(aO,al,a2,...,an-1),B=(bO,bl,b2..bmT)是兩個給定的線性表,它們的結(jié)點(diǎn)個數(shù)
分別是n和%且結(jié)點(diǎn)值均是整數(shù)。
若n=m,且ai=bi(OWi<n),則A=B;
若n<m,且ai=bi(OWi<n),則A<B;
若存在一個j,j<m,j<n,且ai=bi(OWi〈j),若aj<bj,則A<B,否則A〉B。
試編寫一個比較A和B的C函數(shù),該函數(shù)返回-1或0或1,分別表示A〈B或A=B或A>B?
7.試編寫算法,刪除雙向循環(huán)鏈表中第k個結(jié)點(diǎn)。
8.線性表由前后兩部分性質(zhì)不同的元素組成(aO,al,,an-1,bO,bl,...,bm-1),m和n為兩
部分元素的個數(shù),若線性表分別采用數(shù)組和鏈表兩種方式存儲,編寫算法將兩部分元素?fù)Q位成
(bO,bl,,bm-1,aO,al,...,an-1),分析兩種存儲方式下算法的時間和空間復(fù)雜度。
9.用循環(huán)鏈表作線性表(aO,al,...,anT)和(bO,bl,...,bm-1)的存儲結(jié)構(gòu),頭指針分別為
ah和bh,設(shè)計C函數(shù),把兩個線性表合并成形如(aO,bO,al,bl,…)的線性表,要求不開辟
新的動態(tài)空間,利用原來循環(huán)鏈表的結(jié)點(diǎn)完成合并操作,結(jié)構(gòu)仍為循環(huán)鏈表,頭指針為head,并
分析算法的時間復(fù)雜度。
10.試寫出將一個線性表分解為兩個帶有頭結(jié)點(diǎn)的循環(huán)鏈表,并將兩個循環(huán)鏈表的長度放在各
自的頭結(jié)點(diǎn)的數(shù)據(jù)域中的C函數(shù)。其中,線性表中序號為偶數(shù)的元素分解到第一個循環(huán)鏈表中,
序號為奇數(shù)的元素分解到第二個循環(huán)鏈表中。
11.試寫出把線性鏈表改為循環(huán)鏈表的C函數(shù)。
12.己知非空線性鏈表中x結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)為y,試寫出刪除x結(jié)點(diǎn)的C函數(shù)。
參考答案:
一、選擇題
1.B2.C3.D4.B5.A6.A7、C
二、判斷題:
參考答案:1、義2、J3、X4、X5、V
三、填空題
1、s->next=p->next;p->next=s;2、一'定;不一(定3、n/24、q->prior=p;5、(1)6)3)
(2)2)9)1)7)
四、算法設(shè)計題
1、
#include〃stdio.h〃
^include/zmalloc.h"
typedefstructnode
{intdata;
structnode*1ink;
}N0DE;
intaver(NODE*head)
{inti=0,sum=0,ave;NODE*p;
p二head;
while(p!=NULL)
{p=p->link;++i;
sum=sum+p->data;}
ave=sum/i;
return(ave);}
2、
ttinclude"stdio.h〃
ttincludez,malloc.h〃
typedefstructnode
(
intdata;/*假設(shè)數(shù)據(jù)域為整型*/
structnode*1ink;
INODE;
voiddel_link(NODE*head,intx)/*刪除數(shù)據(jù)域為x的結(jié)點(diǎn)*/
(
NODE*p,*q,*s;
p二head;
q=head->link;
while(q!=head)
{if(q->data==x)
{p->link=q->link;
s二q;
q=q->link;
free(s);)
else
(
P=Q;
q=q->link;
}
)
3、
voiddel(NODE*head,floatprice,intnum)
{
NODE*p,*q,*s;
p=head;q二head->next;
while(q->price<price&&q!二head)
{
p=q;
q=q->next;
}
if(q->price==price)
q->num=q->num-num;
else
printf(〃無此產(chǎn)品〃);
if(q->num==0)
(
p->next=q->next;
free(q);
)
)
4、
#include〃stdio.h〃
^include/zmalloc.h"
typedefstructnode
(
floatprice;
intnum;
structnode*next;
}NODE;
voidins(NODE*head,floatprice,intnum)
NODE*p,*q,*s;
p=head;q=head-〉next;
while(q->price<price&ftq!=head)
(
P二q;
q=q->next;
)
if(q->price==price)
q->num=q->num+num;
else
(
s=(NODE*)malloc(sizeof(NODE));
s->price=price;
s->num=num;
s->next=p->next;
p->next=s;
}
}
5、順序表:
算法思想:從0開始掃描線性表,用k記錄下元素值在a與b之間的元素個數(shù),對于不滿足
該條件的元素,前移k個位置,最后修改線性表的長度。
voiddel(elemtype1ist[],int*n,elemtypea,elemtypeb)
(
inti=0,k=0;
while(i<n)
(
if(1ist[i]>=a&&list[i]<=b)k++;
else
list[i-k]=list[i];
i++;
)
*n=*n-k;/*修改線性表的長度*/
)
循環(huán)鏈表:
voiddel(NODE*head,elemtypea,elemtypeb)
{
NODE*p,*q;
p=head;q=p->link;/*假設(shè)循環(huán)鏈表帶有頭結(jié)點(diǎn)*/
while(q!=head&&q->data<a)
{
P=q;
q=q->link;
}
while(q!=head&&q->data<b)
(
r=q;
q=q->link;
free(r);
)
if(p!=q)
p->link=q;
)
6、
#defineMAXSIZE100
intlistA[MAXSIZE],1istB[MAXSIZE];
intn,m;
intcompare(inta[],intb[])
inti=0;
while(a[i]==b[i]&&i<n&&i<m)
i++;
if(n==m&&i==n)return(0);
if(n<m&&i==n)return(-1);
if(n>m&&i==m)return(1);
if(i<n&&i<m)
if(a[i]<b[i])return(-1);
elseif(a[i]>b[i])return(1);
}
7、
voiddel(DUNODE**head,inti)
(
DUNODE*p;
if(i==0)
(
*head=*head->next;
*head->prior=NULL;
return(0);
)
Else
{for(j=0;j<i&&p!=NULL;j++)
p=p->next;
if(p==NULL|Ij>i)return(1);
p->prior->next=p->next;
p->next->prior=p->proir;
free(p);
return(0);
}
8.
順序存儲:
voidconvert(elemtypelist[],intl,inth)/*將數(shù)組中第1個到第h個元素逆置*/
inti;
elemtypetemp;
for(i=h;i<=(l+h)/2;i++)
(
temp=list[i];
list[i]=list[1+h-i];
list[1+h-i]=temp;
}
)
voidexchange(elemtype1ist[],intn,intm);
(
convert(1ist,0,n+m-1);
convert(1ist,0,m-1);
convert(1ist,m,n+m-1);
)
該算法的時間復(fù)雜度為0(n+m),空間復(fù)雜度為0(1)
鏈接存儲:(不帶頭結(jié)點(diǎn)的單鏈表)
typedefstructnode
(
elemtypedata;
structnode*1ink;
}N0DE;
voidconvert(NODE**head,intn,intm)
(
NODE*p,*q,*r;
inti;
p=*head;
q=*head;
for(i=0;i<n-l;i++)
q=q->link;/*q指向anT結(jié)點(diǎn)*/
r=q->link;
q->link=NULL;
while(r->link!=NULL)
r=r->link;/*r指向最后一個bmT結(jié)點(diǎn)*/
*head=q;
r->link=p;
)
該算法的時間復(fù)雜度為O(n+m),但比順序存儲節(jié)省時間(不需要移動元素,只需改變指針),空
間復(fù)雜度為0(1)
9.
typedefstructnode
(
elemtypedata;
structnode*1ink;
}N0DE;
NODE*union(NODE*ah,NODE*bh)
{
NODE*a,*b,*head,*r,*q;
head=ah;
a=ah;
b=bh;
while(a->link!=ah&&b->link!=bh)
(
r=a->link;
q=b->link;
a->link=b;
b->link=r;
a=r;
b二q
if(a->link==ah)/*a的結(jié)點(diǎn)個數(shù)小于等于b的結(jié)點(diǎn)個數(shù)*/
a->1ink=b;
while(b->link!=bh)
b=b->link;
b->link=head;
)
if(b->link==bh)/*b的結(jié)點(diǎn)個數(shù)小于a的結(jié)點(diǎn)個數(shù)*/
(
r=a->link;
a->link=b;
b->link=r;
)
return(head);
)
該算法的時間復(fù)雜度為O(n+m),其中n和m為兩個循環(huán)鏈表的結(jié)點(diǎn)個數(shù).
10.
typedefstructnode
(
elemtypedata;
structnode*1ink;
}NODE;
voidanalyze(NODE*a)
(
NODE*rh,*qh,*r,*q,*p;
inti=0,j=0;/*i為序號是奇數(shù)的結(jié)點(diǎn)個數(shù)j為序號是偶數(shù)的結(jié)點(diǎn)個數(shù)*/
p=a;
rh=(NODE*)malloc(sizeof(NODE));/*rh為序號是奇數(shù)的鏈表頭指針*/
qh=(NODE*)malloc(sizeof(NODE));/*qh為序號是偶數(shù)的鏈表頭指針*/
r=rh;
q=qh;
while(p!=NULL)
r->link=p;
r=P;
i++;
p=p->link;
if(p!=NULL)
(
q->link=p;
q=P;
j++;
p=p->link;
)
}
rh->data=i;
r->link=rh;
qh->data=j;
q->link=qh;
)
11.
typedefstructnode
(
elemtypedata;
structnode*1ink;
)N0DE;
voidchange(NODE*head)
(
NODE*p;
p二head;
if(head!=NULL)
while(p->link!=NULL)
p=p->link;
p->link=head;
)
)
12.
typedefstructnode
(
elemtypedata;
structnode*link;
}NODE;
voiddel(NODE*x,NODE*y)
(
NODE*p,*q;
elemtypedl;
P=y;
q=x;
while(q->next!=NULL)/*把后一個結(jié)點(diǎn)數(shù)據(jù)域前移到前?個結(jié)點(diǎn)*/
(
p->data=q->data;
q=q->link;
P二q;
p->link=NULL;/*刪除最后一個結(jié)點(diǎn)*/
free(q);
第三章棧和隊列
一、選擇題
1.一個棧的入棧序列是a,b,c,d,e,則棧的不可能的輸出序列是()。
(A)edcba(B)decba(C)dceab(D)abode
2.棧結(jié)構(gòu)通常采用的兩種存儲結(jié)構(gòu)是()。
(A)線性存儲結(jié)構(gòu)和鏈表存儲結(jié)構(gòu)(B)散列方式和索引方式
(C)鏈表存儲結(jié)構(gòu)和數(shù)組(D)線性存儲結(jié)構(gòu)和非線性存儲結(jié)構(gòu)
3.判定??個棧ST(最多元素為mO)為空的條件是()。
(A)ST->top!=0(B)ST->top==0
(C)ST-)top!=m0(D)ST-〉top=mO
4.判定一個棧ST(最多元素為mO)為棧滿的條件是()。
(A)ST->top!=0(B)ST->top-=0
(C)ST->top!=mO-l(D)ST->top==mO-l
5.一個隊列的入列序列是1,2,3,4,則隊列的輸出序列是()。
(A)4,3,2,1(B)1,2,3,4(C)1,4,3,2(D)3,2,4,1
6.循環(huán)隊列用數(shù)組A[0,m-l]存放其元素值,已知其頭尾指針分別是front和rear則當(dāng)前隊列
中的元素個數(shù)是()
(A)(rear-front+m)%m(B)rear-front+1(C)rear-front-1(D)rear-front
7.棧和隊列的共同點(diǎn)是()
(A)都是先進(jìn)后出(B)都是先進(jìn)先出
(C)只允許在端點(diǎn)處插入利刪除元素(D)沒有共同點(diǎn)
8.表達(dá)式a*(b+c)-d的后綴表達(dá)式是()。
(A)abcd*+-(B)abc+*d-(C)abc*+d-(D)-+*abcd
9.4個元素al,a2,a3和a4依次通過一個棧,在a4進(jìn)棧前,棧的狀態(tài),則不可能的出棧序
是()
(A)a4,a3,a2,al(B)a3.a2,a4,al
(C)a3,al,a4,a2(D)a3,a4,a2,al
10.以數(shù)組Q[0..m-l]存放循環(huán)隊列中的元素,變量rear和qulen分別指示循環(huán)隊列中隊尾
元素的實際位置和當(dāng)前隊列中元素的個數(shù),隊列第一個元素的實際位置是()
(A)rear—qulen(B)rear—qulen+m
(C)m—qulen(D)1+(rear+m—qulen)%m
二、填空題
1.棧的特點(diǎn)是__________________________隊列的特點(diǎn)是_______________________________。
2.線性表、棧和隊列都是_______________________結(jié)構(gòu),可以在線性表的________________位置
插入和刪除元素,對于棧只能在插入和刪除元素,對于隊列只能在插入元素
和__________刪除元素。
3.一個棧的輸入序列是12345,則棧有輸出序列12345是____________。(正確/錯誤)
4.設(shè)棧S和隊列Q的初始狀態(tài)皆為空,元素al,a2,a3,a4,a5和a6依次通過一個棧,一
個元素出棧后即進(jìn)入隊列Q,若6個元素出隊列的順序是a3,a5,a4,a6,a2,al則棧S至
少應(yīng)該容納_____個元素。
三、算法設(shè)計題
1.假設(shè)有兩個棧si和s2共享一個數(shù)組stack[M],其中一個棧底設(shè)在stack[0]處,另一個棧
底設(shè)在stack[M-l]處。試編寫對任一棧作進(jìn)棧和出棧運(yùn)算的C函數(shù)push(X,i)和
pop(i),i=l,2。其中i=l表示左邊的棧,,i=2表示右邊的棧。要求在整個數(shù)組元素都被占用
時才產(chǎn)生溢出。
2.利用兩個棧si,s2模擬一個隊列時,如何用棧的運(yùn)算來實現(xiàn)該隊列的運(yùn)算?寫出模擬隊列的
插入和刪除的C函數(shù)。
一個棧si用于插入元素,另一個棧s2用于刪除元素.
參考答案:
一、選擇題
1.C2.A3.B4.B5.B6.B7、C8、C9、C10、D
二、填空題
1,先進(jìn)先出;先進(jìn)后出2、線性;任何;棧頂:隊尾;對頭3、正確的4、3
三、算法設(shè)計題
1.
ttdefineM100
elemtypestack[M];
inttopl=0,top2=m-l;
intpush(elemtypex,inti)
if(topl-top2==l)return(1);/*上溢處理*/
else
if(i==l)stack[topl++]=x;
if(i==2)stack[top2--]=x;
return(0);
}
intpop(elemtype*px,inti)
(
if(i==l)
if(topl==0)return(1);
else
(
topi--;
*px=stack[topi];
return(0);
)
else
if(i==2)
if(top2==M-l)return(1);
else
(
top2++;
*px=stack[top2];
return(0);
}
}
2.
elemtypesi[MAXSIZE],s2[MAZSIZE];
inttopi,top2;
voidenqueue(elemtypex)
if(topl==MAXSIZE)return(1);
else
(
push(si,x);
return(0);
))
voiddequeue(elemtype*px)
(
elemtypex;
top2=0;
while(!empty(si))
(
pop(si,&x);
push(s2,x);
)
pop(s2,&x);
while(!empty(s2))
(
pop(s2,&x);
push(si,x);
}
}
第四章串
一、選擇題
1.下列關(guān)于串的敘述中,正確的是()
(A)一個串的字符個數(shù)即該串的長度(B)一個串的長度至少是1
(C)空串是由一個空格字符組成的串(D)兩個串S1和S2若長度相同,則這兩個串相等
2.字符串"abaaabab”的nextval值為(?)
(A)(0,1,01,1,0,4,1,0,1)(B)(0,1,0,0,0,0,2,1,0,1)
(C)(0,1,0,1,0,0,0,1,1)(D)(0,1,0,1,0,1,0,1,1)
3.字符串滿足下式,其中head和tail的定義同廣義表類似,如head('xyz')=
,x',tail('xyz')='yz',則s=()。concat(head(tai1(s)),head(tail(tail(s))))=
,dc'?
(A)abed(B)aebd(C)aedb(D)adeb
4.串是一種特殊的線性表,其特殊性表現(xiàn)在()
(A)可以順序存儲(B)數(shù)據(jù)元素是一個字符
(C)可以鏈?zhǔn)酱鎯?D)數(shù)據(jù)元素可以是多個字符
5.設(shè)串Sl='ABCDEFG',s2='PQRST',函數(shù)CONCAT(X,Y)返回X和Y串的連接串,SUBSTR
(S,I,J)返回串S從序號I開始的J個字符組成的字串,LENGTH(S)返回串S的長度,
則CONCAT(SUBSTR(SI,2,LENGTH(S2)),SUBSTR(SI,LENGTH(S2),2))的結(jié)果串
是()
(A)BCDEF(B)BCDEFG(C)BCPQRST(D)BCDEFEF
二、算法設(shè)計
1.分別在順序存儲和一般鏈接存儲兩種方式下,用C語言寫出實現(xiàn)把串si復(fù)制到串s2的串復(fù)
制函數(shù)strepy(si,s2)?
2.在一般鏈接存儲(一個結(jié)點(diǎn)存放?個字符)方式下,寫出采用簡單算法實現(xiàn)串的模式匹配的C
語言函數(shù)intLindex(t,p)?
參考答案:
一、選擇題
1.A2.B3.D4.D5.D
二、算法設(shè)計
1.
順序存儲:
ttinclude"string,h”
^defineMAXN100
chars[MAXN];
intSstr1en(chars[1)
inti;
for(i=0;s[i]!='\0';i++);
return(i);
)
voidSstrcpy(charsi[],chars2[])〃4.3題
(
inti;
for(i=0;si[i]!=,\0*;i++)
s2[i]=sl[i];
s2[i"\0';
}
一般鏈接存儲:
ttinclude〃stdio.h〃
typedefstructnode
(
chardata;
structnode*1ink;
}NODE;
NODE*L_strcpy(NODE*sl)
(
NODE*s2,*tl,*t2,*s;
if(sl==NULL)return(NULL);
else
(
tl=sl;
t2=(NODE*)malloc(sizeof(NODE));
s2=t2;
while(tl!=NULL)
(
s=(NODE*)malloc(sizeof(NODE));
s->data=tl->data;
t2->link=s;
12二s;
tl=tl->link;
)
t2->link=NULL;
s=s2;
s2=s2->link;
free(s);
return(s2);
}
)
2.
ttinclude〃stdio.h〃
typedefstructnode
(
chardata;
structnode*1ink;
}NODE;
intL_index(NODE^t,NODE*p)
(
NODE*tl,*pl,*t2;
?inti;
tl=t;i=l;
while(tl!=NULL)
(
pl二P;
t2=t1->1ink;
while(pl->data==tl->data&&pl!=NULL)
(
pl=pl->link;
tl=tl->link;
if(pl==NULL)return(i);
i++;
tl=t2;
)
return(0);
}
第五章數(shù)組和廣義表
一、選擇題
1.常對數(shù)組進(jìn)行的兩種基本操作是()
(A)建立與刪除(B)索引和修改(C)查找和修改(D)查找與索引
2.二維數(shù)組M的元素是4個字符(每個字符占一個存儲單元)組成的串,行下標(biāo)i的范圍從0到
4,列下標(biāo)j的范圍從0到5,M按行存儲時元素M[3][5]的起始地址與M按列存儲時元素()的
起始地址相同。
(A)M[2][4](B)M[3][4](C)M[3][5](D)M[4][4]
3.數(shù)組A[8][10]中,每個元素A的長度為3個字節(jié),從首地址SA開始連續(xù)存放在存儲器內(nèi),存
放該數(shù)組至少需要的單元數(shù)是()。
(A)80(B)100(C)240(D)270
4.數(shù)組A[8][10]中,每個元素A的長度為3個字節(jié),從首地址SA開始連續(xù)存放在存儲器內(nèi),該
數(shù)組按行存放時,元素A[7][4]的起始地址為()。
(A)SA+141(B)SA+144(C)SA+222(D)SA+225
5.數(shù)組A[8][10]中,每個元素A的長度為3個字節(jié),從首地址SA開始連續(xù)存放在存儲器內(nèi),該
數(shù)組按列存放時,元素A[4][7]的起始地址為()。
(A)SA+141(B)SA+180(C)SA+222(D)SA+225
6.稀疏矩陣一般的壓縮存儲方法有兩種,即()。
(A)二維數(shù)組和三維數(shù)組(B)三元組和散列
(C)三元組和十字鏈表(D)散列和十字鏈表
7.若采用三元組壓縮技術(shù)存儲稀疏矩陣,只要把每個元素的行下標(biāo)和列下標(biāo)互換,就完成了對
該矩陣的轉(zhuǎn)置運(yùn)算,這種觀點(diǎn)()。
(A)正確(B)錯誤
8.設(shè)矩陣A是一個對稱矩陣,為了節(jié)省存儲,將其下三角部分按行序存放在一維數(shù)組
B[l,n(n-l)/2]中,對下三角部分中任一元素ai,j(i<=j),在一組數(shù)組B的下標(biāo)位置k的值是
()。
(A)i(i-l)/2+j-l(B)i(i-l)/2+j(C)i(i+l)/2+j-l(D)i(i+l)/2+j
二、填空題
1.己知二維數(shù)組采用行序為主方式存儲,每個元素占k個存儲單元,并且第一個元素
的存儲地址是LOC(A[O][0]),則A[0][0]的地址是_________________________o
2.二維數(shù)組A[10][20]采用列序為主方式存儲,每個元素占一個存儲單元,并且A[0][0]的存
儲地址是200,則A[6][12]的地址是___________________。
3.有一個10階對稱矩陣A,采用壓縮存儲方式(以行序為主,且A[0][0]=1),則A[8][5]的地址
是_____________________。
4.設(shè)n行n列的下三角矩陣A已壓縮到??維數(shù)組S[1..n*(n+1)/2]中,若按行序為主存儲,則
對應(yīng)的S中的存儲位置是__________。
5.若A是按列序為主序進(jìn)行存儲的4X6的二維數(shù)組,其每個元素占用3個存儲單元,并且
A[0][0]的存儲地址為1000,元素的存儲地址為____________,該數(shù)組共占用
_________________個存儲單元。
三、算法設(shè)計
1.如果矩陣A中存在這樣的一個元素人[門[只滿足條件:人口][只是第i行中值最小的元素,且
又是第j列中值最大的元素,則稱之為該矩陣的一個馬鞍點(diǎn)。編寫?個函數(shù)計算出IXn的矩
陣A的所有馬鞍點(diǎn)。
2.n只猴子要選大王,選舉辦法如下:所有猴子按1,2,...,n編號圍坐一圈,從1號開始按1、
2...........m報數(shù),凡報m號的退出到圈外,如此循環(huán)報數(shù),直到圈內(nèi)剩下只猴子時,這只猴子就
是大王。n和m由鍵盤輸入,打印出最后剩下的猴子號。編寫-程序?qū)崿F(xiàn)上述函數(shù)。
3.數(shù)組和廣義表的算法驗證程序
編寫下列程序:
(1)求廣義表表頭和表尾的函數(shù)head。和tail0。
(2)計算廣義表原子結(jié)點(diǎn)個數(shù)的函數(shù)count_GL()。
(3)計算廣義表所有原子結(jié)點(diǎn)數(shù)據(jù)域(設(shè)數(shù)據(jù)域為整型〉之和的函數(shù)sumGL()?
參考答案:
一、選擇題
1.C2.B3.C4.C5.B6.C7、B8、B
二、填空題
1、loc(A[0][O])+(n*i+j)*k2、3323、424、i*(i+1)/2+j+15、1039;72
三、算法設(shè)計題
1.
算法思想:依題意,先求出每行的最小值元素,放入之中,再求出每列的最大值元素,放
入max[n]之中,若某元素既在min[i]中,又在max[j]中,則該元素A[i][j]便是馬鞍點(diǎn),找出所
有這樣的元素,即找到了所有馬鞍點(diǎn)。因此,實現(xiàn)本題功能的程序如下:
#include<stdio.h>
#definem3
#definen4
voidminmax(inta[m][n])
(
inti1,j,have=0;
intmin[m],max[n];
for(il=0;il<m;il++)/*計算出每行的最小值元素,放入min[m]之中*/
(
min[il]=a[il][0];
for(j=l;j<n;j++)
if(a[il][j]<min[il])min[il]=a[il][j];
}
for(j=0;j〈n;j++)/*計算出每列的最大值元素,放入max[n]之中*/
(
max[j]=a[0][j];
for(i1=1;il<m;i1++)
if(a[il][j]>max[j])max[j]=a[il][j];
for(i1=0;il<m;i1++)
for(j=0;j<n;j++)
if(min[i1]==max[j])
(
printf(〃(%d,%d):%d\n”,il,j,a[il][j]);
have=l;
}
if(!have)printf(〃沒有鞍點(diǎn)\n〃);
)
2.
算法思想:本題用一個含有n個元素的數(shù)組a,初始時a[i]中存放猴子的編號i,計數(shù)器似的值
為0。從a[i]開始循環(huán)報數(shù),每報一次,計數(shù)器的值加1,凡報到m時便打印出a[i]值(退出圈
外的猴子的編號),同時將a[i]的值改為0(以后它不再參加報數(shù)),計數(shù)器值重新置為0o該函
數(shù)一直進(jìn)行到n只猴子全部退出圈外為止,最后退出的猴子就是大王。因此,現(xiàn)本題功能的程
序如下:
ttinclude〃stdio.h〃
main()
(
inta[100];
intcount,d,j,m,n;
scanf(,z%d%d”,&m,&n);/*n>=m*/
for(j=0;j<n;j++)
a[j]=j+l;
count=0;d=0;
while(d<n)
for(j=0;j<n;j++)
if(a[j]!=O)
(
count++;
if(count二二m)
printf(〃%d〃,a[j]);
a[j]=O;
count=O;
d++;
3.
ttinclude〃stdio.h〃
ttinclude"malloc.h〃
typedefstructnode
{inttag;
union
{structnode*sublist;
chardata;
}dd;
structnode*1ink;
}NODE;
NODE*creat_GL(char**s)
(
NODE*h;
charch;
ch=*(*s);
(*s)++;
if<ch!=,\0,)
(
h=(NODE*)malloc(sizeof(NODE));
if(ch=='(')
(
h->tag=l;
h->dd.sublist=creatGL(s);
Else
h->tag=O;
h->dd.data=ch;
)
}
else
h=NULL;
ch=*(*s);
(*s)++;
if(h!=NULL)
if(ch==',’)
h->link=creat_GL(s);
else
h->link=NULL;
return(h);
)
voidprn_GL(NODE*p)
(
if(p!=NULL)
(
if(p->tag==l)
(
printf(〃(〃);
if(p->dd.sublist二二NULL)
printf(z,〃);
else
prnGL(p->dd.sublist);
}
else
printf(〃%c〃,p->dd.data);
if(p->tag==l)
printf(")");
if(p->link!=NULL)
(
printf;
prn_GL(p->link);
}
}
}
NODE*copy_GL(NODE*p)
(
NODE*q;
if(p==NULL)return(NULL);
q=(NODE*)malloc(sizeof(NODE));
q->tag=p->tag;
if(p->tag)
q->dd.sublist=copy_GL(p->dd.sublist);
else
q->dd.data=p->dd.data;
q->1ink=copyGL(p->link);
return(q);
}
NODE*head(N0DE*p)/*求表頭函數(shù)*/
(
return(p->dd.sublist);
}
NODE*tail(NODE*p)/*求表尾函數(shù)*/
(
return(p->link);
)
intsum(NODE*p)/*求原子結(jié)點(diǎn)的數(shù)據(jù)域之和函數(shù)*/
{intm,n;
if(p==NULL)return(0);
else
{if(p->tag==0)n=p->dd.data;
else
n=sum(p->dd.sublist);
if(p->link!=NULL)
m=sum(p->link);
elsem=0;
return(n+m);
)
)
intdepth(NODE*p)/*求表的深度函數(shù)*/
{
inth,maxdh;
NODE*q;
if(p->tag==0)return(0);
else
if(p->tag==l&&p->dd.sublist==NULL)return1;
else
(
maxdh=O;
while(p!=NULL)
(
if(p->tag==0)h=0;
else
{q=p->dd.sublist;
h=depth(q);
}
if(h>maxdh)maxdh=h;
p=p->link;
return(maxdh+1);
)
main()
(
NODE*hd,*hc;
chars[100],*p;
P=gets(s);
hd=creat_GL(&p);
prn_GL(head(hd));
prn_GL(tai1(hd));
hc=copy_GL(hd);
printf(/zcopyafter:z");
prn_GL(he);
printf("sum:%d\n”,sum(hd));
printf("depth:%d\n”,depth(hd));
}
第六章樹和二叉樹
一、選擇題
L在線索化二叉樹中,t所指結(jié)點(diǎn)沒有左子樹的充要條件是()
(A)t->left==NULL(B)t-)ltag==l
(C)t->ltag=l且t-〉left=NULL(D)以上都不對
2.二叉樹按某種順序線索化后,任?結(jié)點(diǎn)均有指向其前趨和后繼的線索,這種說法
(A)正確(B)錯誤(C)不同情況下答案不確定
3.二叉樹的前序遍歷序列中,任意一個結(jié)點(diǎn)均處在其子女結(jié)點(diǎn)的前面,這種說法()
(A)正確(B)錯誤(C)不同情況下答案不確定
4.由于二叉樹中每個結(jié)點(diǎn)的度最大為2,所以二叉樹是一種特殊的樹,這種說法()
(A)正確(B)錯誤(C)不同情況下答案不確定
5.設(shè)高度為h的二叉樹上只有度為0和度為2的結(jié)點(diǎn),則此類二叉樹中所包含的結(jié)點(diǎn)數(shù)至少為
()o
(A)2h(B)2h-l(C)2h+l(D)h+1
6.已知某二叉樹的后序遍歷序列是dabec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 5風(fēng)兒輕輕吹 第1課時(教學(xué)設(shè)計)-部編版道德與法治一年級下冊
- 4《四季》教學(xué)設(shè)計(教學(xué)設(shè)計)2024-2025學(xué)年統(tǒng)編版語文一年級上冊
- 2024年春八年級地理下冊 第八章 第二節(jié) 干旱的寶地 塔里木盆地教學(xué)實錄 (新版)新人教版
- 雨水管網(wǎng)改造項目可行性研究與評估
- 2016年秋九年級化學(xué)上冊 7 燃料及其利用教學(xué)實錄 (新版)新人教版
- 12為人民服務(wù)(教學(xué)設(shè)計)-2023-2024學(xué)年統(tǒng)編版語文六年級下冊
- 10清新空氣是個寶(教學(xué)設(shè)計)-部編版(五四制)道德與法治二年級下冊
- 《鏟雪歌》教學(xué)設(shè)計審閱后
- 3《荷花》教學(xué)設(shè)計-2024-2025學(xué)年語文三年級下冊統(tǒng)編版
- 絲綢之路教學(xué)設(shè)計
- 2025年南京城市職業(yè)學(xué)院單招職業(yè)技能測試題庫完整版
- (統(tǒng)編版)2025年小升初語文模擬考試卷(附帶答案)
- 2024年廣東省中考數(shù)學(xué)試卷(附答案)
- 2025年高考時政考題及參考答案(100題)
- DeepSeek人工智能語言模型探索AI世界科普課件
- 《青春期心理健康指導(dǎo)》課件
- 第18講 等腰三角形 課件中考數(shù)學(xué)復(fù)習(xí)
- 全過程工程咨詢文件管理標(biāo)準(zhǔn)
- DB65T 8024-2024 建筑用室外氣象參數(shù)標(biāo)準(zhǔn)
- 《預(yù)制高強(qiáng)混凝土風(fēng)電塔筒生產(chǎn)技術(shù)規(guī)程》文本附編制說明
- ICD-11(國際疾病分類第十一修訂)重點(diǎn)基礎(chǔ)知識總結(jié)-
評論
0/150
提交評論