数据结构课程设计实验报告
《算法與數據結構》課程設計報告? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
數據結構課程設計是在學完數據結構課程之后的實踐教學環節。本實踐教學是培養學生數據抽象能力,進行復雜程序設計的訓練過程。要求學生能對所涉及問題選擇合適的數據結構、存儲結構及算法,并編寫出結構清楚且正確易讀的程序,提高程序設計基本技能和技巧。
一.設計目的
1.提高數據抽象能力。根據實際問題,能利用數據結構理論課中所學到的知識選擇合適的邏輯結構以及存儲結構,并設計出有效解決問題的算法。
2.提高程序設計和調試能力。學生通過上機練習,驗證自己設計的算法的正確性。學會有效利用基本調試方法,迅速找出程序代碼中的錯誤并且修改。
3.初步了解開發過程中問題分析、整體設計、程序編碼、測試等基本方法和技能。
二.設計方案
設計方案如下:
1.? 單鏈表的基本操作及應用
首先用InitList_L()函數初始化線性表,構造一個空表,再使用CreateList_L( )函數創建一個想要的線性表。剩余的基本操作ListInsert_L( )插入,ListDelete_L( )刪除,LocateElem_L( )查找,即可相應完成。
2.? 棧的基本操作及應用
同線性表,首先用InitStack(STACK&S)初始化,構造一個空棧,再使用Push(STACK&S, ElemType e)向棧內壓入元素,出棧則使用Pop(STACK &S, ElemType &e),取出棧內元素,用函數GetTop(STACK S, ElemType &e)獲取棧頂元素。
3.? 數組的基本操作及應用
利用函數CreateSMatrix(TSMatrix&M)創建一個稀疏矩陣,則需要一個數組Triple data[MAXSIZE+1]記錄非零元素的行序、列序和數值。再將三元數組中元素的行序和列序和矩陣的行序和列序作比較,不相等的矩陣元素則為零,相等則為稀疏因子的值。再利用函數PrintSMatrix(TSMatrix M)輸出稀疏矩陣。
4.? 二叉樹的基本操作及應用
首先使用函數CreateBiTree(BiTree&T)遞歸創建二叉樹的左子樹和右子樹,隨后利用函數PreOrder(T)、InOrder(T)和PostOrder(T)遞歸先序、中序和后序遍歷二叉樹的值,再函數Visit(BiTree T)輸出二叉樹節點的值。計算二叉樹的深度,比較二叉樹節點左子樹和右子樹的孩子都為空的時候的記錄的值大,即為樹的深度。計算二叉樹葉子節點的個數,當節點的左右孩子都為空的時候,節點為葉子,則可以使用計數,當節點左右孩子為空,計數加1,知道計算所有的樹,總和為葉子的個數。求赫夫曼編碼,各字符的編碼長度不等,所以按實際長度動態分配空間,從葉子到根逆向處理求得各個葉子節點所表示的字符的赫夫曼編碼。
5.? 圖的基本操作及應用
利用鄰接矩陣表示法構造圖,網則要記錄權值,構造鄰接矩陣arcs存儲圖。訪問初始點Vi,并標志其已被訪問。此時定義一指向邊結點的指針p,并建立一個while()循環,以指針所指對象不為空為控制條件,當Vi的鄰接點未被訪問時,遞歸調用深度優先遍歷函數訪問之。然后將p指針指向下一個邊結點。求有向圖的拓撲排序,在頭結點中增加一個存放頂點入度的數組(indegree)。入度為零的頂點即為沒有前驅的頂點,刪除頂點及以它為尾的弧的操作,即可換為弧頭頂點的入度減1來實現。
?
三.設計流程圖
??????
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
四.實現代碼(部分)
第一步:設計主菜單。
void main(){
int n;
do{
ShowMainMenu();
printf("請選擇:");
scanf("%d",&n);
switch(n){
case 1:LinkList();break;
case 2:Stack();break;
case 3:Array();break;
case 4:BiTree();break;
case 5:Graph();break;
case 6:break;
default:printf("ERROR!");break;
}
}while(n!=6);
}
void ShowMainMenu() {
?????? printf("\n");
?????? printf("*******************算法與數據結構******************\n");
?????? printf("* 1? 單鏈表的基本操作及應用??????????????????????*\n");
?????? printf("* 2? 棧的基本操作及應用??????????????????????????*\n");
?????? printf("* 3? 數組的基本操作及應用????????????????????????*\n");
?????? printf("* 4? 樹的基本操作及應用? ?????????????????????????*\n");
?????? printf("* 5? 圖的基本操作及應用??????????????????????????*\n");
?????? printf("* 6? 退出????????????????????????????????????????*\n");
?????? printf("***************************************************\n");
}
第二步:添加功能函數。
在程序合適的位置添加相應的函數實現各功能模塊。
1、在語句printf("* 1? 單鏈表的基本操作及應用?? *\n”)添加實現單鏈表操作的函數。
StatusCreateList_L(LinkList&L, int n)//創建線性表
{
??? InitList_L(L);
??? int i;
??? cout << "輸入要插入的鏈表個數:";
cin >> n;
? ? ElemTypee;
??? for (i = 1; i <= n; i++)
??? {
?????????? cin >> e;
????????????? ListInsert_L(L,i, e);
?????? }
? return OK;
}
?
2、在語句printf("* 2? 棧的基本操作及應用???? *\n");添加實現?;静僮鞯暮瘮?#xff1a;
void Push(STACK&S, ElemType e) ?//壓棧
{
? ???? SLinkList p;
???? p =(SLinkList)malloc(sizeof(LNode));
? ? ? if (!p) exit(OVERFLOW);
?????? p->data = e;
?????? p->next = S.top;
?????? S.top = p;
}
3、稀疏矩陣
StatusCreateSMatrix(TSMatrix&M)
{
? cout << "請輸入稀疏矩陣的行數、列數和非零元個數:" <<endl;
? cin >> M.mu;
? cin >> M.nu;
? cin >> M.tu;
? for (int i = 1; i <= M.tu; i++)
? {
?????? cout << "請按行序輸入非零元素的值、行標和列標:" <<endl;
?????? cin >> M.data[i].e;
?????? cin >> M.data[i].i;
?????? cin >> M.data[i].j;
? }
? return OK;
}
4、二叉樹
intCreateBiTree(BiTree &T) {
? char data;
? //按次序輸入二叉樹中結點的值(一個字符),‘#’表示空樹?
? cin >> data;
? if (data == '#') {
??? T = NULL;
? }
? else {
??? if (!(T =(BiTNode*)malloc(sizeof(BiTNode))))
?????????? exit(OVERFLOW);
??? //生成根結點?
??? T->data = data;
?????? //構造左子樹?
?????? CreateBiTree(T->lchild);
?????? //構造右子樹?
?????? CreateBiTree(T->rchild);
? }
? return 0;
}
5、圖的基本操作
Status CreateUDG(ALGraph&G)???????? //構造無向圖
{
?????? G.kind =1;
?????? cout<< "請輸入無向圖的頂點數和邊數:" << endl;
?????? cin>> G.vernum >> G.arcnum;
?????? int i, e;
?????? cout<< "輸入每個頂點的值:" << endl;
?????? for (i =1; i <= G.vernum; i++)
?????? {
????????????? cin>> e;
????????????? G.vertices[i- 1].data = e;
????????????? G.vertices[i- 1].firstarc = 0;
?????? }
?????? int v1,v2;
?????? for (i =0; i < G.arcnum; i++)
?????? {
????????????? cout<< "請輸入第" << i << "條弧所關聯的兩個點的位置:" << endl;
????????????? cin>> v1 >> v2;
????????????? ArcNode*q= (ArcNode*)malloc(sizeof(ArcNode));
????????????? q->adjvex= v2 - 1;
????????????? q->nextarc= G.vertices[v1 - 1].firstarc;
????????????? G.vertices[v1- 1].firstarc = q;
????????????? q =(ArcNode*)malloc(sizeof(ArcNode));
????????????? q->adjvex= v1 - 1;
????????????? q->nextarc= G.vertices[v2 - 1].firstarc;
????????????? G.vertices[v2- 1].firstarc = q;
?????? }
?
?????? return OK;
}
五.實現結果
展示二叉樹部分運行結果:
1、創建二叉樹ABC##DE#G##F###
2、? 計算樹的深度
?
?
3、遍歷二叉樹
?
4、赫夫曼編碼
?
?
?
?
六.心得總結
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
指導老師意見:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
成績:???????????? ?????????????????教師簽名:???????????? ?
?
年??? 月??? 日
?
?
總結
以上是生活随笔為你收集整理的数据结构课程设计实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [html] iOS下页面如何启动加载
- 下一篇: 插图 引用 同一行两个插图_为什么插图是