數(shù)據(jù)結構實驗報告_第1頁
數(shù)據(jù)結構實驗報告_第2頁
數(shù)據(jù)結構實驗報告_第3頁
數(shù)據(jù)結構實驗報告_第4頁
數(shù)據(jù)結構實驗報告_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 PAGE21 頁 共 NUMPAGES21 頁數(shù)據(jù)結構實驗報告想必學計算機專業(yè)的同學都知道數(shù)據(jù)結構是一門比較重要的課程,那么,下面是第一WTT給大家整理收集的數(shù)據(jù)結構實驗報告,供大家閱讀參考。數(shù)據(jù)結構實驗報告1一、實驗目的及要求1)掌握棧和隊列這兩種特殊的線性表,熟悉它們的特性,在實際問題背景下靈活運用它們。本實驗訓練的要點是“棧”和“隊列”的觀點;二、實驗內容1) 利用棧,實現(xiàn)數(shù)制轉換。2) 利用棧,實現(xiàn)任一個表達式中的語法檢查(選做)。3) 編程實現(xiàn)隊列在兩種存儲結構中的基本操作(隊列的初始化、判隊列空、入隊列、出隊列三、實驗流程、操作步驟或核心代碼、算法片段順序棧:Status In

2、itStack(SqStack S)S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;Status DestoryStack(SqStack S)free(S.basereturn OK;Status ClearStack(SqStack S)S.top=S.base;return OK;Status StackEmpty(SqStack S)if(S.base=S.top)retu

3、rn OK;return ERROR;int StackLength(SqStack S)return S.top-S.base;Status GetTop(SqStack S,ElemType e)if(S.top-S.base=S.stacksize)S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType)if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;retur

4、n OK;Status Push(SqStack S,ElemType e)if(S.top-S.base=S.stacksize)S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType)if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;Status Pop(SqStack S,ElemType e)if(S.top=S.base)return ERR

