當前位置:首頁 » 編程語言 » 數據結構c語言描述課後習題答案

數據結構c語言描述課後習題答案

發布時間: 2024-03-16 09:45:33

❶ 數據結構 (c語言版)胡學綱 課後習題 答案謝謝了,大神幫忙啊

數據結構課程第一章部分習題解答 第一章 緒論 1-4.什麼是抽象數據類型?試用C++的類聲明定義「復數」的抽象數據類型。要求 (1) 在復數內部用浮點數定義它的實部和虛部。 (2) 實現3個構造函數:預設的構造函數沒有參數;第二個構造函數將雙精度浮點數賦給復數的實部,虛部置為0;第三個構造函數將兩個雙精度浮點數分別賦給復數的實部和虛部。 (3) 定義獲取和修改復數的實部和虛部,以及+、-、*、/等運算的成員函數。 (4) 定義重載的流函數來輸出一個復數。 【解答】 抽象數據類型通常是指由用戶定義,用以表示應用問題的數據模型。抽象數據類型由基本的數據類型構成,並包括一組相關的服務。 //在頭文件complex.h中定義的復數類 #ifndef _complex_h_ #define _complex_h_ #include class comlex { public: complex ( ){ Re = Im = 0; } //不帶參數的構造函數 complex ( double r ) { Re = r; Im = 0; } //只置實部的構造函數 complex ( double r, double i ) { Re = r; Im = i; } //分別置實部、虛部的構造函數 double getReal ( ) { return Re; } //取復數實部 double getImag ( ) { return Im; } //取復數虛部 void setReal ( double r ) { Re = r; } //修改復數實部 void setImag ( double i ) { Im = i; } //修改復數虛部 complex & operator = ( complex & ob) { Re = ob.Re; Im = ob.Im; } //復數賦值 complex & operator + ( complex & ob ); //重載函數:復數四則運算 complex & operator – ( complex & ob ); complex & operator * ( complex & ob ); complex & operator / ( complex & ob ); friend ostream & operator << ( ostream & os, complex & c ); //友元函數:重載<< private: double Re, Im; //復數的實部與虛部 }; #endif //復數類complex的相關服務的實現放在C++源文件complex.cpp中 #include #include #include 「complex.h」 complex & complex :: operator + ( complex & ob ) { //重載函數:復數加法運算。 complex * result = new complex ( Re + ob.Re, Im + ob.Im ); return *result; } complex & complex :: operator – ( complex & ob ) { //重載函數:復數減法運算 complex *result = new complex ( Re – ob.Re, Im – ob.Im ); return * result; } complex & complex :: operator * ( complex & ob ) { //重載函數:復數乘法運算 complex *result = new complex ( Re * ob.Re – Im * ob.Im, Im * ob.Re + Re * ob.Im ); return *result; } complex & complex :: operator / ( complex & ) { //重載函數:復數除法 查看更多答案>>

❷ 嚴蔚敏數據結構題集(C語言版)實習題答案

/* 用鄰接矩陣表示的圖的prim演算法的源程序*/

#include<stdio.h>
#define MAXVEX 6

typedef char VexType;

typedef float AdjType;

typedef struct {
int n; /* 圖的頂點個數 */
/*VexType vexs[MAXVEX]; 頂點信息 */
AdjType arcs[MAXVEX][MAXVEX]; /* 邊信息 */
} GraphMatrix;

typedef struct{
int start_vex, stop_vex; /* 邊的起點和終點 */
AdjType weight; /* 邊的權 */
} Edge;

Edge mst[5];

#define MAX 1e+8

void prim(GraphMatrix * pgraph, Edge mst[]) {
int i, j, min, vx, vy;
float weight, minweight; Edge edge;

for (i = 0; i < pgraph->n-1; i++) {
mst[i].start_vex = 0;
mst[i].stop_vex = i+1;
mst[i].weight = pgraph->arcs[0][i+1];
}

for (i = 0; i < pgraph->n-1; i++) { /* 共n-1條邊 */
minweight = MAX; min = i;
for (j = i; j < pgraph->n-1; j++)/* 從所有邊(vx,vy)(vx∈U,vy∈V-U)中選出最短的邊 */
if(mst[j].weight < minweight) {
minweight = mst[j].weight;
min = j;
}

/* mst[min]是最短的邊(vx,vy)(vx∈U, vy∈V-U),將mst[min]加入最小生成樹 */
edge = mst[min];
mst[min] = mst[i];
mst[i] = edge;
vx = mst[i].stop_vex; /* vx為剛加入最小生成樹的頂點的下標 */

for(j = i+1; j < pgraph->n-1; j++) { /* 調整mst[i+1]到mst[n-1] */
vy=mst[j].stop_vex; weight = pgraph->arcs[vx][vy];
if (weight < mst[j].weight) {
mst[j].weight = weight;
mst[j].start_vex = vx;
}
}
}
}

GraphMatrix graph = {
6,
{{0,10,MAX,MAX,19,21},
{10,0,5,6,MAX,11},
{MAX,5,0,6,MAX,MAX},
{MAX,6,6,0,18,14},
{19,MAX,MAX,18,0,33},
{21,11,MAX,14,33,0}
}
};

int main(){
int i;
prim(&graph,mst);
for (i = 0; i < graph.n-1; i++)
printf("(%d %d %.0f)\n", mst[i].start_vex,
mst[i].stop_vex, mst[i].weight);
return 0;
}

❸ 求數據結構(用面向對象方法與C++語言描述)第二版 殷人昆主編 課後答案

