第一篇:層序遍歷二叉樹(隊列),已調(diào)試,C語言
#include
#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW-2
typedef int Status;
typedef char TElemType;typedef struct BiTNode{
#define MAXQSIZE 100 typedef BiTree QElemType;typedef struct{
Status CreateBiTree(BiTree *T){
} char ch;
scanf(“%c”,&ch);if(ch=='#')*T=NULL;else{
} return OK;if(!(*T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);(*T)->data=ch;CreateBiTree(&((*T)->lchild));CreateBiTree(&((*T)->rchild));QElemType base[MAXQSIZE];int front;int rear;TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;}SqQueue;void InitQueue(SqQueue *Q){ }
Status EnQueue(SqQueue *Q,QElemType e){
}
Status DeQueue(SqQueue *Q,QElemType *e){
}
Status QueueEmpty(SqQueue Q){
}
void Traverse(BiTree T){ SqQueue Q;BiTree p;p=T;
InitQueue(&Q);if(p)EnQueue(&Q,p);while(!QueueEmpty(Q)){ if(Q.rear==Q.front)return TRUE;return FALSE;else if(Q->front==Q->rear)return ERROR;*e=Q->base[Q->front];Q->front=(Q->front+1)%MAXQSIZE;return OK;if((Q->rear+1)%MAXQSIZE==Q->front)return ERROR;Q->base[Q->rear]=e;Q->rear=(Q->rear+1)%MAXQSIZE;return OK;Q->front=Q->rear=0;
}
{
}
} DeQueue(&Q,&p);printf(“%c”,p->data);if(p->lchild)EnQueue(&Q,p->lchild);if(p->rchild)EnQueue(&Q,p->rchild);printf(“n”);
void main()BiTree T1;CreateBiTree(&T1);Traverse(T1);
第二篇:數(shù)據(jù)結(jié)構(gòu)實驗報告——中序遍歷二叉樹
班級:380911班
學(xué)號:57000211 姓名:徐敏
實驗報告
一,實驗?zāi)康模?/p>
·掌握二叉樹的鏈式存儲結(jié)構(gòu); ·掌握構(gòu)造二叉樹的方法;
·加深對二叉樹的中序遍歷的理解; 二,實驗方法:
·用遞歸調(diào)用算法中序遍歷二叉樹。三,實驗步驟:
·通過鏈式存儲建立一顆二叉樹。
·設(shè)計一個算法實現(xiàn)中序遍歷二叉樹。四,具體實驗步驟:
#include
typedef struct _BTNODE{ char c;struct _BTNODE *lchild;struct _BTNODE *rchild;}BTNODE,*PBTNODE;
void PrintBTree(PBTNODE p,int depth);void ConstructBTree(PBTNODE p);void InorderTraverse(PBTNODE p);
void main(){ PBTNODE p;p=(PBTNODE)calloc(1,sizeof(BTNODE));printf(“Input the data:”);ConstructBTree(p);PrintBTree(p,0);printf(“Now InorderTraverse:”);InorderTraverse(p);printf(“nPress any key to continue...”);getchar();}
void PrintBTree(PBTNODE p,int depth){
班級:380911班
學(xué)號:57000211 姓名:徐敏
int i;if(p==NULL){
return;}else{ for(i=0;i printf(“--”);} printf(“>”); printf(“%cn”,p->c); PrintBTree(p->lchild,depth+1); PrintBTree(p->rchild,depth+1);} } void ConstructBTree(PBTNODE p){ int side;char c;side=LEFT;while(TRUE){ scanf(“%c”,&c); if(c=='n'){ //printf(“EOFn”); return; } // printf(“%dn”,c); switch(c){ case '|': break; case')': return; case',': side=RIGHT; break; case'(': if(side==LEFT){ if(p->lchild==NULL){ p->lchild=(PBTNODE)calloc(1,sizeof(BTNODE)); } ConstructBTree(p->lchild); }else{ if(p->rchild==NULL){ p->rchild=(PBTNODE)calloc(1,sizeof(BTNODE)); } 班級:380911班 學(xué)號:57000211 姓名:徐敏 ConstructBTree(p->rchild); } break; default: if(side==LEFT){ p->lchild=(PBTNODE)calloc(1,sizeof(BTNODE)); p->lchild->c=c; }else{ p->rchild=(PBTNODE)calloc(1,sizeof(BTNODE)); p->rchild->c=c; } } } } void InorderTraverse(PBTNODE p){ if(p==NULL){ return;}else{ InorderTraverse(p->lchild); printf(“[%c] ”,p->c); InorderTraverse(p->rchild);} return;} 五,實驗過程: ·輸出:Input the date; ·輸入:1(2(3,4),5(6,7)); ·輸出:Now InorderTraverse:【3】【2】【4】【1】【6】【5】【7】;六,上機實驗體會: ·體會到熟練掌握各種程序算法的重要性; ·通過上機練習(xí),充分理解了鏈式建立二叉樹的算法; ·形象的了解二叉樹的結(jié)構(gòu),能夠熟練的進行先序,中序,后序遍歷二叉樹。 Linux 文件目錄樹的遍歷 1. linux提供opendir、readdir(readdir_r)、closedir和scandir等接口實現(xiàn)對目錄的讀取; 2. readdir返回指向下一個目錄項的指針,如果要自己傳入緩沖區(qū)存儲目錄項,應(yīng)使用readdir_r代替。readdir的結(jié)果中包含當前目錄和上一級目錄的目錄項信息。 3. 在遍歷過程中,進程的工作目錄不會改變,在遞歸遍歷的時候,需要改變工作目錄(chdir)以識別相對路徑,或者每次都限定全局路徑。 4. 深度優(yōu)先遍歷目錄樹采用遞歸實現(xiàn)易編碼(參見如下代碼),廣度優(yōu)先遍歷則需借助隊列實現(xiàn)。當目錄下的文件數(shù)量較少時,采用廣度優(yōu)先遍歷效率會更高,因目錄下的目錄項基本都是連續(xù)存放,減少了很多磁盤尋道;而采用深度優(yōu)先遍歷,結(jié)果的聚合性更高 1.int dir_traverse(const char *dir_name)2.{ 3.DIR *dirp = opendir(dir_name);4.if(!dirp){ 5.perror(“opendir”);6.return-1;7.} 8.9.struct stat st;10.struct dirent *dir;11.char fullpath[FILENM_MAX]; 12.while((dir = readdir(dirp))!= NULL){ 13.if(!strcmp(dir->d_name, “.”)|| // 考慮當前目錄和上級目錄,否則會死循環(huán) 14.!strcmp(dir->d_name, “..”)){ 15.continue;16.} 17.18.sprintf(fullpath, “%s/%s”, dir_name, dir->d_name);//獲取全局路徑 19.printf(“%sn”, fullpath);// 打印路徑 20.if(lstat(fullpath, &st)< 0){ 21.perror(“l(fā)stat”);22.continue;23.} 24.if(S_ISDIR(st.st_mode)){ 25.dir_traverse(fullpath);// 遞歸遍歷子目錄 26.} 27.28.} 29.30.closedir(dirp);31.32.return 0;33.} 訪問目錄下某個文件時,需要逐個讀取目錄數(shù)據(jù)中的目錄項并與目標進行匹配獲得文件的inode號,假設(shè)文件的平均長度為10byte,加上inode、type及reclen等信息,每個目錄項的平均長度為16byte,假設(shè)采用4K的數(shù)據(jù)塊,則一個塊可以存放256個目錄項,按照ext2文件數(shù)據(jù)索引的方式,當目錄下文件數(shù)n少于256*12時,則在目錄下查找文件最多需要訪問n/256(向上取整)個數(shù)據(jù)塊,當目錄下文件數(shù)更多的時候,需要訪問的塊數(shù)會更快的增加(后面得到存儲數(shù)據(jù)的物理塊號需要多級索引),這也是在目錄下不應(yīng)放太多文件的原因,如果將擁有很多文件的目錄均分成多個子目錄,多一級目錄會多一次(或多次,具體依賴于子目錄下文件數(shù)量)磁盤塊訪問,但在子目錄中查找文件的磁盤訪問開銷會小很多。 《c語言程序設(shè)計新視角》第十章 程序調(diào)試及測試 小結(jié) 調(diào)試前測試樣例設(shè)計要費思忖,輸入是什么輸出有哪些,事前要確認,正常、異常、邊界情形要想周全,認真仔細達到要求才能完善致臻。 編譯時有錯不要郁悶,看提示分析語法錯在哪仔細辨認,一個錯會引起連鎖錯,改錯應(yīng)該逐步來多改幾輪。 看運行結(jié)果與設(shè)想是否矛盾,兩廂不符則要把設(shè)計的邏輯詢問。 調(diào)試時設(shè)斷點、單步跟、查變量、看內(nèi)存,勤思考細分析找出bug直至結(jié)果確認。 C語言程序設(shè)計課程期末復(fù)習(xí)練習(xí) 一、單選題 1.在每個C語言程序中都必須包含有這樣一個函數(shù),該函數(shù)的函數(shù)名為(A)。A.main B.MAIN C.name D.function 2.每個C語言程序文件的編譯錯誤分為(B)類。A.1 B.2 C.3 D.4 3.字符串“a+b=12n”的長度為(B)。A.6 B.7 C.8 D.9 4.在switch語句的每個case塊中,假定都是以break語句結(jié)束的,則此switch語句容易被改寫為(B)語句。 A.forB.ifC.doD.while 5.在下面的do-while循環(huán)語句中,其循環(huán)體語句被執(zhí)行的次數(shù)為(D)。int i=0;do i++;while(i<10);A.4 B.3 C.5 D.10 6.將兩個字符串連接起來組成一個字符串時,選用的函數(shù)為(C)。A.strlen()B.strcap()C.strcat()D.strcmp()7.若用數(shù)組名作為函數(shù)調(diào)用的實參,傳遞給形參的是(A)。A.數(shù)組的首地址 B.數(shù)組中第一個元素的值 C.數(shù)組中全部元素的值 D.數(shù)組元素的個數(shù) 8.假定a為一個整數(shù)類型的數(shù)組名,整數(shù)類型的長度為4,則元素a[4]的地址比a數(shù)組的首地址大(C)個字節(jié)。A.4 B.8 C.16 D.32 9.假定s被定義為指針類型char *的變量,初始指向的字符串為“Hello world!”,若要使變量p指向s所指向的字符串,則p應(yīng)定義為(A)。 A.char *p=s;B.char *p=&s;C.char *p;p=*s;D.char *p;p=&s;10.從一個數(shù)據(jù)文件中讀入以換行符結(jié)束的一行字符串的函數(shù)為(B)。A.gets()B.fgets()C.getc()D.fgetc()11.由C語言目標文件連接而成的可執(zhí)行文件的缺省擴展名為(B)。A.cpp B.exe C.obj D.c 12.設(shè)有兩條語句為“int a=12;a+=a*a;”,則執(zhí)行結(jié)束后,a的值為(C)。A.12 B.144 C.156 D.288 13.帶有隨機函數(shù)調(diào)用的表達式rand()%20的值在(C)區(qū)間內(nèi)。A.1~19 B.1~20 C.0~19 D.0~20 14.for循環(huán)語句“for(i=0;i A.char a[20]=“abcdefg”;B.char a[]=“x+y=55.”;C.char a[15]={'1','2'};D.char a[10]='5';16.若有一個函數(shù)原型為“double *function()”,則它的返回值類型為(B)。A.實數(shù)型 B.實數(shù)指針型 C.函數(shù)指針型 D.數(shù)組型 17.在C語言中,所有預(yù)處理命令都是以(B)符號開頭的。A.* B.# C.& D.@ 18.假定整數(shù)指針p所指數(shù)據(jù)單元的值為30,p+1所指數(shù)據(jù)單元的值為40,則執(zhí)行*p++后,p所指數(shù)據(jù)單元的值為(A)。 A.40 B.30 C.70 D.10 19.若要使p指向二維整型數(shù)組a[10][20],則p的類型為(D)。A.int * B.int ** C.int *[20] D.int(*)[20] 20.表示文件結(jié)束符的符號常量為(C)A.eof B.Eof C.EOF D.feof 21.程序運行中需要從鍵盤上輸入多于一個數(shù)據(jù)時,各數(shù)據(jù)之間默認使用(D)符號作為分隔符。A.空格或逗號 B.逗號或回車 C.逗號或分號 D.空格或回車 22.邏輯表達式(x>0 && x<=10)的相反表達式為(A)。 A.x<=0 || x>10 B.x<=0 && x>10 C.x<=0 || x<=10 D.x>0 && x>10 23.當處理特定問題時的循環(huán)次數(shù)已知時,通常采用(A)循環(huán)來解決。A.forB.whileC.do-while D.switch 24.假定i的初值為0,則在循環(huán)語句“while(i A.intFunction(int a);B.void Function(char);C.intFunction(a);D.voidint(double* a);27.假定p是一個指向float型數(shù)據(jù)的指針,則p+1所指數(shù)據(jù)的地址比p所指數(shù)據(jù)的地址大(C)個字節(jié)。A.1 B.2 C.4 D.8 28.假定有定義為“int m=7, *p;”,則給p賦值的正確表達式為(B)。A.p=m B.p=&m C.*p=&m D.p=*m 29.假定指針變量p定義為“int *p=malloc(sizeof(int));”,要釋放p所指向的動態(tài)存儲空間,應(yīng)調(diào)用的函數(shù)為(A)。 A.free(p)B.delete(p)C.free(*p)D.free(&p)30.C語言中的系統(tǒng)函數(shù)fopen()是(D)一個數(shù)據(jù)文件的函數(shù)。A.讀取 B.寫入 C.關(guān)閉 D.打開 二、填空題 1.C語言中的每條簡單語句以_;(或分號)作為結(jié)束符。2.C程序中的所有預(yù)處理命令均以___#___字符開頭。 3.當不需要函數(shù)返回任何值時,則應(yīng)使用void 標識符來定義函數(shù)類型。4.十進制數(shù)25表示成符合C語言規(guī)則的十六進制數(shù)為0x19 5.假定不允許使用邏輯非操作符,則邏輯表達式a>b|| b==5的相反表達式為a<=b && b!=5 6.執(zhí)行“typedefintDataType;”語句后,在使用int定義整型變量的地方也可以使用______DataType____來定義整型變量。 7.假定一維數(shù)組的定義為“char* a[8];”,則該數(shù)組所占存儲空間的字節(jié)數(shù)為_____32___。8.假定二維數(shù)組的定義為“double a[M][N];”,則該數(shù)組的列下標的取值范圍在_____0~N-1____之間。9.存儲一個空字符串需要占用____1 ____個字節(jié)。 10.strcpy函數(shù)用于把一個字符串_____拷貝(復(fù)制)___到另一個字符數(shù)組空間中。11.程序的編譯單位是一個_____程序文件_____。 12.假定a是一個一維數(shù)組,則a[i]的指針訪問方式為___*(a+i)_____。 13.執(zhí)行int*p=malloc(sizeof(int))操作得到的一個動態(tài)分配的整型對象為___*p_____。14.執(zhí)行“printf(“%c”,'A'+2);”語句后得到的輸出結(jié)果為___ C_____。15.shortint類型的長度為____2 ____。 16.用類型關(guān)鍵字表示十進制常數(shù)3.26f的類型為___ float _____。17.假定y=10,則表達式++y*3的值為____ 33____。 18.邏輯表達式(x==0&& y>5)的相反表達式為_(x!=0 || y<=5)或:(x || y<=5)_______。19.若x=5,y=10,則x!=y的邏輯值為____1____。20.假定二維數(shù)組的定義為“int a[3][5];”,則該數(shù)組所占存儲空間的字節(jié)數(shù)為_60___。 21.使用“typedef char BB[10][50];”語句定義___ BB_____為含有10行50列的二維字符數(shù)組類型。22.字符串“a:xxk數(shù)據(jù)”的長度為__11______。23.假定p所指對象的值為25,p+1所指對象的值為46,則*++p的值為___46 _____。24.假定一個數(shù)據(jù)對象為int*類型,則指向該對象的指針類型為___int**____。 25.假定一個結(jié)構(gòu)類型的定義為“struct A{inta,b;A* c;};”,則該類型的長度為_____12 ___。26.假定要訪問一個結(jié)構(gòu)對象x中的數(shù)據(jù)成員a,則表示方式為_____x.a _______。27.用于輸出表達式值的標準輸出函數(shù)的函數(shù)名是___printf_____。 28.每個C語言程序文件在編譯時可能出現(xiàn)有致命性錯誤,其對應(yīng)的標識符為__ error ______。29.已知'A'?'Z'的ASCII碼為65?90,當執(zhí)行“int x='C'+3;”語句后x的值為___70_____。30.表達式(int)14.6的值為_14_______。 31.假定不允許使用邏輯非操作符,則關(guān)系表達式x+y>5的相反表達式為___x+y<=5 32.假定x=5,則執(zhí)行“a=(x?10:20);”語句后a的值為_10_______。33.假定一維數(shù)組的定義為“char* a[M];”,則該數(shù)組所占存儲空間的字節(jié)數(shù)為____4*M____。34.存儲字符串“a”需要至少占用存儲器的____2____個字節(jié)。35.strlen()函數(shù)用于計算一個字符串的___長度_____。 36.在C語言中,一個函數(shù)由函數(shù)頭和____函數(shù)體______這兩個部分組成。37.假定p所指對象的值為25,p+1所指對象的值為46,則執(zhí)行表達式*(p++)后,p所指對象的值為____46____。38.假定p是一個指向整數(shù)對象的指針,則用___&p _____表示指針變量p的地址。39.與結(jié)構(gòu)成員訪問表達式p->name等價的訪問表達式為_____(*p).name _______。 五、按題目要求編寫程序或函數(shù) 1.編寫一個程序,輸出50以內(nèi)(含50)的、能夠被3或者5整除的所有整數(shù)。#include #include 2105.編寫一個程序,計算1+3+3+...+3的值并輸出,假定分別用i,p,s作為循環(huán)變量、累乘變量和累加變量的標識符。 #include第三篇:黑馬程序員C語言教程:Linux 文件目錄樹的遍歷
第四篇:《c語言程序設(shè)計新視角》第十章 程序調(diào)試及測試小結(jié)
第五篇:已打印中央電大C語言考試題庫(c語言小題+編程)(范文)