5、OR;e=*-S.top;return OK;Status StackTraverse(SqStack S)ElemType *p;p=(ElemType *)malloc(sizeof(ElemType)if(!p) return ERROR;p=S.top;while(p!=S.base)/S.top上面一個.p-;printf(“%d ”,*preturn OK;Status Compare(SqStack S)int flag,TURE=OK,FALSE=ERROR;ElemType e,x;InitStack(Sflag=OK;printf(“請輸入要進?;虺鰲5脑兀骸眞hile(

6、x= getchar)!=#flag)switch (x)case (:case :case :if(Push(S,x)=OK)printf(“括號匹配成功!nn”break;case ):if(Pop(S,e)=ERROR | e!=()printf(“沒有滿足條件n”flag=FALSE;break;case :if ( Pop(S,e)=ERROR | e!=)flag=FALSE;break;case :if ( Pop(S,e)=ERROR | e!=)flag=FALSE;break;if (flag x=# StackEmpty(S)return OK;elsereturn ER

7、ROR;鏈隊列:Status InitQueue(LinkQueue Q)Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode)if (!Q.front) return ERROR;Q.front-next = NULL;return OK;Status DestoryQueue(LinkQueue Q)while(Q.front)Q.rear=Q.front-next;free(Q.frontQ.front=Q.rear;return OK;Status QueueEmpty(LinkQueue Q)if(Q.front-next=NULL)return

8、 OK;return ERROR;Status QueueLength(LinkQueue Q)int i=0;QueuePtr p,q;p=Q.front;while(p-next)i+;p=Q.front;q=p-next;p=q;return i;Status GetHead(LinkQueue Q,ElemType e)QueuePtr p;p=Q.front-next;if(!p)return ERROR;e=p-data;return e;Status ClearQueue(LinkQueue Q)QueuePtr p;while(Q.front-next )p=Q.front-n

9、ext;free(Q.frontQ.front=p;Q.front-next=NULL;Q.rear-next=NULL;return OK;Status EnQueue(LinkQueue Q,ElemType e)QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode)if(!p)return ERROR;p-data=e;p-next=NULL;Q.rear-next = p;Q.rear=p; /p-next 為空return OK;Status DeQueue(LinkQueue Q,ElemType e)QueuePtr p;if (Q.front

10、= Q.rear)return ERROR;p = Q.front-next;e = p-data;Q.front-next = p-next;if (Q.rear = p)Q.rear = Q.front; /只有一個元素時(不存在指向尾指針)free (preturn OK;Status QueueTraverse(LinkQueue Q)QueuePtr p,q;if( QueueEmpty(Q)=OK)printf(“這是一個空隊列!n”return ERROR;p=Q.front-next;while(p)q=p;printf(“%ddataq=p-next;p=q;return O

11、K;循環(huán)隊列:Status InitQueue(SqQueue Q)Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)if(!Q.base)exit(OWERFLOWQ.front=Q.rear=0;return OK;Status EnQueue(SqQueue Q,QElemType e)if(Q.rear+1)%MAXQSIZE=Q.front)return ERROR;Q.baseQ.rear=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;Status DeQueue(SqQueue Q,QElemT

12、ype e)if(Q.front=Q.rear)return ERROR;e=Q.baseQ.front;Q.front=(Q.front+1)%MAXQSIZE;return OK;int QueueLength(SqQueue Q)return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;Status DestoryQueue(SqQueue Q)free(Q.basereturn OK;Status QueueEmpty(SqQueue Q) /判空if(Q.front =Q.rear)return OK;return ERROR;Status QueueTrav

13、erse(SqQueue Q)if(Q.front=Q.rear)printf(“這是一個空隊列!”while(Q.front%MAXQSIZE!=Q.rear)printf(“%d- ”,Q.baseQ.frontQ.front+;return OK;數(shù)據(jù)結構實驗報告2一.實驗內容:實現(xiàn)哈夫曼編碼的生成算法。二.實驗目的:1、使學生熟練掌握哈夫曼樹的生成算法。2、熟練掌握哈夫曼編碼的方法。三.問題描述:已知n個字符在原文中出現(xiàn)的頻率,求它們的哈夫曼編碼。1、讀入n個字符,以及字符的權值,試建立一棵Huffman樹。2、根據(jù)生成的Huffman樹,求每個字符的Huffman編碼。并對給定的待編

14、碼字符序列進行編碼,并輸出。四.問題的實現(xiàn)(1)郝夫曼樹的存儲表示typedef structunsigned int weight;unsigned int parent,lchild,rchild;HTNode,*HuffmanTree; /動態(tài)分配數(shù)組存儲郝夫曼樹郝夫曼編碼的存儲表示typedef char* *HuffmanCode;/動態(tài)分配數(shù)組存儲郝夫曼編碼(2)主要的實現(xiàn)思路:a.首先定義郝夫曼樹的存儲形式,這里使用了數(shù)組b.用select遍歷n個字符,找出權值最小的兩個c.構造郝夫曼樹HT,并求出n個字符的郝夫曼編碼HC總結1.基本上沒有什么太大的問題,在調用select這個函

15、數(shù)時,想把權值最小的兩個結點的序號帶回HuffmanCoding,所以把那2個序號設置成了引用。2.在編程過程中,在什么時候分配內存,什么時候初始化花的時間比較長3.最后基本上實現(xiàn)后,發(fā)現(xiàn)結果仍然存在問題,經過分步調試,發(fā)現(xiàn)了特別低級的輸入錯誤。把HTi.weight=HTs1.weight+HTs2.weight;中的s2寫成了i附:/動態(tài)分配數(shù)組存儲郝夫曼樹typedef structint weight; /字符的權值int parent,lchild,rchild;HTNode,*HuffmanTree;/動態(tài)分配數(shù)組存儲郝夫曼編碼typedef char* *HuffmanCode;

16、/選擇n個(這里是k=n)節(jié)點中權值最小的兩個結點void Select(HuffmanTree HT,int k,int s1,int s2) int i;i=1;while(i=k HTi.parent!=0)i+;/下面選出權值最小的結點,用s1指向其序號s1=i;for(i=1;i=k;i+)if(HTi.parent=0HTi.weight/下面選出權值次小的結點,用s2指向其序號for(i=1;i=k;i+)if(HTi.parent=0i!=s1)break;s2=i;for(i=1;i=k;i+)if(HTi.parent=0i!=s1HTi.weight/構造Huffman樹

17、,求出n個字符的編碼void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int *w,int n)int m,c,f,s1,s2,i,start;char *cd;if(n=1)return;m=2*n-1; /n個葉子n-1個結點HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode) /0號單元未用,預分配m+1個單元HuffmanTree p=HT+1;w+; /w的號單元也沒有值,所以從號單元開始for(i=1;iweight=*w;p-parent=p-rchild=p-lchild=0;for(;iweigh

18、t=p-parent=p-rchild=p-lchild=0;for(i=n+1;i=m;i+)Select(HT,i-1,s1,s2 /選出當前權值最小的HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;/從葉子到根逆向求每個字符的郝夫曼編碼HC=(HuffmanCode)malloc(n+1)*sizeof(char*) /分配n個字符編碼的頭指針變量cd=(char*)malloc(n*sizeof(char) /分配求編碼的工作空間cdn-1=0;/編碼結束符for(i=1;i=n;i+) /逐個字符求郝夫曼編碼start=n-1; /編碼結束符位置for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) /從葉子到根逆向求編碼if(HTf.lchild=c)cd-start=0;elsecd-start=1;HCi=(char*)malloc(n-start)*si

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論