第一章 習題答案
2、××√
3、(1)包含改變數定義的最小范圍
(2)數據抽象、信息隱蔽
(3)數據對象、對象間的關系、一組處理數據的操作
(4)指針類型
(5)集合結構、線性結構、樹形結構、圖狀結構
(6)順序存儲、非順序存儲
(7)一對一、一對多、多對多
(8)一系列的操作
(9)有限性、輸入、可行性
4、(1)A(2)C(3)C
5、語句頻度為1+(1+2)+(1+2+3)+…+(1+2+3+…+n)
第二章 習題答案
1、(1)一半,插入、刪除的位置
(2)順序和鏈式,顯示,隱式
(3)一定,不一定
(4)頭指針,頭結點的指針域,其前驅的指針域
2、(1)A(2)A:E、A
B:H、L、I、E、A
C:F、M
D:L、J、A、G或J、A、G
(3)D(4)D(5)C(6)A、C
3、頭指針:指向整個鏈表首地址的指針,標示著整個單鏈表的開始。
頭結點:為了操作方便,可以在單鏈表的第一個結點之前附設一個結點,
該結點的數據域可以存儲一些關於線性表長度的附加信息,也可以什麼都不存。
首元素結點:線性表中的第一個結點成為首元素結點。
4、演算法如下:
int Linser(SeqList *L,int X)
{ int i=0,k;
if(L->last>=MAXSIZE-1)
{ printf(「表已滿無法插入」);
return(0);
}
while(i<=L->last&&L->elem[i]<X)
i++;
for(k=L->last;k>=I;k--)
L->elem[k+1]=L->elem[k];
L->elem[i]=X;
L->last++;
return(1);
}
5、演算法如下:
#define OK 1
#define ERROR 0
Int LDel(Seqlist *L,int i,int k)
{ int j;
if(i<1||(i+k)>(L->last+2))
{ printf(「輸入的i,k值不合法」);
return ERROR;
}
if((i+k)==(L->last+2))
{ L->last=i-2;
ruturn OK;
}
else
{for(j=i+k-1;j<=L->last;j++)
elem[j-k]=elem[j];
L->last=L->last-k;
return OK;
}
}
6、演算法如下:
#define OK 1
#define ERROR 0
Int Delet(LInkList L,int mink,int maxk)
{ Node *p,*q;
p=L;
while(p->next!=NULL)
p=p->next;
if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk))
{ printf(「參數不合法」);
return ERROR;
}
else
{ p=L;
while(p->next-data<=mink)
p=p->next;
while(q->data<maxk)
{ p->next=q->next;
free(q);
q=p->next;
}
return OK;
}
}
9、演算法如下:
int Dele(Node *S)
{ Node *p;
P=s->next;
If(p= =s)
{printf(「只有一個結點,不刪除」);
return 0;
}
else
{if((p->next= =s)
{s->next=s;
free(p);
return 1;
}
Else
{ while(p->next->next!=s)
P=p->next;
P->next=s;
Free(p);
return 1;
}
}
}
第三章 習題答案
2、(1)
3、棧有順序棧和鏈棧兩種存儲結構。
在順序棧中,棧頂指針top=-1時,棧為空;棧頂指針top=Stacksize-1時,棧為滿。
在帶頭結點鏈棧中,棧頂指針top-〉next=NULL,則代表棧空;只要系統有可用空間,鏈棧就不會出現溢出,既沒有棧滿。
5、
#include<seqstack1.h>
#include "stdio.h"
void main( )
{
char ch,temp;
SeqStack s;
InitStack(&s);
scanf("%c",&ch);
while(ch!='@'&&ch!='&')
{
Push(&s,ch);
scanf("%c",&ch);
}
while(ch!='@'&&!IsEmpty(&s))
{
Pop(&s,&temp);
scanf("%c",&ch);
if(ch!=temp)
break;
}
if(!IsEmpty(&s))
printf("no!\n");
else
{
scanf("%c",&ch);
if(ch=='@') printf("yes!\n");
else printf("no!\n");
}
}
12、(1)功能:將棧中元素倒置。
(2)功能:刪除棧中的e元素。
(3)功能:將隊列中的元素倒置。
第四章習題答案
1、StrLength(s)操作結果為14;SubString(sub1,s,1,7)操作結果為sub1=』I AM A 』;
SubString(sub2,s,7,1)操作結果為sub2=』 』;StrIndex(s,』A』,4) 操作結果為5;
StrReplace(s,』STUDENT』,q) 操作結果為』I AM A WORKER』;
StrCat(StrCat(sub1,t), StrCat(sub2,q)) 操作結果為』I AM A GOOD WORKER』;
2、
int StrReplace(SString S,Sstring T,SString V)
{
int i=1; //從串S的第一個字元起查找串T
if(StrEmpty(T)) //T是空串
return ERROR;
do
{
i=Index(S,T,i); //結果i為從上一個i之後找到的子串T的位置
if(i) //串S中存在串T
{
StrDelete(S,i,StrLength(T)); //刪除該串T
StrInsert(S,i,V); //在原串T的位置插入串V
i+=StrLength(V); //在插入的串V後面繼續查找串T
}
}while(i);
return OK;
}

第五章習題答案
1、(1)數組A共佔用48*6=288個位元組;
(2)數組A的最後一個元素的地址為1282;
(3)按行存儲時loc(A36)=1000+[(3-1)*8+6-1]*6=1126
(4)按列存儲時loc(A36)=1000+[(6-1)*6+3-1]*6=1192
9、(1)(a,b)(2)((c,d))(3)(b)(4)b(5)(d)
10、D

第六章 習題答案
1、三個結點的樹的形態有兩個;三個結點的二叉樹的不同形態有5個。
2、略
3、證明:分支數=n1+2n2+…+knk (1)
n= n0+n1+…+nk (2)
∵n=分支數+1 (3)
將(1)(2)代入(3)得
n0= n2+2n3+3n4+…+(k-1)nk+1
4、

註:C結點作為D的右孩子(畫圖的時候忘記了,不好意思)
5、n0=50,n2=n0-1=49,所以至少有99個結點。
6、(1)前序和後序相同:只有一個結點的二叉樹
(2)中序和後序相同:只有左子樹的二叉樹
(3)前序和中序相同:只有右子樹的二叉樹
7、證明:∵n個結點的K叉樹共有nk個鏈域,分支數為n-1(即非空域)。
∴空域=nk-(n-1)=nk-n+1
8、對應的樹如下:

9、(答案不唯一)
哈夫曼樹如下圖所示:

哈夫曼編碼如下:
頻率 編碼
0.07 0010
0.19 10
0.02 00000
0.06 0001
0.32 01
0.03 00001
0.21 11
0.10 0011

11、對應的二叉樹如下:

12、求下標分別為i和j的兩個桔點的最近公共祖先結點的值。
typedef int ElemType;
void Ancestor(ElemType A[],int n,int i,int j)
{while(i!=j)
if(i>j) i=i/2;
else j=j/2;
printf("所查結點的最近公共祖先的下標是%d,值是%d",i,A[i]);
}
15、編寫遞歸演算法,對於二叉樹中每一個元素值為X的結點,刪去以它為根的子樹,並釋放相應的空間。
void Del_Sub(BiTree T)
{ if(T->lchild) Del_Sub(T->lchild);
if(T->rchild) Del_Sub(T->rchild);
free(T);
}
void Del_Sub_x(BiTree T,int x)
{ if(T->data==x) Del_Sub(T);
else
{if(T->lchild) Del_Sub_x(T->lchild,x);
if(T->rchild) Del_Sub_x(T->rchild,x);
}
}
22、
int Width(BiTree bt)
{if (bt==NULL) return (0);
else
{BiTree p,Q[50];
int front=1,rear=1,last=1;
int temp=0, maxw=0;
Q[rear]=bt;
while(front<=last)
{p=Q[front++]; temp++;
if (p->lchild!=NULL) Q[++rear]=p->lchild;
if (p->rchild!=NULL) Q[++rear]=p->rchild;
{last=rear;
if(temp>maxw) maxw=temp;
temp=0;}
}
return (maxw);
}
}
第七章 習題答案
1、(1)頂點1的入度為3,出度為0;
頂點2的入度為2,出度為2;
頂點3的入度為1,出度為2;
頂點4的入度為1,出度為3;
頂點5的入度為2,出度為1;
頂點6的入度為2,出度為3;
(2)鄰接矩陣如下:
0 0 0 0 0 0
1 0 0 1 0 0
0 1 0 0 0 1
0 0 1 0 1 1
1 0 0 0 0 0
1 1 0 0 1 0
(3)鄰接表

(4)逆鄰接表

2、答案不唯一
(2)深度優先遍歷該圖所得頂點序列為:1,2,3,4,5,6
邊的序列為:(1,2)(2,3)(3,4)(4,5)(5,6)
(3)廣度優先遍歷該圖所得頂點序列為:1,5,6,3,2,4
邊的序列為:(1,5)(1,6)(1,3)(1,2)(5,4)
3、
(1)每個事件的最早發生時間:
ve(0)=0,ve(1)=5,ve(2)=6, ve(3)=12, ve(4)=15, ve(5)=16,
ve(6)=16, ve(7)=19, ve(8)=21, ve(9)=23
每個事件的最晚發生時間::
vl(9)=23, vl(8)=21, vl(7)=19, vl(6)=19, vl(5)=16, vl(4)=15,
vl(3)=12, vl(2)=6, vl(1)=9, vl(0)=0
(2)每個活動的最早開始時間:
e(0,1)=0, e(0,2)=0, e(1,3)=5, e(2,3)=6, e(2,4)=6, e(3,4)=12, e(3,5)=12,
e(4,5)=15, e(3,6)=12, e(5,8)=16, e(4,7)=15, e(7,8)=19, e(6,9)=16, e(8,9)=21
每個活動的最遲開始時間:
l(0,1)=4, l(0,2)=0, l(1,3)=9, l(2,3)=6, l(2,4)=12, l(3,4)=12, l(3,5)=12, l(4,5)=15, l(3,6)=15, l(5,8)=16, l(4,7)=15, l(7,8)=19, l(6,9)=19, l(8,9)=21
(3)關鍵路徑如下圖所示:

4、頂點1到其餘頂點的最短路經為:
1-〉3最短路經為1,3;長度為15
1-〉2最短路經為1,3,2;長度為19
1-〉5最短路經為1,3,5;長度為25
1-〉4最短路經為1,3,2,4;長度為29
1-〉6最短路經為1,3,2,4,6;長度為44
13、A(7)B(3)C(2)D(11)E(8)
14、略
15、略
第八章 查找
1、畫出對長度為10的有序表進行折半查找的判定樹,並求其等概率時查找成功的平均查找長度。
解:
ASL=(1+2*2+4*3+3*4)/10=2.9
5、
解:(1)插入完成後的二叉排序樹如下:

ASL=(1+2*2+3*3+3*4+2*5+1*6)/12=3.5 ????
(2)ASL=(1+2*2+3*4+4*5)=37/12
(3)
12、
解:哈希表構造如下:
0 1 2 3 4 5 6 7 8 9 10
22 41 30 01 53 46 13 67
H(22)=(22*3)%11=0
H(41)=(41*3)%11=2
H(53)=(53*3)%11=5
H(46)=(46*3)%11=6
H(30)=(30*3)%11=2 與(41)沖突
H1(30)=(2+1)%11=3
H(13)=(13*3)%11=6 與46沖突
H1(13)=(6+1)%11=7
H(01)=(01*3)%11=3 與30沖突
H1(01)=(3+1)%11=4
H(67)=(67*3)%11=3 與30沖突
H1(67)=(3+1)%11=4 與01沖突
H2(67)=(3+2)%11=5 與53沖突
H3(67)=(3+3)%11=6 與46沖突
H4(67)=(3+4)%11=7 與13沖突
H5(67)=(3+5)%11=8
ASLsucc=(1*4+2*3+6)/8=2
ASLunsucc=(2+8+7+6+5+4+3+2)/8=37/8
第九章 排序
1、以關鍵字序列(503,087,512,061,908,170,897,275,653,426)為例,手工執行以下排序演算法,寫出每一趟派結束時的關鍵字狀態。
(1)直接插入排序(2)希爾排序(增量序列為5,3,1)(3)快速排序(4)堆排序(5)歸並排序
解:(1)略
(2)增量為5的排序結果:170,087,275,061,426,503,897,512,653,908
增量為3的排序結果:061,087,275,170,426,503,897,512,653,908
增量為1的排序結果:061,087,170,275,426,503,512,653,897,908
(3)一次劃分後:{426 087 275 061 170}503{897 908 653 512}
分別進行:{170 087 275 061}426 503 {512 653} 897 {908}
{061 087}170{275}426 503 512 {653} 897 908
061 087 170 275 426 503 512 653 897 908
(4)略
7、已知一組關鍵字:(40,27,28,12,15,50,7),要求採用快速排序法從小到大排序。請寫出每趟排序後的劃分結果。
解:初始狀態:40 27 28 12 15 50 7
一次劃分:{7 27 28 12 15} 40 {50}
依次劃分:7 {27 28 12 15} 40 50
7 {15 12} 27 {28} 40 50
7 12 15 27 28 40 50
16、(1)A3 B1 C4 D2 E7
(2)C
(3)C
17、對,錯,對

數據結構課程設計指導書
一、設計內容
1.飛機訂票系統(限1 人完成)
【問題描述】
設計一個飛機訂票系統,可以模擬處理飛機訂票過程中的各種操作。
【基本要求】
通過此系統可以實現如下功能:
1)錄入
可以錄入航班情況(數據可以存儲在一個數據文件中,數據結構、具體數據自定)。
2)查詢
可以查詢某個航線的情況(如,輸入航班號,查詢起降時間,起飛抵達城市,航班票價,票價折扣,確定航班是否滿倉);
可以輸入起飛抵達城市,查詢飛機航班情況。
3)訂票(訂票情況可以存在一個數據文件中,結構自己設定)
可以訂票,如果該航班已經無票,可以提供相關可選擇航班。
4)退票
可退票,退票後修改相關數據文件。
客戶資料有姓名,證件號,訂票數量及航班情況,訂單要有編號。
5)修改航班信息
當航班信息改變可以修改航班數據文件
根據以上功能說明,設計航班信息,訂票信息的存儲結構,設計程序完成功能。
2.文章編輯(限1 人完成)
【問題描述】
輸入一頁文字,程序可以統計出文字、數字、空格的個數。
【基本要求】
靜態存儲一頁文章,每行最多不超過80個字元,共N行;
1)分別統計出其中英文字母數和空格數及整篇文章總字數;
2)統計某一字元串在文章中出現的次數,並輸出該次數;
3)刪除某一子串,並將後面的字元前移;
4)用指定的字元串替換某一子串;
5)存儲結構使用線性表,分別用幾個子函數實現相應的功能;
6)輸入數據的形式和范圍:可以輸入大寫、小寫的英文字母、任何數字及標點符號。
7)輸出形式:①分行輸出用戶輸入的各行字元;②分4行輸出"全部字母數"、"數字個數"、"空格個數"、"文章總字數";③輸出刪除某一字元串後的文章;④輸出替換某一字元串後的文章。
3.宿舍管理查詢軟體(限1 人完成)
【問題描述】
為宿舍管理人員編寫一個宿舍管理查詢軟體。
【基本要求】
1) 程序設計要求:
①採用交互工作方式
②建立數據文件,數據文件按關鍵字(姓名、學號、房號)進行排序(冒泡、選擇、插入排序等任選一種)
2) 查詢菜單: (用二分查找實現以下操作)
①按姓名查詢
②按學號查詢
③按房號查詢
3) 輸出任一查詢結果(可以連續操作)
4.全國交通咨詢模擬
【問題描述】
處於不同目的的旅客對交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的時間盡可能的短,出門旅遊的遊客則期望旅費盡可能省,而老年旅客則要求中轉次數最少。編制一個全國城市間的交通咨詢程序,為旅客提供兩種或三種最優決策的交通咨詢。
【設計要求】
1)提供對城市信息進行編輯(如:添加或刪除)的功能。
2)提供對列車時刻表進行編輯(增設或刪除)的功能。
3) 提供兩種最優決策:最快到達和最省錢到達。
4)旅途中耗費的總時間應該包括中轉站的等候時間。
5)咨詢以用戶和計算機的對話方式進行。由用戶輸入起始站、終點站、最優決策原則,輸出信息:最快需要多長時間才能到達或者最少需要多少旅費才能到達,並詳細說明於何時乘坐哪一趟列車到何地。
測試數據:參考教科書7.6節圖7.33的全國交通圖,自行設計列車時刻表。
【實現提示】
1) 對全國城市交通圖和列車時刻表進行編輯,應該提供文件形式輸入和鍵盤輸入兩種方式。列車時刻表則需根據交通圖給出各個路段的詳細信息,例如:基於教科書7.6節圖7.33的交通圖,對從北京到上海的火車,需給出北京至天津、天津至徐州及徐州至上海各段的出發時間、到達時間及票價等信息。
2) 以鄰接表作交通圖的存儲結構,表示邊的結構內除含有鄰接點的信息外,還應包括交通工具、路程中耗費的時間和花費以及出發和到達的時間等多種屬性。
5.哈夫曼編碼/解碼器(限1 人完成)
【問題描述】
設計一個利用哈夫曼演算法的編碼和解碼系統,重復地顯示並處理以下項目,直到選擇退出為止。
【基本要求】
1) 將權值數據存放在數據文件(文件名為data.txt,位於執行程序的當前目錄中)
2) 分別採用動態和靜態存儲結構
3) 初始化:鍵盤輸入字元集大小n、n個字元和n個權值,建立哈夫曼樹;
4) 編碼:利用建好的哈夫曼樹生成哈夫曼編碼;
5) 輸出編碼;
6) 設字元集及頻度如下表:
字元 空格 A B C D E F G H I J K L M
頻度 186 64 13 22 32 103 21 15 47 57 1 5 32 20
字元 N O P Q R S T U V W X Y Z
頻度 57 63 15 1 48 51 80 23 8 18 1 16 1
【進一步完成內容】
1) 解碼功能;
2) 顯示哈夫曼樹;
3) 界面設計的優化。
6.走迷宮游戲
【問題描述】
以一個m×n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計一個程序,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。
【基本要求】
1.首先用二維數組存儲迷宮數據,迷宮數據由用戶輸入。
2.一個以鏈表作存儲結構的棧類型,然後編寫一個求解迷宮的遞歸或非遞歸程序。求得的通路以三元組(i,j,d)形式輸出,其中:(i,j)指示迷宮中的一個坐標,d表示走到下一坐標的方向(東、南、西、北四個方向所用代表數字,自行定義)。
3.可以用多種方法實現,但至少用兩種方法,用三種以上可加分。
【實現提示】
1.計算機解迷宮問題通常用的是「窮舉求解」方法,即從入口出發,順著某一個方向進行探索,若能走通,則繼續往前進;否則沿著原路退回,換一個方向繼續探索,直至出口位置,求得一條通路。假如所有可能的通路都探索到而未能到達出口,則所設定的迷宮沒有通路。
迷宮的入口點的下標為(1,1),出口點的下標為(m,n)。為處理方便起見,可在迷宮的四周加一圈障礙。對於迷宮的任一位置,均可約定有東、南、西、北四個方向可通。
2.有一種簡單走出迷宮的方法,把手放在右邊的牆上開始前進,始終不要把手從牆上移開。如果迷宮向右拐,你也順著牆向右拐。只要不把手從牆上移開,最終就會到達迷宮的出口。當然這樣得到的路徑可能不是一個最短的路徑,但它可以最終得到結果,換句話說,這種方法走不出迷宮的風險是最小的。
7.作業評分系統
【問題描述】
設計一個可以給小學生出題並且可以給出分數的系統軟體。
【基本要求】
利用棧求表達式的值,可供小學生作業,並能給出分數。
1) 建立試題庫文件,隨機產生n個題目;
2) 題目涉及加減乘除,帶括弧的混合運算;
3) 隨時可以退出;
4) 給出作業分數。
【進一步完成內容】
1)保留歷史分數,能回顧歷史,給出與歷史分數比較後的評價。
2)界面設計的優化。
8.散列表的設計與實現
【問題描述】
設計散列表實現電話號碼查找系統。
【基本要求】
1)設每個記錄有下列數據項:電話號碼、用戶名、地址;
2)從鍵盤輸入各記錄,分別以電話號碼和用戶名為關鍵字建立散列表;
3)採用一定的方法解決沖突;
4)查找並顯示給定電話號碼的記錄;
5)查找並顯示給定用戶名的記錄。
【進一步完成內容】
1) 系統功能的完善;
2) 設計不同的散列函數,比較沖突率;
3) 在散列函數確定的前提下,嘗試各種不同類型處理沖突的方法,考察平均查找長度的變化。
9.停車場管理
【問題描述】
設停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先後順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在車場的最北端),若車場內已停滿n輛汽車,則後來的汽車只能在門外的便道上等待,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內某輛車要離開時,在它之後進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。
【基本要求】
以棧模擬停車場,以隊列模擬車場外的便道,按照從終端讀入的輸入數據序列進行模擬管理。每一組輸入數據包括三個數據項:汽車「到達」或「離去」信息、汽車牌照號碼以及到達或離去的時刻。對每一組輸入數據進行操作後的輸出信息為:若是車輛到達,則輸出汽車在停車場內或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內停留的時間和應交納的費用(在便道上停留的時間不收費)。棧以順序結構實現,隊列以鏈表結構實現。
【測試數據】
設n=2,輸入數據為:(『A』,1,5),(『A』,2,10),(『D』,1,15),(『A』,3,20),(『A』,4,25),
(『A』,5,30),(『D』,2,35),(『D』,4,40),(『E』,0,0)。其中:『A』表示到達(Arrival);『D』表示(Departure);『E』表示輸入結束(End)。
【實現提示】
需另設一個棧,臨時停放為給要離去的汽車讓路而從停車場退出來的汽車,也用順序存儲結構實現。輸入數據按到達或離去的時刻有序。棧中每個元素表示一輛汽車,包含兩個數據項:汽車的牌照號碼和進入停車場的時刻。
10.八皇後問題
【問題描述】
求出在一個n×n的棋盤上,放置n個不能互相捕捉的國際象棋「皇後」的所有布局。
這是來源於國際象棋的一個問題。皇後可以沿著縱橫和兩條斜線8個方向相互捕捉。如圖所示,一個皇後放在棋盤的第4行第3列位置上,則棋盤上凡打「×」的位置上的皇後就能與這個皇後相互捕捉,也就是下一個皇後不能放的位置。

