報告彙總之c語言數據結構報告篇(三)
家譜的查找
代碼區
#include <stdio.h>
#include <stdlib.h>
//創建一個二叉鏈
typedef struct node
{
char data;
struct node* lchild;
struct node* rchild;
}tn;
//獲取二叉樹結構
void get (char s[100])
{
printf("請以括號表達法輸入二叉樹結構:");
scanf("%s",s);
}
//構建二叉樹
tn* CreatBTnode (tn*b,char s[100])
{
tn*st[100],*p;
b=NULL;
int top=-1,j=0,k=0;
while (s[j]!='\0')
{
if (s[j]=='(')
{
top++;
st[top]=p;
k=1;
}
else if (s[j]==')')
{
top--;
}
else if (s[j]==',')
{
k=2;
}
else
{
p=(tn*)malloc(sizeof(tn));
p->data=s[j];
p->rchild=p->lchild=NULL;
if (b==NULL)
b=p;
else if (k==1)
st[top]->lchild=p;
else
st[top]->rchild=p;
}
j++;
}
return b;
}
//後序遞歸遍歷二叉樹
void PostOrder (tn*b)
{
if (b!=NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c",b->data);
}
}
//先序非遞歸遍歷二叉樹
void PreOrder (tn*b)
{
printf("先序遍歷非遞歸算法輸出:");
tn*a[100],*p;
int i=-1;
if (b!=NULL)
{
i++;
a[i]=b;
while (i>-1)
{
p=a[i];
i--;
printf("%c",p->data);
if (p->rchild!=NULL)
{
i++;
a[i]=p->rchild;
}
if (p->lchild!=NULL)
{
i++;
a[i]=p->lchild;
}
}
printf("\n");
}
}
//查找所有長輩
void findfather (tn*b)
{
getchar();
printf("請輸入指定人物代號,以查詢其所有長輩:");
char c;
scanf("%c",&c);
printf("%c的所有長輩爲:",c);
tn*a[100],*p;
if (b!=NULL)
{
int i=0;
a[i]=b;
p=b;
while (p->data!=c)
{
i++;
a[i]=p->lchild;
p=a[i];
if (p->lchild==NULL&&p->data!=c)
{
printf("您輸入的指令有誤\n");
break;
}
}
i=i-1;
while (i>=0)
{
p=a[i];
printf("%c",p->data);
while (p->rchild!=NULL)
{
p=p->rchild;
printf("%c",p->data);
}
i--;
}
}
printf("\n");
}
int main()
{
tn*b;
b=(tn*)malloc(sizeof(tn));
char s[100];
get(s);
b=CreatBTnode(b, s);
PreOrder(b);
printf("後序遍歷遞歸算法輸出:");
PostOrder(b);
printf("\n");
findfather(b);
return 0;
}
報告區
第一部分:實驗分析與設計(可加頁)
一、 實驗內容描述(問題域描述)
採用一棵二叉樹來表示一個家譜關係,一個家譜可表示爲一顆樹,首先將其轉換成一顆二叉樹表示,如下圖爲紅樓夢家譜的一部分:
圖1.1 家譜的樹形表示 圖1.2 家譜的二叉樹表示
要求完成的功能如下:
(1) 輸入一顆二叉樹的括號表示法,完成樹的構建
(2) 使用後序遍歷遞歸算法遍歷二叉樹並輸出
(3) 使用先序遍歷非遞歸算法遍歷二叉樹並輸出
(4) 指定家譜中的某一成員,輸出其所有長輩
二、 實驗基本原理與設計(數據結構設計與算法設計)
數據結構設計:利用鏈式結構存儲樹的信息;利用棧輔助創建二叉樹
算法設計:
輸入一顆二叉樹的括號表示法,完成樹的構建
(1):創建二叉樹的時候碰到‘(’就指向左子樹;碰到‘,’就指向右子樹。
(2):再將數據輸入到指定的樹中;循環操作完成二叉樹的創建
使用後序遍歷遞歸算法遍歷二叉樹並輸出
(1):利用遞歸先後序遍歷根的左子樹
(2):利用遞歸再後序遍歷根的右子樹
(3):將遍歷出的結果依次輸出
使用先序遍歷非遞歸算法遍歷二叉樹並輸出
(1):在非遞歸遍歷的時候需要先創建一個棧來輔助運算
(2):將根節點進棧
(3):將棧頂元素出棧並用p指向該元素
(4):將p指向的元素的右子樹壓入棧中;將棧頂元素的左子樹壓於棧中
(5):重複(3)(4)步直到棧爲空
指定家譜中的某一成員,輸出其所有長輩
(1):通過遍歷查找到該成員,並將查找過程中經過的元素壓入輔助棧中
(2):將棧中的元素及其右子樹全部輸出
三、主要儀器設備及耗材
1.PC機
2.開發環境(比如:VC,Eclipse)
X-code
第二部分:實驗調試與結果分析(可加頁)
一、 調試過程(包括調試方法描述、實驗數據記錄,實驗現象記錄,實驗過程發現的問題等)
1.調試方法描述
① 輸入c程序,並保存;
② 編譯c程序,找出程序的語法錯誤並改正;
③ 輸入測試數據,運行c程序;
④ 若有錯利用斷點一步步運行查錯
⑤ 重複②-④步,直到得到正確的運行結果。
2.實驗輸入/輸出數據記錄
3.實驗過程發現的問題
在先序非遞歸遍歷的過程中;如果先將左子樹壓入棧中結果會完全不同;後來經過分析問題;發現要好好利用棧的存儲特性解決問題,這樣讓問題變得更加簡單;
在查找指定孩子的所有長輩的時候我覺得還是有一些bug;改進過後bug變少;但是我覺得還是存在一些,對其進行測試暫時未發現問題;
在使用指針時要注意越界的情況;
二、 實驗結果及分析(包括結果描述、實驗現象分析、影響因素討論、綜合分析和結論等)
1.結果描述
建立二叉樹,遍歷二叉樹,查找二叉樹的過程均正確;結果準確
2.實驗現象分析
可以通過遍歷兩次來完成對指定元素的查找,第一次遍歷對整個二叉樹進行賦值操作和查找指定元素,第二次遍歷進行比較和輸出,通過利用棧來比較輩分的大小
3.影響因素討論
二叉樹的結構的定義會影響輸出結果;可能會讓輸出長輩的代碼出現bug
4.算法分析(包括時間和空間)
T(n)=O(n2)
S(n)=O(n)
5.結論
滿足題目所要求的所有要求,輸出結果均正確
三、 實驗小結、建議及體會
這一次的實驗涉及到二叉樹的運用並且混合棧的基本操作,讓我對兩個數據結構的知識有了更進一步的理解,這次實驗我熟悉了很多樹和棧的基本知識,學到了很多。學習C語音需要有很大的耐心與毅力,對我們的身體的腦力都是一項很大的挑戰。敲了快整整一 周的代碼,雖然很累,很煩瑣,偶爾還會 被題目難倒,壓力山大。可當自己將題目一題一題的解決時,心中更多的是成就感,多了一分慰藉。在接下來的日子裏,要更加努力好好學專業基礎,穩固提升。在課餘時間更加註重勞逸結合,多運動,多鍛鍊,這樣學習更有效率。希望在以後的學習中能夠更進一步掌握這些內容。