報告彙總之c語言數據結構報告篇(三)基於二叉樹的家譜系統

報告彙總之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語音需要有很大的耐心與毅力,對我們的身體的腦力都是一項很大的挑戰。敲了快整整一 周的代碼,雖然很累,很煩瑣,偶爾還會 被題目難倒,壓力山大。可當自己將題目一題一題的解決時,心中更多的是成就感,多了一分慰藉。在接下來的日子裏,要更加努力好好學專業基礎,穩固提升。在課餘時間更加註重勞逸結合,多運動,多鍛鍊,這樣學習更有效率。希望在以後的學習中能夠更進一步掌握這些內容。

發佈了11 篇原創文章 · 獲贊 9 · 訪問量 3311
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章