1 2 3 4 5 6 7 8
× ×
× × ×
× × ×
× × Q × × × × ×
× × ×
× × ×
× ×
× ×
從圖中可以得到以下啟示:一個合適的解應是在每列、每行上只有一個皇後,且一條斜線上也只有一個皇後。
【實現提示】
求解過程從空配置開始。在第1列至第m列為合理配置的基礎上,再配置第m+1列,直至第n列配置也是合理時,就找到了一個解。接著改變第n列配置,希望獲得下一個解。另外,在任一列上,可能有n種配置。開始時配置在第1行,以後改變時,順次選擇第2行、第3行、…、直到第n行。當第n行配置也找不到一個合理的配置時,就要回溯,去改變前一列的配置。
二、時間安排
2005~2006(一)第19周進行。
第一天: 分析題目,查閱資料;
第二天:演算法設計、編碼;
第三天:編碼、調試運行;
第四天:調試運行,撰寫設計報告;;
第五天:答辯。
三、設計工作要求
1.對學生的要求
(1) 要求學生認真閱讀設計任務書,了解所做的設計內容及要求,認真主動完成課設的要求。有問題及時主動通過各種方式與教師聯系溝通。
(2)學生要發揮自主學習的能力,充分利用時間,安排好課設的時間計劃,並在課設過程中不斷檢測自己的計劃完成情況,及時向教師匯報。
(3)查閱相關的參考文獻;獨立完成設計任務。
(4)認真撰寫課程設計說明書,要求文字通順、有邏輯性、真正反映設計的水平,設計要有創新。
(5)設計完成後上交相關內容要求:
①上交源程序:學生按照課程設計的具體要求所開發的所有源程序(應該放到一個文件夾中)。
②課程設計說明書:到教務處網站下載課程設計報告紙及封面。格式及要求見附錄。
2.對教師的要求
(1)做好設計題目的選題工作,使題目達到一定的綜合性要求,工作量合理;
(2)加強指導,嚴格考勤、考核;
(3)做好答辯、設計報告的評審以及成績評定工作。
附錄:
課程設計說明書,格式及要求如下:
一、封面;
二、目錄;
三、設計任務書;
四、說明書正文,主要內容包括:
1.設計題目;
2.設計目的;
3.演算法思想分析;
4.演算法描述與實現;
5.結論

