數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)_第1頁
數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)_第2頁
數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)_第3頁
數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)_第4頁
數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)_第5頁
已閱讀5頁,還剩151頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)xxx公司數(shù)據(jù)結(jié)構(gòu)上機考試(含答案)文件編號:文件日期:修訂次數(shù):第1.0次更改批準(zhǔn)審核制定方案設(shè)計,管理制度《數(shù)據(jù)結(jié)構(gòu)》上機練習(xí)題1、設(shè)有兩個有序序列,利用歸并排序?qū)⑺鼈兣懦捎行虮?,并輸出?、設(shè)有一有序序列,從鍵盤輸入一個數(shù),判別是否在序列中,如果在輸出“YSE”;否則,將它插入到序列中使它仍然有序,并輸出排序后的序列。3、設(shè)有一有序序列,從鍵盤輸入一個數(shù),判別是否在序列中,如果不在,則輸出“NO”,否則,將它從序列中刪除它,并輸出刪除后的序列。4、從鍵盤輸入一組任意數(shù)據(jù),建立一個有序鏈表,并從鏈頭開始輸出該鏈,使輸出結(jié)果是有序的。5、從鍵盤輸入一組任意數(shù)據(jù),建立一個包含所有輸入數(shù)據(jù)的單向循環(huán)鏈表,并從鏈表的任意開始,依次輸出該鏈表中的所有結(jié)點。10、設(shè)有一個鏈表,(自己建立,數(shù)據(jù)從鍵盤輸入),再從鍵盤輸入一個數(shù),判別是否在鏈表中,如果不在,則輸出“NO“,否則,將它從鏈表中刪除,并輸出刪除后的鏈表。11、設(shè)有一個鏈表,(自己建立,數(shù)據(jù)從鍵盤輸入),再從鍵盤輸入一個數(shù),判別是否在鏈表中,如果在輸出“YSE”,否則,將它從插入到鏈頭,并輸出插入后的鏈表。12、設(shè)有一個鏈表,(自己建立,數(shù)據(jù)從鍵盤輸入),再從鍵盤輸入一個數(shù),判別是否在鏈表中,如果在輸出“YSE”,否則,將它從插入到鏈尾,并輸出插入后的鏈表。13、編寫棧的壓棧push、彈棧pop函數(shù),從鍵盤輸入一組數(shù)據(jù),逐個元素壓入堆棧,然后再逐個從棧中彈出它們并輸出。14、編寫棧的壓棧push、彈棧pop函數(shù),用它判別()的匹配問題。15、按類似先序遍歷結(jié)果輸入一序列,建立一棵二叉樹(算法6、4),輸出二叉樹中序遍歷的結(jié)果。16、按類似先序遍歷結(jié)果輸入一序列,建立一棵二叉樹(算法6、4),輸出二叉樹先序遍歷的結(jié)果。17、按類似先序遍歷結(jié)果輸入一序列,建立一棵二叉樹(算法6、4),輸出二叉樹后序遍歷的結(jié)果。18、按類似先序遍歷結(jié)果輸入一序列,建立一棵二叉樹(算法6、4),輸出二叉樹的總結(jié)點數(shù)。19、按類似先序遍歷結(jié)果輸入一序列,建立一棵二叉樹(算法6、4),輸出二叉樹葉子結(jié)點數(shù)。20、按類似先序遍歷結(jié)果輸入一序列,建立一棵二叉樹(算法6、4),輸出此二叉樹的高度。21、給出一個無向圖的鄰接矩陣,輸出各個頂點的度。22、給出一個有向圖的鄰接矩陣,輸出各個頂點的入度與出度。23、輸入一個有序序列,利用折半查找來查找一個數(shù)是否在序列中,如在,則輸出其位置,否則輸出“NO”。24、用插入排序方法對一組數(shù)據(jù)進行排序,并輸出每趟排序的結(jié)果。25、用選擇排序方法對一組數(shù)據(jù)進行排序,并輸出每趟排序的結(jié)果。26、用希爾(SHELL)排序方法對一組數(shù)據(jù)進行排序,并輸出每趟排序的結(jié)果。27、用快速排序方法對一組數(shù)據(jù)進行排序,并輸出每趟排序的結(jié)果。.答案:1.#include<stdio.h>#include<stdlib.h>#defineN5#defineNULL0//鏈表的存儲結(jié)構(gòu)typedefstructLNode{ intdata; structLNode*next;}LNode,*list;//順序創(chuàng)建鏈表voidcreatList(list&l,intn){ inti; listp,q; l=(list)malloc(sizeof(LNode));//開辟頭結(jié)點 p=l;//指針p指向頭結(jié)點 for(i=0;i<n;i++) { q=(list)malloc(sizeof(LNode));//新的結(jié)點 scanf("%d",&q->data); p->next=q;//p的下一個結(jié)點指向新開辟的結(jié)點q p=q;//將p指針指向q } p->next=NULL;}//歸并排序voidmergeList(list&la,list&lb,list&lc){//將已經(jīng)排好序的la,lb中的數(shù)重新排列成有序(非遞減) listpa,pb,pc; pa=la->next;pb=lb->next; lc=pc=la;//默認(rèn)將la做為lc的頭結(jié)點(lb亦可) while(pa&&pb) {//讓pc接到數(shù)據(jù)小的結(jié)點上,直到pa,pb兩者有一指向空結(jié)點 if(pa->data<=pb->data) {pc->next=pa;pc=pa;pa=pa->next;} else {pc->next=pb;pc=pb;pb=pb->next;} } pc->next=pa?pa:pb;//如果最后la有剩余結(jié)點,即將其直接加入到lc中,反之將lb的剩余結(jié)點加到lc中 free(lb); }voidprintList(listl){ listp; p=l->next; while(p) {printf("%d",p->data);p=p->next;}}voidmain(){ listla,lb,lc; printf("創(chuàng)建兩個含%d個元素的鏈表,請輸入:\n",N); creatList(la,N); creatList(lb,N); mergeList(la,lb,lc); printList(lc);}2.#include<stdio.h>#include<stdlib.h>#defineN5#defineNULL0#defineOK1#defineERROR0//鏈表的存儲結(jié)構(gòu)typedefstructLNode{ intdata; structLNode*next;}LNode,*list;//創(chuàng)建鏈表voidcreatList(list&l,intn){ listp,q; l=(list)malloc(sizeof(LNode)); p=l; for(inti=0;i<n;i++) { q=(list)malloc(sizeof(LNode)); scanf("%d",&q->data); p->next=q; p=q; } p->next=NULL;}//判斷元素e是否在鏈表中intinList(listl,inte){ listp; p=l->next; while(p) { if(p->data==e) returnOK;//發(fā)現(xiàn)在里面,返回真值 p=p->next;//否則指針后移,繼續(xù)找 } returnERROR; //未找到,返回假值(沒有執(zhí)行returnOK;語句)}//插入元素voidinsertList(list&l,int&e){ listp,q,s;//q為新插入的元素開辟一個存儲空間的指針,s為p前一個指針,方便插入 p=l->next; s=l; while(p) { if(e<=p->data) {//發(fā)現(xiàn)要插入的元素e比后面的小,開辟空間,并將e放入空間的數(shù)據(jù)域中 q=(list)malloc(sizeof(LNode)); q->data=e; while(s->next!=p)s=s->next;//找到p前的一個指針 q->next=p;//畫圖好好理解--->s--->p---> s->next=q;//q---> break; } p=p->next; }}//輸出鏈表voidprintList(listl){ listp; p=l->next; while(p) {printf("%d",p->data);p=p->next;}}voidmain(){ listl; inte; printf("創(chuàng)建%d個元素的鏈表,請輸入%d個元素:\n",N,N); creatList(l,N); printf("請輸入要判斷的元素:"); scanf("%d",&e); if(inList(l,e)) printf("YES"); else { insertList(l,e); printList(l); }}3.#include<stdio.h>#include<stdlib.h>#defineN5#defineNULL0#defineOK1#defineERROR0//鏈表的存儲結(jié)構(gòu)typedefstructLNode{ intdata; structLNode*next;}LNode,*list;//創(chuàng)建鏈表voidcreatList(list&l,intn){ listp,q; l=(list)malloc(sizeof(LNode)); p=l; for(inti=0;i<n;i++) { q=(list)malloc(sizeof(LNode)); scanf("%d",&q->data); p->next=q; p=q; } p->next=NULL;}//判斷元素e是否在鏈表中intinsertDeleteList(listl,inte){ listp,q; p=l->next;q=l; while(p) { if(p->data==e) { while(q->next!=p)q=q->next;//找到p前一個結(jié)點,方便刪除操作 q->next=p->next;//刪除結(jié)點p free(p); returnOK; }//發(fā)現(xiàn)在里面,返回真值 p=p->next;//否則指針后移,繼續(xù)找 } returnERROR; //未找到,返回假值(沒有執(zhí)行returnOK;語句)}//輸出鏈表voidprintList(listl){ listp; p=l->next; while(p) {printf("%d",p->data);p=p->next;}}voidmain(){ listl; inte; printf("創(chuàng)建%d個元素的鏈表,請輸入%d個元素:\n",N,N); creatList(l,N); printf("請輸入要判斷的元素"); scanf("%d",&e); if(!insertDeleteList(l,e)) printf("NO"); else printList(l);}4.#include<stdio.h>#include<stdlib.h>#defineN5#defineNULL0#defineOK1#defineERROR0//鏈表的存儲結(jié)構(gòu)typedefstructLNode{ intdata; structLNode*next;}LNode,*list;//創(chuàng)建鏈表voidcreatList(list&l,intn){ listp,q; l=(list)malloc(sizeof(LNode)); p=l; for(inti=0;i<n;i++) { q=(list)malloc(sizeof(LNode)); scanf("%d",&q->data); p->next=q; p=q; } p->next=NULL;}//鏈表排序voidsortList(list&l){ listp,q,r;//p標(biāo)記排序的輪數(shù) intchang;//用于交換結(jié)點中的數(shù)據(jù) p=l->next; while(p->next!=NULL) { q=l->next;//每次比較從首結(jié)點開始 while(q->next!=NULL) { r=q->next; if(q->data>r->data)//發(fā)現(xiàn)前一個比后一個大,交換數(shù)據(jù) {chang=q->data;q->data=r->data;r->data=chang;} q=q->next;//相鄰間下一個比較 } p=p->next;//下一輪比較 }}//輸出鏈表voidprintList(listl){ listp; p=l->next; while(p) {printf("%d",p->data);p=p->next;}}voidmain(){ listl; printf("創(chuàng)建%d個元素的鏈表,請輸入%d個元素:\n",N,N); creatList(l,N); sortList(l); printList(l); }5.#include<stdio.h>#include<stdlib.h>#defineN5#defineNULL0#defineOK1#defineERROR0//鏈表的存儲結(jié)構(gòu)typedefstructLNode{ intdata; structLNode*next;}LNode,*list;//創(chuàng)建鏈表voidcreatList(list&l,intn){ listp,q; l=(list)malloc(sizeof(LNode)); scanf("%d",&l->data);//頭結(jié)點也添加元素,方便輸出 p=l; for(inti=1;i<n;i++) { q=(list)malloc(sizeof(LNode)); scanf("%d",&q->data); p->next=q; p=q; } p->next=l;//讓最后一個p->next指針指向頭結(jié)點,構(gòu)成循環(huán)鏈表}//輸出鏈表voidprintList(listl,intpos){ listp,q; inti; p=l; for(i=1;i<pos-1;i++)p=p->next;//找到指定位置的前一個位置 q=p->next; do { if(pos==1){printf("%d",p->data);p=p->next;}//如果指定位置為1,即按原樣輸出 else{p=p->next;printf("%d",p->data);}//不然,p先移到指定的位置,輸出其數(shù)據(jù) }while(p->next!=q); //結(jié)束條件(p移到的下一個位置不是q,即不是最初的p,完成循環(huán)輸出)}voidmain(){ listl; intpos; printf("創(chuàng)建%d個元素的循環(huán)鏈表,請輸入%d個元素:\n",N,N); creatList(l,N); printf("請指明從第幾個位置輸出循環(huán)鏈表中的元素:"); scanf("%d",&pos); while(pos<=0||pos>N) { printf("輸入的位置不存在,請重新輸入..."); scanf("%d",&pos); } printList(l,pos);}11#include<stdio.h>#include<stdlib.h>#defineN5#defineNULL0#defineOK1#defineERROR0//鏈表的存儲結(jié)構(gòu)typedefstructLNode{ intdata; structLNode*next;}LNode,*list;//創(chuàng)建鏈表voidcreatList(list&l,intn){ listp,q; l=(list)malloc(sizeof(LNode)); scanf("%d",&l->data);//頭結(jié)點也添加元素,方便輸出 p=l; for(inti=1;i<n;i++) { q=(list)malloc(sizeof(LNode)); scanf("%d",&q->data); p->next=q; p=q; } p->next=l;//讓最后一個p->next指針指向頭結(jié)點,構(gòu)成循環(huán)鏈表}//輸出鏈表voidprintList(listl,intpos){ listp,q; inti; p=l; for(i=1;i<pos-1;i++)p=p->next;//找到指定位置的前一個位置 q=p->next; do { if(pos==1){printf("%d",p->data);p=p->next;}//如果指定位置為1,即按原樣輸出 else{p=p->next;printf("%d",p->data);}//不然,p先移到指定的位置,輸出其數(shù)據(jù) }while(p->next!=q); //結(jié)束條件(p移到的下一個位置不是q,即不是最初的p,完成循環(huán)輸出)}voidmain(){ listl; intpos; printf("創(chuàng)建%d個元素的循環(huán)鏈表,請輸入%d個元素:\n",N,N); creatList(l,N); printf("請指明從第幾個位置輸出循環(huán)鏈表中的元素:"); scanf("%d",&pos); while(pos<=0||pos>N) { printf("輸入的位置不存在,請重新輸入..."); scanf("%d",&pos); } printList(l,pos);}12#include<stdio.h>#include<stdlib.h>#defineN5#defineNULL0#defineOK1#defineERROR0//鏈表的存儲結(jié)構(gòu)typedefstructLNode{ intdata; structLNode*next;}LNode,*list;//創(chuàng)建鏈表voidcreatList(list&l,intn){ listp,q; l=(list)malloc(sizeof(LNode)); p=l; for(inti=0;i<n;i++) { q=(list)malloc(sizeof(LNode)); scanf("%d",&q->data); p->next=q; p=q; } p->next=NULL;}//判斷元素e是否在鏈表中intinList(listl,inte){ listp,q; q=p=l->next; while(p) { if(p->data==e) returnOK;//發(fā)現(xiàn)在里面,返回真值 p=p->next;//否則指針后移,繼續(xù)找 } //沒有執(zhí)行returnOK;語句,說明未找到 while(q->next!=p)q=q->next;//找到鏈尾 p=(list)malloc(sizeof(LNode));//為鏈尾重新開辟空間 p->data=e;//接到鏈尾 p->next=q->next; q->next=p; returnERROR;//未找到,返回假值 }//輸出鏈表voidprintList(listl){ listp; p=l->next; while(p) {printf("%d",p->data);p=p->next;}}voidmain(){ listl; inte; printf("創(chuàng)建%d個元素的鏈表,請輸入%d個元素:\n",N,N); creatList(l,N); printf("請輸入要判斷的元素:"); scanf("%d",&e); if(inList(l,e)) printf("YES"); else printList(l);}13#include<stdio.h>#include<stdlib.h>#defineOK1#defineError0#defineNULL0#definemaxSize100//棧的存儲結(jié)構(gòu)typedefstruct{ int*base; int*top; intsize;}stack;//棧的初始化(順序存儲)intinitStack(stack&s){//開辟maxSize大小的空間,base和top都指向基地址,同時判斷是否開辟成功,不成功返回0 if(!(s.base=s.top=(int*)malloc(maxSize*sizeof(int))))returnError; s.size=maxSize;//棧的大小為maxSize returnOK;}//進棧操作intpush(stack&s,inte){ *s.top=e;//先將元素e賦值給s.top所指的存儲空間 s.top++;//top指針上移 returnOK;}//出棧操作intpop(stack&s,int&e){ if(s.base==s.top)returnError;//如果棧為空,返回0 s.top--;//top指針先后移 e=*s.top;//將其所指的元素值賦給e returne;}voidmain(){ stacks; intn,e; printf("請輸入要創(chuàng)建棧的元素的個數(shù):"); scanf("%d",&n); initStack(s); for(inti=0;i<n;i++) { scanf("%d",&e); push(s,e); } while(s.base!=s.top) { printf("%d",pop(s,e)); }}14#include<stdlib.h>#include<stdio.h>#include<stdio.h>#include<stdlib.h>#definestackincrement8#defineOK1#defineError0#defineNULL0#definemaxSize100//棧的存儲結(jié)構(gòu)typedefstruct{ char*base;//由于要存放括號,所以為char類型 char*top; intsize;}stack;//棧的初始化(順序存儲)intinitStack(stack&s){//注意開辟的空間為char類型 if(!(s.base=s.top=(char*)malloc(maxSize*sizeof(char))))returnError; s.size=maxSize;//棧的大小為maxSize returnOK;}//進棧操作intpush(stack&s,inte){ *s.top=e;//先將元素e賦值給s.top所指的存儲空間 s.top++;//top指針上移 returnOK;}intisEmpty(stacks){ returns.base==s.top?OK:Error;}//出棧操作charpop(stack&s,char&e){ if(isEmpty(s))returnError;//如果棧為空,返回0 s.top--;//top指針先后移 e=*s.top;//將其所指的元素值賦給e returne;}//括號匹配intmatch(){ stacks; initStack(s); charch[100],e; intflag=1,i=0,lenth;//flag用于標(biāo)記,如果匹配,值為1,否則為0 scanf("%c",&ch[i]); while(ch[i]!='\n')scanf("%c",&ch[++i]);//先將所有輸入的括號存放在數(shù)組ch[]中 lenth=i-1;//數(shù)組的長度,不包括'\n' i=0; push(s,ch[i]);//先將第一個括號壓棧 if(ch[i]==']'||ch[i]==')'||ch[i]=='}')flag=0;//如果第一個壓入的是右括號,則肯定不匹配,flag=0 elsewhile(i<lenth)//||!emptystack(s) { i++;chart; if(ch[i]==']'||ch[i]==')'||ch[i]=='}') {t=pop(s,e);//彈出先前壓入的元素,將后繼輸入的括號與先前壓入的比較 if((t!=ch[i]-1)&&(t!=ch[i]-2)){flag=0;break;}//左右小括號與左右大括號的ASCII碼都相差1,左右中括號相差2,如果不滿足,則不匹配,直接退出循環(huán) } elsepush(s,ch[i]);//輸入的是左括號,直接壓入 }if(!isEmpty(s))flag=0;//通過不斷的壓棧和彈棧,如果最后棧不為空,則肯定是左括號多于右括號,不匹配 returnflag;}voidmain(){ intresult; printf("判斷輸入的各種括號是否匹配:\n"); result=match(); if(result)printf("括號匹配正確^_^\n"); elseprintf("括號匹配錯誤*.*\n"); }15#include"stdio.h"#include"stdlib.h"#definestackinitsize100#defineOK1#defineERROR0//二叉樹的二叉鏈表存儲結(jié)構(gòu)typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//左右孩子指針}BiTnode,*BiTree;intCreateBiTree(BiTree&T){//按先序次序輸入二叉樹中結(jié)點的值(一個字符),空格字符表示空樹。//構(gòu)造二叉鏈表表示的二叉樹T.charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(0);T->data=ch;//生成根結(jié)點CreateBiTree(T->lchild);//構(gòu)造左子樹CreateBiTree(T->rchild);//構(gòu)造右子樹}returnOK;}//CreateBiTreeintPrintElement(inte){//輸出元素e的值printf("%c",e);returnOK; }intInOrderTraverse(BiTreeT,int(*Visit)(inte))//采用二叉鏈表存儲結(jié)構(gòu),visit是對數(shù)據(jù)元素操作的應(yīng)用函數(shù),//中序遍歷二叉樹T的遞歸算法,對每個數(shù)據(jù)元素調(diào)用函數(shù)visit。//調(diào)用實例:InOrderTraverse(T,printElement);{if(T){if(InOrderTraverse(T->lchild,Visit))if(Visit(T->data))if(InOrderTraverse(T->rchild,Visit))returnOK;returnERROR; }elsereturnOK;}voidmain(){BiTreet;printf("請按先序遍歷輸入二叉樹(當(dāng)左右子樹為空時用空格輸入)\n");CreateBiTree(t);printf("該二叉樹的中序遍歷為:\n");InOrderTraverse(t,PrintElement);printf("\n");}16#include"stdio.h"#include"stdlib.h"#definestackinitsize100#defineOK1#defineERROR0//二叉樹的二叉鏈表存儲結(jié)構(gòu)typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//左右孩子指針}BiTnode,*BiTree;intCreateBiTree(BiTree&T){//按先序次序輸入二叉樹中結(jié)點的值(一個字符),空格字符表示空樹。//構(gòu)造二叉鏈表表示的二叉樹T.charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(0);T->data=ch;//生成根結(jié)點CreateBiTree(T->lchild);//構(gòu)造左子樹CreateBiTree(T->rchild);//構(gòu)造右子樹}returnOK;}//CreateBiTreeintPrintElement(inte){//輸出元素e的值printf("%c",e);returnOK; }intPreOrderTraverse(BiTreeT,int(*Visit)(inte))//采用二叉鏈表存儲結(jié)構(gòu),visit是對數(shù)據(jù)元素操作的應(yīng)用函數(shù),//先序遍歷二叉樹T的遞歸算法,對每個數(shù)據(jù)元素調(diào)用函數(shù)visit。//調(diào)用實例:PreOrderTraverse(T,printElement);{if(T){if(Visit(T->data))if(PreOrderTraverse(T->lchild,Visit))if(PreOrderTraverse(T->rchild,Visit))returnOK;returnERROR; }elsereturnOK;}//preOrderTraVersevoidmain(){BiTreet;printf("請按先序遍歷輸入二叉樹(當(dāng)左右子樹為空時用空格輸入)\n");CreateBiTree(t);printf("該二叉樹的先序遍歷為:\n");PreOrderTraverse(t,PrintElement);printf("\n");}17#include"stdio.h"#include"stdlib.h"#definestackinitsize100#defineOK1#defineERROR0//二叉樹的二叉鏈表存儲結(jié)構(gòu)typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//左右孩子指針}BiTnode,*BiTree;intCreateBiTree(BiTree&T){//按先序次序輸入二叉樹中結(jié)點的值(一個字符),空格字符表示空樹。//構(gòu)造二叉鏈表表示的二叉樹T.charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(0);T->data=ch;//生成根結(jié)點CreateBiTree(T->lchild);//構(gòu)造左子樹CreateBiTree(T->rchild);//構(gòu)造右子樹}returnOK;}//CreateBiTreeintPrintElement(inte){//輸出元素e的值printf("%c",e);returnOK; }intPostOrderTraverse(BiTreeT,int(*Visit)(inte))//采用二叉鏈表存儲結(jié)構(gòu),visit是對數(shù)據(jù)元素操作的應(yīng)用函數(shù),//后序遍歷二叉樹T的遞歸算法,對每個數(shù)據(jù)元素調(diào)用函數(shù)visit。//調(diào)用實例:PostOrderTraverse(T,printElement);{if(T){if(PostOrderTraverse(T->lchild,Visit))if(PostOrderTraverse(T->rchild,Visit)) if(Visit(T->data))returnOK;returnERROR; }elsereturnOK;}voidmain(){BiTreet;printf("請按先序遍歷輸入二叉樹(當(dāng)左右子樹為空時用空格輸入)\n");CreateBiTree(t);printf("該二叉樹的后序遍歷為:\n");PostOrderTraverse(t,PrintElement);printf("\n");}18#include"stdio.h"#include"stdlib.h"#definestackinitsize100#defineOK1#defineERROR0//#defineNULL0staticintcount=0;//二叉樹的二叉鏈表存儲結(jié)構(gòu)typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//左右孩子指針}BiTnode,*BiTree;intCreateBiTree(BiTree&T){//按先序次序輸入二叉樹中結(jié)點的值(一個字符),空格字符表示空樹。//構(gòu)造二叉鏈表表示的二叉樹T.charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))return-1;T->data=ch;//生成根結(jié)點CreateBiTree(T->lchild);//構(gòu)造左子樹CreateBiTree(T->rchild);//構(gòu)造右子樹}returnOK;}//CreateBiTreeintPrintElement(inte){//記錄遍歷結(jié)點數(shù)count++; returnOK; }intPreOrderTraverse(BiTreeT,int(*Visit)(inte))//采用二叉鏈表存儲結(jié)構(gòu),visit是對數(shù)據(jù)元素操作的應(yīng)用函數(shù),{if(T){if(Visit(T->data))if(PreOrderTraverse(T->lchild,Visit))if(PreOrderTraverse(T->rchild,Visit))returnOK;returnERROR; }elsereturnOK;}//preOrderTraVersevoidmain(){BiTreet;printf("請按先序遍歷輸入二叉樹(當(dāng)左右子樹為空時用空格輸入)\n");CreateBiTree(t);printf("該二叉樹的總結(jié)點數(shù)為:");PreOrderTraverse(t,PrintElement);printf("%d\n",count);}19#include"stdio.h"#include"stdlib.h"#definestackinitsize100#defineOK1#defineERROR0staticintcount=0;//二叉樹的二叉鏈表存儲結(jié)構(gòu)typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//左右孩子指針}BiTnode,*BiTree;intCreateBiTree(BiTree&T){//按先序次序輸入二叉樹中結(jié)點的值(一個字符),空格字符表示空樹。//構(gòu)造二叉鏈表表示的二叉樹T.charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(0);T->data=ch;//生成根結(jié)點CreateBiTree(T->lchild);//構(gòu)造左子樹CreateBiTree(T->rchild);//構(gòu)造右子樹}returnOK;}//CreateBiTreeintPrintElement(inte){//判斷葉子結(jié)點的個數(shù),此函數(shù)可不做操作 returnOK; }intPreOrderTraverse(BiTreeT,int(*Visit)(inte))//采用二叉鏈表存儲結(jié)構(gòu),visit是對數(shù)據(jù)元素操作的應(yīng)用函數(shù),//先序遍歷二叉樹T的遞歸算法,對每個數(shù)據(jù)元素調(diào)用函數(shù)visit。//調(diào)用實例:PreOrderTraverse(T,printElement);{if(T){if(Visit(T->data))if(PreOrderTraverse(T->lchild,Visit)) if(T->rchild==NULL)count++;//當(dāng)左右結(jié)點都為空時,即是葉子結(jié)點if(PreOrderTraverse(T->rchild,Visit))returnOK;returnERROR; }elsereturnOK;}//preOrderTraVersevoidmain(){BiTreet;printf("請按先序遍歷輸入二叉樹(當(dāng)左右子樹為空時用空格輸入)\n");CreateBiTree(t);PreOrderTraverse(t,PrintElement);printf("該二叉樹的葉子結(jié)點的個數(shù)為:%d\n",count);}20#include"stdio.h"#include"stdlib.h"#definestackinitsize100#defineOK1#defineERROR0//二叉樹的二叉鏈表存儲結(jié)構(gòu)typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//左右孩子指針}BiTnode,*BiTree;intCreateBiTree(BiTree&T){//按先序次序輸入二叉樹中結(jié)點的值(一個字符),空格字符表示空樹。//構(gòu)造二叉鏈表表示的二叉樹T.charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(0);T->data=ch;//生成根結(jié)點CreateBiTree(T->lchild);//構(gòu)造左子樹CreateBiTree(T->rchild);//構(gòu)造右子樹}returnOK;}//CreateBiTree//首先分析二叉樹的深度(高度)和它的左、右子樹深度之間的關(guān)系。//從二叉樹深度的定義可知,二叉樹的深度應(yīng)為其左、右子樹深度的最大值加1。//由此,需先分別求得左、右子樹深度,返回其最大值,然后加1。intGetDepth(BiTreeT){if(T){intdepthLeft=GetDepth(T->lchild);intdepthRight=GetDepth(T->rchild);return(depthLeft>depthRight?depthLeft:depthRight)+1;}elsereturnERROR;}voidmain(){BiTreet;printf("請按先序遍歷輸入二叉樹(當(dāng)左右子樹為空時用空格輸入)\n");CreateBiTree(t);printf("該二叉樹的高度為:%d\n",GetDepth(t));}21.//21、給出一個無向圖的鄰接矩陣,輸出各個頂點的度。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintmax=50;typedefchartype;typedefstruct{ typevexs[max]; boolarcs[max][max]; intvexnum,arcnum;//頂點個數(shù)、邊數(shù)}graph;intmain(){ graphg; cin>>g.vexnum>>g.arcnum; inti,j; for(i=0;i<g.vexnum;++i)cin>>g.vexs[i]; memset(g.arcs,0,sizeof(g.arcs)); for(i=0;i<g.arcnum;++i) {intx,y;cin>>x>>y;g.arcs[x][y]=1;g.arcs[y][x]=1; } cout<<"無向鄰接矩陣為:"<<endl; for(i=0;i<g.vexnum;i++){ for(j=0;j<g.vexnum;j++)cout<<g.arcs[i][j]; cout<<endl;} for(i=0;i<g.vexnum;++i) { intamount=0; for(j=0;j<g.vexnum;++j) if(g.arcs[i][j])++amount; cout<<"頂點"<<g.vexs[i]<<"的度為"<<amount<<endl; } return0;}22//22、給出一個有向圖的鄰接矩陣,輸出各個頂點的入度與出度。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintmax=50;typedefchartype;typedefstruct{ typevexs[max]; boolarcs[max][max]; intvexnum,arcnum;//頂點個數(shù)、邊數(shù)}graph;intmain(){ graphg; cin>>g.vexnum>>g.arcnum; inti,j; for(i=0;i<g.vexnum;++i)cin>>g.vexs[i]; memset(g.arcs,0,sizeof(g.arcs)); for(i=0;i<g.arcnum;++i) {intx,y;cin>>x>>y;g.arcs[x][y]=1; } cout<<"有向鄰接矩陣為:"<<endl; for(i=0;i<g.vexnum;i++){ for(j=0;j<g.vexnum;j++)cout<<g.arcs[i][j]; cout<<endl;} for(i=0;i<g.vexnum;++i) { intin=0,out=0; for(j=0;j<g.vexnum;++j) { if(g.arcs[i][j])++out; if(g.arcs[j][i])++in; } cout<<"頂點"<<g.vexs[i]<<"的出度為"<<out<<"入度為"<<in<<endl; } return0;}23//23、輸入一個有序序列,利用折半查找來查找一個數(shù)是否在序列中,//如在,則輸出其位置,否則輸出"NO"。#include<iostream>#include<cstdlib>#include<cstdio>usingnamespacestd;typedefinttype;structsqlist{ type*data; intlength;};intinit_sqlist(sqlist&L,intn){ L.data=(type*)malloc((n+1)*sizeof(type)); if(!L.data)return-2; for(inti=1;i<=n;i++)cin>>L.data[i]; L.length=n; return1;}intbinary_search(sqlistL,typen){ intlow=1,high=L.length,mid; while(low<=high) { mid=(low+high)/2; if(L.data[mid]==n)returnmid; elseif(L.data[mid]<n)low=mid+1; elsehigh=mid-1; } return0;}intmain(){ intn; typet; sqlistL; cout<<"請輸入有序表長度:"<<endl; cin>>n; cout<<"請按從小到大的順序輸入"<<n<<"個元素:"<<endl; init_sqlist(L,n); cout<<"請輸入要查找的數(shù)"<<endl; while(cin>>t) { n=binary_search(L,t); if(n)cout<<t<<"在有序表中的位置是"<<n<<endl; elsecout<<t<<"不在有序表中"<<endl; } return0;}24//24、用插入排序方法對一組數(shù)據(jù)進行排序,并輸出每趟排序的結(jié)果。#include<iostream>#include<cstdlib>#include<cstdio>usingnamespacestd;typedefinttype;structsqlist{ type*data; intlength;};intinit_sqlist(sqlist&L,intn){ L.data=(type*)malloc((n+1)*sizeof(type)); if(!L.data)return-2; for(inti=1;i<=n;i++)cin>>L.data[i]; L.length=n; return1;}voidstraight_insert_sort(sqlist&L){ inti,j,k=1; for(i=2;i<=L.length;i++) { if(L.data[i]<L.data[i-1]) { L.data[0]=L.data[i]; for(j=i-1;L.data[0]<L.data[j];j--) L.data[j+1]=L.data[j]; L.data[j+1]=L.data[0]; } cout<<"第"<<k<<"趟排序后序列為:"<<endl; for(j=1;j<=L.length;j++)cout<<L.data[j]<<''; cout<<endl; }}voidbinary_insert_sort(sqlist&L){ inti,j,k; for(i=2;i<=L.length;i++) { L.data[0]=L.data[i]; intlow=1,high=i-1,mid; while(low<=high) { mid=(low+high)/2; if(L.data[0]<L.data[mid])high=mid-1; elselow=mid+1; } for(j=i-1;j>=high+1;--j)L.data[j+1]=L.data[j]; L.data[high+1]=L.data[0]; for(k=1;k<=L.length;++k)cout<<L.data[k]<<''; cout<<endl; }}intmain(){ intn; sqlistL; cout<<"請輸入序列長度"<<endl; cin>>n; cout<<"請輸入"<<n<<"個元素:"<<endl; init_sqlist(L,n); straight_insert_sort(L); //binary_insert_sort(L); return0;}25//25、用選擇排序方法對一組數(shù)據(jù)進行排序,并輸出每趟排序的結(jié)果。#include<iostream>#include<cstdlib>#include<cstdio>usingnamespacestd;typedefinttype;structsqlist{ type*data; intlength

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論