❹ 關於數據結構的問題,用C語言描述

數據結構復習重點歸納筆記[清華嚴蔚敏版]

數據結構復習重點歸納[適於清華嚴版教材]
一、數據結構的章節結構及重點構成
數據結構學科的章節劃分基本上為:概論,線性表,棧和隊列,串,多維數組和廣義表,樹和二叉樹,圖,查找,內排,外排,文件,動態存儲分配。
對於絕大多數的學校而言,「外排,文件,動態存儲分配」三章基本上是不考的,在大多數高校的計算機本科教學過程中,這三章也是基本上不作講授的。所以,大家在這三章上可以不必花費過多的精力,只要知道基本的概念即可。但是,對於報考名校特別是該校又有在試卷中對這三章進行過考核的歷史,那麼這部分朋友就要留意這三章了。
按照以上我們給出的章節以及對後三章的介紹,數據結構的章節比重大致為:
概論:內容很少,概念簡單,分數大多隻有幾分,有的學校甚至不考。
線性表:基礎章節,必考內容之一。考題多數為基本概念題,名校考題中,鮮有大型演算法設計題。如果有,也是與其它章節內容相結合。
棧和隊列:基礎章節,容易出基本概念題,必考內容之一。而棧常與其它章節配合考查,也常與遞歸等概念相聯系進行考查。
串 :基礎章節,概念較為簡單。專門針對於此章的大型演算法設計題很少,較常見的是根據KMP進行演算法分析。
多維數組及廣義表
:基礎章節,基於數組的演算法題也是常見的,分數比例波動較大,是出題的「可選單元」或「侯補單元」。一般如果要出題,多數不會作為大題出。數組常與「查找,排序」等章節結合來作為大題考查。
樹和二叉樹
:重點難點章節,各校必考章節。各校在此章出題的不同之處在於,是否在本章中出一到兩道大的演算法設計題。通過對多所學校的試卷分析,絕大多數學校在本章都曾有過出大型演算法設計題的歷史。
圖 :重點難點章節,名校尤愛考。如果作為重點來考,則多出現於分析與設計題型當中,可與樹一章共同構成演算法設計大題的題型設計。
查找
:重點難點章節,概念較多,聯系較為緊密,容易混淆。出題時可以作為分析型題目給出,在基本概念型題目中也較為常見。演算法設計型題中可以數組結合來考查,也可以與樹一章結合來考查。
排序
:與查找一章類似,本章同屬於重點難點章節,且概念更多,聯系更為緊密,概念之間更容易混淆。在基本概念的考查中,尤愛考各種排序演算法的優劣比較此類的題。演算法設計大題中,如果作為出題,那麼常與數組結合來考查。
二、數據結構各章節重點勾劃:
第0章 概述
本章主要起到總領作用,為讀者進行數據結構的學習進行了一些先期鋪墊。大家主要注意以下幾點:數據結構的基本概念,時間和空間復雜度的概念及度量方法,演算法設計時的注意事項。本章考點不多,只要稍加註意理解即可。
第一章 線性表
作為線性結構的開篇章節,線性表一章在線性結構的學習乃至整個數據結構學科的學習中,其作用都是不可低估的。在這一章,第一次系統性地引入鏈式存儲的概念,鏈式存儲概念將是整個數據結構學科的重中之重,無論哪一章都涉及到了這個概念。
總體來說,線性表一章可供考查的重要考點有以下幾個方面:
1.線性表的相關基本概念,如:前驅、後繼、表長、空表、首元結點,頭結點,頭指針等概念。
2.線性表的結構特點,主要是指:除第一及最後一個元素外,每個結點都只有一個前趨和只有一個後繼。
3.線性表的順序存儲方式及其在具體語言環境下的兩種不同實現:表空間的靜態分配和動態分配。靜態鏈表與順序表的相似及不同之處。
4.線性表的鏈式存儲方式及以下幾種常用鏈表的特點和運算:單鏈表、循環鏈表,雙向鏈表,雙向循環鏈表。其中,單鏈表的歸並演算法、循環鏈表的歸並演算法、雙向鏈表及雙向循環鏈表的插入和刪除演算法等都是較為常見的考查方式。此外,近年來在不少學校中還多次出現要求用遞歸演算法實現單鏈表輸出(可能是順序也可能是倒序)的問題。
在鏈表的小題型中,經常考到一些諸如:判表空的題。在不同的鏈表中,其判表空的方式是不一樣的,請大家注意。
5.線性表的順序存儲及鏈式存儲情況下,其不同的優缺點比較,即其各自適用的場合。單鏈表中設置頭指針、循環鏈表中設置尾指針而不設置頭指針以及索引存儲結構的各自好處。
第二章 棧與隊列
棧與隊列,是很多學習DS的同學遇到第一隻攔路虎,很多人從這一章開始坐暈車,一直暈到現在。所以,理解棧與隊列,是走向DS高手的一條必由之路,。
學習此章前,你可以問一下自己是不是已經知道了以下幾點:
1.棧、隊列的定義及其相關數據結構的概念,包括:順序棧,鏈棧,共享棧,循環隊列,鏈隊等。棧與隊列存取數據(請注意包括:存和取兩部分)的特點。
2.遞歸演算法。棧與遞歸的關系,以及藉助棧將遞歸轉向於非遞歸的經典演算法:n!階乘問題,fib數列問題,hanoi問題,背包問題,二叉樹的遞歸和非遞歸遍歷問題,圖的深度遍歷與棧的關系等。其中,涉及到樹與圖的問題,多半會在樹與圖的相關章節中進行考查。
3.棧的應用:數值表達式的求解,括弧的配對等的原理,只作原理性了解,具體要求考查此為題目的演算法設計題不多。
4.循環隊列中判隊空、隊滿條件,循環隊列中入隊與出隊演算法。
如果你已經對上面的幾點了如指掌,棧與隊列一章可以不看書了。注意,我說的是可以不看書,並不是可以不作題哦。
第三章 串
經歷了棧一章的痛苦煎熬後,終於迎來了串一章的柳暗花明。
串,在概念上是比較少的一個章節,也是最容易自學的章節之一,但正如每個過來人所了解的,KMP演算法是這一章的重要關隘,突破此關隘後,走過去又是一馬平川的大好DS山河了,呵呵。
串一章需要攻破的主要堡壘有:
1.串的基本概念,串與線性表的關系(串是其元素均為字元型數據的特殊線性表),空串與空格串的區別,串相等的條件
2.串的基本操作,以及這些基本函數的使用,包括:取子串,串連接,串替換,求串長等等。運用串的基本操作去完成特定的演算法是很多學校在基本操作上的考查重點。
3.順序串與鏈串及塊鏈串的區別和聯系,實現方式。
4.KMP演算法思想。KMP中next數組以及nextval數組的求法。明確傳統模式匹配演算法的不足,明確next數組需要改進之外。其中,理解演算法是核心,會求數組是得分點。不用我多說,這一節內容是本章的重中之重。可能進行的考查方式是:求next和nextval數組值,根據求得的next或nextval數組值給出運用KMP演算法進行匹配的匹配過程。

第四章 數組與廣義表
學過程序語言的朋友,數組的概念我們已經不是第一次見到了,應該已經「一回生,二回熟」了,所以,在概念上,不會存在太大障礙。但作為考研課程來說,本章的考查重點可能與大學里的程序語言所關注的不太一樣,下面會作介紹。
廣義表的概念,是數據結構里第一次出現的。它是線性表或表元素的有限序列,構成該結構的每個子表或元素也是線性結構的,所以,這一章也歸入線性結構中。
本章的考查重點有:
1.多維數組中某數組元素的position求解。一般是給出數組元素的首元素地址和每個元素佔用的地址空間並組給出多維數組的維數,然後要求你求出該數組中的某個元素所在的位置。
2.明確按行存儲和按列存儲的區別和聯系,並能夠按照這兩種不同的存儲方式求解1中類型的題。
3.將特殊矩陣中的元素按相應的換算方式存入數組中。這些矩陣包括:對稱矩陣,三角矩陣,具有某種特點的稀疏矩陣等。熟悉稀疏矩陣的三種不同存儲方式:三元組,帶輔助行向量的二元組,十字鏈表存儲。掌握將稀疏矩陣的三元組或二元組向十字鏈表進行轉換的演算法。
4.廣義表的概念,特別應該明確表頭與表尾的定義。這一點,是理解整個廣義表一節演算法的基礎。近來,在一些學校中,出現了這樣一種題目類型:給出對某個廣義表L若干個求了若干次的取頭和取尾操作後的串值,要求求出原廣義表L。大家要留意。
5.與廣義表有關的遞歸演算法。由於廣義表的定義就是遞歸的,所以,與廣義表有關的演算法也常是遞歸形式的。比如:求表深度,復制廣義表等。這種題目,可以根據不同角度廣義表的表現形式運用兩種不同的方式解答:一是把一個廣義表看作是表頭和表尾兩部分,分別對表頭和表尾進行操作;二是把一個廣義表看作是若干個子表,分別對每個子表進行操作。
第五章 樹與二叉樹
從對線性結構的研究過度到對樹形結構的研究,是數據結構課程學習的一次躍變,此次躍變完成的好壞,將直接關繫到你到實際的考試中是否可以拿到高分,而這所有的一切,將最終影響你的專業課總分。所以,樹這一章的重要性,已經不說自明了。
總體來說,樹一章的知識點包括:
二叉樹的概念、性質和存儲結構,二叉樹遍歷的三種演算法(遞歸與非遞歸),在三種基本遍歷演算法的基礎上實現二叉樹的其它演算法,線索二叉樹的概念和線索化演算法以及線索化後的查找演算法,最優二叉樹的概念、構成和應用,樹的概念和存儲形式,樹與森林的遍歷演算法及其與二叉樹遍歷演算法的聯系,樹與森林和二叉樹的轉換。
下面我們來看考試中對以上知識的主要考查方法:
1.二叉樹的概念、性質和存儲結構
考查方法可有:直接考查二叉樹的定義,讓你說明二叉樹與普通雙分支樹的區別;考查滿二叉樹和完全二叉樹的性質,普通二叉樹的五個性質:第i層的最多結點數,深度為k的二叉樹的最多結點數,n0=n2+1的性質,n個結點的完全二叉樹的深度,順序存儲二叉樹時孩子結點與父結點之間的換算關系(左為:2*i,右為:2*i+1)。
二叉樹的順序存儲和二叉鏈表存儲的各自優缺點及適用場合,二叉樹的三叉鏈表表示方法。
2.二叉樹的三種遍歷演算法
這一知識點掌握的好壞,將直接關繫到樹一章的演算法能否理解,進而關繫到樹一章的演算法設計題能否順利完成。二叉樹的遍歷演算法有三種:先序,中序和後序。其劃分的依據是視其每個演算法中對根結點數據的訪問順序而定。不僅要熟練掌握三種遍歷的遞歸演算法,理解其執行的實際步驟,並且應該熟練掌握三種遍歷的非遞歸演算法。由於二叉樹一章的很多演算法,可以直接根據三種遞歸演算法改造而來(比如:求葉子個數),所以,掌握了三種遍歷的非遞歸演算法後,對付諸如:「利用非遞歸演算法求二叉樹葉子個數」這樣的題目就下筆如有神了。我會在另一篇系列文章()里給出三種遍歷的遞歸和非遞歸演算法的背記版,到時請大家一定熟記。
3.可在三種遍歷演算法的基礎上改造完成的其它二叉樹演算法:
求葉子個數,求二叉樹結點總數,求度為1或度為2的結點總數,復制二叉樹,建立二叉樹,交換左右子樹,查找值為n的某個指定結點,刪除值為n的某個指定結點,諸如此類等等等等。如果你可以熟練掌握二叉樹的遞歸和非遞歸遍歷演算法,那麼解決以上問題就是小菜一碟了。
4.線索二叉樹:
線索二叉樹的引出,是為避免如二叉樹遍歷時的遞歸求解。眾所周知,遞歸雖然形式上比較好理解,但是消耗了大量的內存資源,如果遞歸層次一多,勢必帶來資源耗盡的危險,為了避免此類情況,線索二叉樹便堂而皇之地出現了。對於線索二叉樹,應該掌握:線索化的實質,三種線索化的演算法,線索化後二叉樹的遍歷演算法,基本線索二叉樹的其它演算法問題(如:查找某一類線索二叉樹中指定結點的前驅或後繼結點就是一類常考題)。
5.最優二叉樹(哈夫曼樹):
最優二叉樹是為了解決特定問題引出的特殊二叉樹結構,它的前提是給二叉樹的每條邊賦予了權值,這樣形成的二叉樹按權相加之和是最小的。最優二叉樹一節,直接考查演算法源碼的很少,一般是給你一組數據,要求你建立基於這組數據的最優二叉樹,並求出其最小權值之和,此類題目不難,屬送分題。
6.樹與森林:
二叉樹是一種特殊的樹,這種特殊不僅僅在於其分支最多為2以及其它特徵,一個最重要的特殊之處是在於:二叉樹是有序的!即:二叉樹的左右孩子是不可交換的,如果交換了就成了另外一棵二叉樹,這樣交換之後的二叉樹與原二叉樹我們認為是不相同的兩棵二叉樹。但是,對於普通的雙分支樹而言,不具有這種性質。
樹與森林的遍歷,不像二叉樹那樣豐富,他們只有兩種遍歷演算法:先根與後根(對於森林而言稱作:先序與後序遍歷)。在難度比較大的考試中,也有基於此二種演算法的基礎上再進行擴展要求你利用這兩種演算法設計其它演算法的,但一般院校很少有這種考法,最多隻是要求你根據先根或後根寫出他們的遍歷序列。此二者的先根與後根遍歷與二叉樹中的遍歷演算法是有對應關系的:先根遍歷對應二叉樹的先序遍歷,而後根遍歷對應二叉樹的中序遍歷。這一點成為很多學校的考點,考查的方式不一而足,有的直接考此句話,有的是先讓你求解遍歷序列然後回答這個問題。二叉樹、樹與森林之所以能有以上的對應關系,全拜二叉鏈表所賜。二叉樹使用二叉鏈表分別存放他的左右孩子,樹利用二叉鏈表存儲孩子及兄弟(稱孩子兄弟鏈表),而森林也是利用二叉鏈表存儲孩子及兄弟。
樹一章,處處是重點,道道是考題,大家務必個個過關。
第六章 圖
如果說,從線性結構向樹形結構研究的轉變,是數據結構學科對數據組織形式研究的一次升華,那麼從樹形結構的研究轉到圖形結構的研究,則進一步讓我們看到了數據結構對於解決實際問題的重大推動作用。
圖這一章的特點是:概念繁多,與離散數學中圖的概念聯系緊密,演算法復雜,極易被考到,且容易出大題,尤其是名校,作為考研課程,如果不考查樹與圖兩章的知識,幾乎是不可想像的。
下面我們看一下圖這一章的主要考點以及這些考點的考查方式:
1.考查有關圖的基本概念問題:
這些概念是進行圖一章學習的基礎,這一章的概念包括:圖的定義和特點,無向圖,有向圖,入度,出度,完全圖,生成子圖,路徑長度,迴路,(強)連通圖,(強)連通分量等概念。與這些概念相聯系的相關計算題也應該掌握。
2.考查圖的幾種存儲形式:
圖的存儲形式包括:鄰接矩陣,(逆)鄰接表,十字鏈表及鄰接多重表。在考查時,有的學校是給出一種存儲形式,要求考生用演算法或手寫出與給定的結構相對應的該圖的另一種存儲形式。
3.考查圖的兩種遍歷演算法:深度遍歷和廣度遍歷
深度遍歷和廣度遍歷是圖的兩種基本的遍歷演算法,這兩個演算法對圖一章的重要性等同於「先序、中序、後序遍歷」對於二叉樹一章的重要性。在考查時,圖一章的演算法設計題常常是基於這兩種基本的遍歷演算法而設計的,比如:「求最長的最短路徑問題」和「判斷兩頂點間是否存在長為K的簡單路徑問題」,就分別用到了廣度遍歷和深度遍歷演算法。
4.生成樹、最小生成樹的概念以及最小生成樹的構造:PRIM演算法和KRUSKAL演算法。
考查時,一般不要求寫出演算法源碼,而是要求根據這兩種最小生成樹的演算法思想寫出其構造過程及最終生成的最小生成樹。
5.拓撲排序問題:
拓撲排序有兩種方法,一是無前趨的頂點優先演算法,二是無後繼的頂點優先演算法。換句話說,一種是「從前向後」的排序,一種是「從後向前」排。當然,後一種排序出來的結果是「逆拓撲有序」的。
6.關鍵路徑問題:
這個問題是圖一章的難點問題。理解關鍵路徑的關鍵有三個方面:一是何謂關鍵路徑,二是最早時間是什麼意思、如何求,三是最晚時間是什麼意思、如何求。簡單地說,最早時間是通過「從前向後」的方法求的,而最晚時間是通過「從後向前」的方法求解的,並且,要想求最晚時間必須是在所有的最早時間都已經求出來之後才能進行。這個問題拿來直接考演算法源碼的不多,一般是要求按照書上的演算法描述求解的過程和步驟。
在實際設計關鍵路徑的演算法時,還應該注意以下這一點:採用鄰接表的存儲結構,求最早時間和最晚時間要採用不同的處理方法,即:在演算法初始時,應該首先將所有頂點的最早時間全部置為0。關鍵路徑問題是工程進度控制的重要方法,具有很強的實用性。
7.最短路徑問題:
與關鍵路徑問題並稱為圖一章的兩只攔路虎。概念理解是比較容易的,關鍵是演算法的理解。最短路徑問題分為兩種:一是求從某一點出發到其餘各點的最短路徑;二是求圖中每一對頂點之間的最短路徑。這個問題也具有非常實用的背景特色,一個典型的應該就是旅遊景點及旅遊路線的選擇問題。解決第一個問題用DIJSKTRA演算法,解決第二個問題用FLOYD演算法。注意區分。
第七章 查找
在不少數據結構的教材中,是把查找與排序放入高級數據結構中的。應該說,查找和排序兩章是前面我們所學的知識的綜合運用,用到了樹、也用到了鏈表等知識,對這些數據結構某一方面的運用就構成了查找和排序。
現實生活中,search幾乎無處不在,特別是現在的網路時代,萬事離不開search,小到文檔內文字的搜索,大到INTERNET上的搜索,search占據了我們上網的大部分時間。
在復習這一章的知識時,你需要先弄清楚以下幾個概念:
關鍵字、主關鍵字、次關鍵字的含義;靜態查找與動態查找的含義及區別;平均查找長度ASL的概念及在各種查找演算法中的計算方法和計算結果,特別是一些典型結構的ASL值,應該記住。
在DS的教材中,一般將search分為三類:1st,在順序表上的查找;2nd,在樹表上的查找;3rd,在哈希表上的查找。下面詳細介紹其考查知識點及考查方式:
1.線性表上的查找:
主要分為三種線性結構:順序表,有序順序表,索引順序表。對於第一種,我們採用傳統查找方法,逐個比較。對於及有序順序表我們採用二分查找法。對於第三種索引結構,我們採用索引查找演算法。考生需要注意這三種表下的ASL值以及三種演算法的實現。其中,二分查找還要特別注意適用條件以及其遞歸實現方法。
2.樹表上的查找:
這是本章的重點和難點。由於這一節介紹的內容是使用樹表進行的查找,所以很容易與樹一間的某些概念相混淆。本節內容與樹一章的內容有聯系,但也有很多不同,應注意規納。樹表主要分為以下幾種:二叉排序樹,平衡二叉樹,B樹,鍵樹。其中,尤以前兩種結構為重,也有部分名校偏愛考B樹的。由於二叉排序樹與平衡二叉樹是一種特殊的二叉樹,所以與二叉樹的聯系就更為緊密,二叉樹一章學好了,這里也就不難了。
二叉排序樹,簡言之,就是「左小右大」,它的中序遍歷結果是一個遞增的有序序列。平衡二叉樹是二叉排序樹的優化,其本質也是一種二叉排序樹,只不過,平衡二叉樹對左右子樹的深度有了限定:深度之差的絕對值不得大於1。對於二叉排序樹,「判斷某棵二叉樹是否二叉排序樹」這一演算法經常被考到,可用遞歸,也可以用非遞歸。平衡二叉樹的建立也是一個常考點,但該知識點歸根結底還是關注的平衡二叉樹的四種調整演算法,所以應該掌握平衡二叉樹的四種調整演算法,調整的一個參照是:調整前後的中序遍歷結果相同。
B樹是二叉排序樹的進一步改進,也可以把B樹理解為三叉、四叉....排序樹。除B樹的查找演算法外,應該特別注意一下B樹的插入和刪除演算法。因為這兩種演算法涉及到B樹結點的分裂和合並,是一個難點。B樹是報考名校的同學應該關注的焦點之一。
鍵樹也稱字元樹,特別適用於查找英文單詞的場合。一般不要求能完整描述演算法源碼,多是根據演算法思想建立鍵樹及描述其大致查找過程。
3.基本哈希表的查找演算法:
哈希一詞,是外來詞,譯自「hash」一詞,意為:散列或雜湊的意思。哈希表查找的基本思想是:根據當前待查找數據的特徵,以記錄關鍵字為自變數,設計一個function,該函數對關鍵字進行轉換後,其解釋結果為待查的地址。基於哈希表的考查點有:哈希函數的設計,沖突解決方法的選擇及沖突處理過程的描述。
第八章 內部排序
內排是DS課程中最後一個重要的章節,建立在此章之上的考題可以有多種類型:填空,選擇,判斷乃至大型演算法題。但是,歸結到一點,就是考查你對書本上的各種排序演算法及其思想以及其優缺點和性能指標(時間復雜度)能否了如指掌。
這一章,我們對重點的規納將跟以上各章不同。我們將從以下幾個側面來對排序一章進行不同的規納,以期能更全面的理解排序一章的總體結構及各種演算法。
從排序演算法的種類來分,本章主要闡述了以下幾種排序方法:插入、選擇、交換、歸並、計數等五種排序方法。
其中,在插入排序中又可分為:直接插入、折半插入、2路插入、希爾排序。這幾種插入排序演算法的最根本的不同點,說到底就是根據什麼規則尋找新元素的插入點。直接插入是依次尋找,折半插入是折半尋找。希爾排序,是通過控制每次參與排序的數的總范圍「由小到大」的增量來實現排序效率提高的目的。
交換排序,又稱冒泡排序,在交換排序的基礎上改進又可以得到快速排序。快速排序的思想,一語以敝之:用中間數將待排數據組一分為二。快速排序,在處理的「問題規模」這個概念上,與希爾有點相反,快速排序,是先處理一個較大規模,然後逐漸把處理的規模降低,最終達到排序的目的。
選擇排序,相對於前面幾種排序演算法來說,難度大一點。具體來說,它可以分為:簡單選擇、樹選擇、堆排。這三種方法的不同點是,根據什麼規則選取最小的數。簡單選擇,是通過簡單的數組遍歷方案確定最小數;樹選擇,是通過「錦標賽」類似的思想,讓兩數相比,不斷淘汰較大(小)者,最終選出最小(大)數;而堆排序,是利用堆這種數據結構的性質,通過堆元素的刪除、調整等一系列操作將最小數選出放在堆頂。堆排序中的堆建立、堆調整是重要考點。樹選擇排序,也曾經在一些學校中的大型演算法題中出現,請大家注意。
歸並排序,故名思義,是通過「歸並」這種操作完成排序的目的,既然是歸並就必須是兩者以上的數據集合才可能實現歸並。所以,在歸並排序中,關注最多的就是2路歸並。演算法思想比較簡單,有一點,要銘記在心:歸並排序是穩定排序。
基數排序,是一種很特別的排序方法,也正是由於它的特殊,所以,基數排序就比較適合於一些特別的場合,比如撲克牌排序問題等。基數排序,又分為兩種:多關鍵字的排序(撲克牌排序),鏈式排序(整數排序)。基數排序的核心思想也是利用「基數空間」這個概念將問題規模規范、變小,並且,在排序的過程中,只要按照基排的思想,是不用進行關鍵字比較的,這樣得出的最終序列就是一個有序序列。
本章各種排序演算法的思想以及偽代碼實現,及其時間復雜度都是必須掌握的,學習時要多注意規納、總結、對比。此外,對於教材中的10.7節,要求必須熟記,在理解的基礎上記憶,這一節幾乎成為很多學校每年的必考點。
至此,數據結構所有章節的章節重點問題,我們已經規納完畢,使用清華嚴版教材的同學,在復習的同時,可以參照本貼給出的重點進行復習。但是,由於作者本人水平有限,可能有很多考點沒有規納出來,也可能有些考點規納有誤,在此,作者本人誠懇希望諸位朋友直面提出,我會不斷完善和發布新的關於數據結構復習的總結以及筆記

嚴蔚敏數據結構為主的筆記二

第二章:線性表(包括習題與答案及要點)
--------------------------------------------------------------------------------

本章的重點是掌握順序表和單鏈表上實現的各種基本演算法及相關的時間性能分析,難點是使用本章所學的基本知識設計有效演算法解決與線性表相關的應用問題。
要求達到<識記>層次的內容有:線性表的邏輯結構特徵;線性表上定義的基本運算,並利用基本運算構造出較復雜的運算。
要求達到<綜合應用>層次的內容有:順序表的含義及特點,順序表上的插入、刪除操作及其平均時間性能分析,解決簡單應用問題。
鏈表如何表示線性表中元素之間的邏輯關系;單鏈表、雙鏈表、循環鏈表鏈接方式上的區別;單鏈表上實現的建表、查找、插入和刪除等基本演算法及其時間復雜度。循環鏈表上尾指針取代頭指針的作用,以及單循環鏈表上的演算法與單鏈表上相應演算法的異同點。雙鏈表的定義和相關演算法。利用鏈表設計演算法解決簡單應用問題。
要求達到<領會>層次的內容就是順序表和鏈表的比較,以及如何選擇其一作為其存儲結構才能取得較優的時空性能。

--------------------------------------------------------------------------------
線性表的邏輯結構特徵是很容易理解的,如其名,它的邏輯結構特徵就好象是一條線,上面打了一個個結,很形象的,如果這條線上面有結,那麼它就是非空表,只能有一個開始結點,有且只能有一個終端結點,其它的結前後所相鄰的也只能是一個結點(直接前趨和直接後繼)。
關於線性表上定義的基本運算,主要有構造空表、求表長、取結點、查找、插入、刪除等。

--------------------------------------------------------------------------------
線性表的邏輯結構和存儲結構之間的關系。在計算機中,如何把線性表的結點存放到存儲單元中,就有許多方法,最簡單的方法就是按順序存儲。就是按線性表的邏輯結構次序依次存放在一組地址連續的存儲單元中。在存儲單元中的各元素的物理位置和邏輯結構中各結點相鄰關系是一致的。
在順序表中實現的基本運算主要討論了插入和刪除兩種運算。相關的演算法我們通過練習掌握。對於順序表的插入和刪除運算,其平均時間復雜度均為O(n)。

--------------------------------------------------------------------------------
線性表的鏈式存儲結構。它與順序表不同,鏈表是用一組任意的存儲單元來存放線性表的結點,這組存儲單元可以分布在內存中任何位置上。因此,鏈表中結點的邏輯次序和物理次序不一定相同。所以為了能正確表示結點間的邏輯關系,在存儲每個結點值的同時,還存儲了其後繼結點的地址信息(即

❺ c語言習題答案

第三題:b=25/3%3表示25整除3為8,8再除3求轎源余,所以為2;
第八題:(float)(a+b)/2+(int)x%(int)y意為前一部分為浮點型為2.5,後一部分意為3除以2求余,因為是整型,所以小數點後面省略!!所以為3.5;
第十一題:short型溢出了,換個小點的數,無符號整型邊界應為65535;
如果輸出值還不對就是操作系統的問輪帆手題!!!
記住:「/」表示整除,「%」是兩個整數整除求余臘嫌!!!!!

❻ 數據結構(C語言版)課後習題,求大佬解答

#include<stdio.h>

void f(char *s,char *ss,int n) { int i,k,m; char *p,*q,*r;

k=0; r=ss; while ( *r ) { r++; k++; } //找到ss的末尾0,計算ss長度

m=0; q=s; while ( *q ) { q++; m++; } //找到s的末尾0

p=q; q+=k; *q=0; q--; //計算新字元串結尾位置

for ( i=0;i<m-n;i++,p--,q-- ) *q=*p; //將s最後k個字元後移k位

for ( i=0,r--;i<k;i++,q--,r-- ) *q=*r; //將ss倒序復制到s中空出來位置

}

void main() { char s[256],ss[256]; int n;

scanf("%s%s%d",s,ss,&n); f(s,ss,n); printf("%s ",s);

}

❼ 數據結構(c語言版)題目求答案

3.28
void InitCiQueue(CiQueue&Q)//初始化循環鏈表表示的隊列Q
{
Q=(CiLNode*)malloc(sizeof(CiLNode));
Q->next=Q;
}//InitCiQueue
voidEnCiQueue(CiQueue&Q,int x)//把元素x插入循環列表表示的隊列Q,Q指向隊尾元素,Q->next指向頭結點,Q->next->next指向隊尾元素
{
p=(CiLNode*)malloc(sizeof(CiLNode));
p->data=x;
p->next=Q->next;//直接把p加在Q的後面
Q->next=p;
Q=p;//修改尾指針
}
Status DeCiQueue(CiQueue&Q,int x)//從循環鏈表表示的隊列Q頭部刪除元素x
{
if(Q==Q->next)return INFEASIBLE;//隊列已空
p=Q->next->next;
x=p->data;
Q->next->next=p->next;
free(p);
rturn OK;
}//DeCiqueue

3.31

int Palindrome_Test()
{
InitStack(S);InitQueue(Q);
while((c=getchar())!='@')
{
Push(S,c);EnQueue(Q,c);
}
while(!StackEmpty(S))
{
pop(S,a);DeQueue(Q,b);
if(a!=b)return ERROR;
}
return OK;
}

熱點內容
oc訪問成員變數嗎 發布:2024-11-29 00:14:59 瀏覽:517
七牛雲伺服器生成縮略圖 發布:2024-11-29 00:12:36 瀏覽:272
如何重設華為賬號密碼 發布:2024-11-29 00:03:33 瀏覽:813
安卓聽小說下載到哪個文件夾 發布:2024-11-29 00:03:01 瀏覽:932
閑魚掛腳本 發布:2024-11-29 00:01:27 瀏覽:630
ae加快緩存 發布:2024-11-28 23:50:34 瀏覽:342
java的版本號 發布:2024-11-28 23:48:18 瀏覽:100
sql存儲過程區別 發布:2024-11-28 23:35:37 瀏覽:919
ms計算機需要什麼配置 發布:2024-11-28 23:34:21 瀏覽:975
淘寶直接訪問的流量 發布:2024-11-28 23:33:11 瀏覽:49