数据结构课程设计

这是我的数据结构的课程设计的报告,各位作一下参考!!!
一、   课程设计目
  本课程设计的目的是使学生掌握数据结构的基本概念和算法分析方法,以提高学生的编程能力和解决实际问题的能力。
 
二、   课程设计内容
设计一个程序,该程序具有下面功能:
(1) 能够选择合适的排序算法,如插入排序、归并排序或快速排序,依据该算法对某一数组进行排序,计算完成该操作所需时间。
(2)Huffman 编码和解码。
程序界面如下:
1 、主界面
------------------------------------------------------------------------
1. 排序
2. Huffman 编码和解码
3. 退出
请选择操作类型 (1—3)
------------------------------------------------------------------------
2 、排序界面
------------------------------------------------------------------------
1. 插入排序
2. 归并排序
3. 快速排序
4. 返回
5. 退出
请选择操作类型 (1—5)
------------------------------------------------------------------------
是否打印排序前数组 (Y/N)
是否打印排序后结果 (Y/N)
排序所花时间: ( 按任意键返回 )
3 、编码解码界面
请输入字符串:
编码结果为:
解码结果为: ( 按任意键返回 )
三、   课程设计要求
1 、课程设计的程序必须用 C/C++ 语言完成。
2 、关键算法必须画出流程图。
3 、要求写出软件分析和设计。分析部分包括功能需求和界面需求;设计部分包括算法的详细设计和数据结构(包括内存数据结构和文件结构)。
 
四、     需求分析和模块设计
1 、需求分析
   程序要完成两大功能:一为内排序,二为 Huffman 编码与解码。而其中的排序又由三种方法实现,一是插入排序;二是归并排序;三是快速排序。
2 、模块分解
   把程序分成六大模块,分别是主界面,排序界面,插入排序,归并排序,快速排序, Huffman 编码与解码。
3 、详细设计
注:这部分对每个函数的功能进行定义,方式如下:
函数名称: menu( )   编号: 001
函数功能:实现主界面
输入参数:无
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称: sort( )   编号: 002
函数功能:实现排序面
输入参数:无
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称: inssort( )   编号: 003   
函数功能:实现插入排序
输入参数:要排序数组地址,数组长度
输出参数:无
返回值:无
数据流程图
 
-------------------------------------------------------------------------------------------------------
 
函数名称: msort( )   编号: 004    
函数功能:实现归并排序
输入参数:要排序数组地址,临时数组地址,数组最左边位置,数组最右边位置,
输出参数:无
返回值:无
数据流程图 
  -------------------------------------------------------------------------------------------------------
函数名称: quicksort( )   编号: 005      
函数功能:实现快速排序
输入参数:要排序数组地址,数组最左边位置,数组最右边位置,
输出参数:无
返回值:无 
 
函数名称: huff( )   编号: 006
函数功能:实现 Huffman 编码与解码
输入参数:建树的字符个数,字符和它的权值
输出参数:无
返回值:无
4 、数据结构
   插入排序: L
   i=1   2   3  4   5   6   7
42 20 17 13 13 13 13 13
20 42 20 17 17 14 14 14
17 17 42 20 20 17 17 15
13 13 13 42 28 20 20 17
28 28 28 28 42 28 23 20
14 14 14 14 14 42 28 23
23 23 23 23 23 23 42 28
15 15 15 15 15 15 15 42
 
   快速排序:
72 6 57 88 60 42 83 73 48 85
            Pivot=60
 
48 6 57 42
60
88 83 73 72 85
Pivot=6              Pivot=73
 
6
42 57 48
 
72
73
85 88 83
Pivot=57             Pivot=88
 
42 48  
57
 
85 83
88
Pivot=42              Pivot=85
 
42
48
 
83
85
   
6 42 48 57 60 72 73 83 85 88
        最终排好序的数组
 
   归并排序:
    36 20 17 13 28 14 23 15
20 36
13 17
14 28
15 23
13 17 20 36
14 15 23 28
13 14 15 17 20 23 28 36
五、     计中碰到的问题及解决方法
程序的要求是要进行一个操作后要返回原界面或主界面,我用的是 switch 的结构,和老师给的有所不同,所以在处理这个问题时出了一点问题,但后来一想,也很简单,再调用一次原来的界面函数不就行了吗?
 
六、   收获和体会
           通过这次课程实践,我加深了对数据结构这门课程的理解,更好的掌握了各种排序方法和 Huffman 编码与解码!更巩固了自己的 C C++ 的知识。
 
七、   程序清单
主界面:
DS,cpp
 
#include "stdafx.h"
#include <iostream.h>
#include <iomanip.h>
void sort();// 声明要调用的函数
void huff();
void menu()
{
       int num;
       cout <<endl;
       cout <<setw(40) <<" 主界面 : " <<endl;
       cout <<setw(45) <<"1. 排序               " <<endl;
       cout <<setw(45) <<"2.Huffman 编码与解码 " <<endl;
       cout <<setw(45) <<"3. 退出               " <<endl;
       cout <<setw(45) <<" 请选择操作类型 (1-3):"; cin >>num;cout <<endl;
      
       switch(num)// 通过 swich 语句进行选择
       {
       case 1: sort();break;
    case 2: huff();break;
    case 3: break;
    default: cout <<"error";
       }
}
void main()
{
       menu();
}
 
排序界面:
Sort.cpp
 
#include "stdafx.h"
#include <iostream.h>
#include <iomanip.h>
void inssort();/ // 首先要声明各个要调用的函数 /
void menu();
void msort();
void qsort();
void sort() / 类似于主界面,也通过 switch 语句进行选择 /
{
       int num1;
       cout <<endl;
       cout <<setw(40) <<" 排序界面 :           " <<endl;
       cout <<setw(45) <<"1. 插入排序           " <<endl;
       cout <<setw(45) <<"2. 归并排序           " <<endl;
       cout <<setw(45) <<"3. 快速排序           " <<endl;
       cout <<setw(45) <<"4. 返回               " <<endl;
       cout <<setw(45) <<"5. 退出               " <<endl;
       cout <<setw(45) <<" 请选择操作类型 (1-5):";cin >>num1;cout <<endl;
       switch(num1)
       {
       case 1: inssort();break;
    case 2: msort();break;
    case 3: qsort();break;
       case 4: menu();break;
       case 5: break;
    default: cout <<"error";
       }
 
}
 
插入排序:
Inssort.cpp
 
#include "stdafx.h"
#include <iostream.h>
#include "stdio.h"
int time1=0;
int comp(int a,int b);// 比较
void swap(int a[],int x,int y); // 交换
void sort();// 排序界面
void inssort1(int A[],int n)// 进行插入排序
{
       for(int i=0;i<n;i++)
              for(int j=i;(j>0)&&(comp(A[j],A[j-1]));j--)
                     swap(A,j,j-1);
}
int comp(int a,int b)
{
       int result;
    if(a>b)
              result=1;
       else
              result=0;
       return result;
       time1++;
}
void swap(int a[],int x,int y)
{
       int temp;
       temp=a[x];
       a[x]=a[y];
       a[y]=temp;
       time1++;
}
void inssort()
{
       int n;
       int A[80],B[80];
    cout <<" 请输入你要输入的元素个数: " <<endl;
       cin >>n;
       cout <<" 请输入要排序的元素 :" <<endl;
       for(int i=0;i<n;i++)
       {
              cin >>A[i];
       }
       for(int j=0;j<n;j++)
       {
              B[j]=A[j];
       }
       cout <<" 进行排序后的结果 :" <<endl;
       inssort1(A,n);// 进行插入排序
       for(int k=0;k<n;k++)
       {
              cout <<A[k] <<" ";
       }
       cout <<endl;
       cout <<" 时间复杂度为: ";
       cout <<time1 <<endl;
       char answer;
       cout <<" 是否要打印排序前的数组 ?(y/n)" <<endl;
       cin >>answer;
       if(answer=='y')
       {
              for(int ii=0;ii<n;ii++)
                     cout <<B[ii] <<" ";
       }
       cout <<endl;
       getchar();
       sort();
}
 
归并排序:
Mergesort.cpp
 
#include "stdafx.h"
#include <iostream.h>
#include "stdio.h"
void inssort1(int A[],int n);
int time2=0;// 时间复杂度
extern int time1;
void sort();
void mergesort(int A[],int temp[],int left,int right)
{     if((right-left)<=32)
       {
              inssort1(&A[left],right-left+1);// 对于较小的数组,调用内排序
              return;
       }
       int i,j,k,mid=(left+right)/2;
       if(left==right) return;
       mergesort(A,temp,left,mid);
       mergesort(A,temp,mid+1,right);
       for(i=mid;i>=left;i--)
       {
              temp[i]=A[i];
              time2++;
       }
       for(j=1;j<right-mid;j++)
       {
              temp[right-j+1]=A[j+mid];
              time2++;
       }
       for(i=left,j=right,k=left;k<=right;k++)
       {
              if(temp[i]<=temp[j])
              {
                     A[k]=temp[i++];
                     time2++;
              }
              else
              {
                     A[k]=temp[j--];
                     time2++;
              }
       }
      
 
}
 
void msort()
{
       int n,left,right;
       int time;
       int A[80];
       int B[80];
       int temp[80];
    cout <<" 请输入元素个数: " <<endl;
           cin >>n;
       left=0;
       right=n-1;
       cout <<" 请输入数组元素 :" <<endl;
       for(int i=0;i<n;i++)
       {
              cin >>A[i];
       }
       for(int j=0;j<n;j++)
       {
              B[j]=A[j];
       }
       mergesort(A,temp,left,right);// 进行归并排序
       cout <<" 进行排序后的结果 :" <<endl;
       for(int k=0;k<n;k++)
       {
              cout <<A[k] <<" ";
       }
       cout <<endl;
       time=time1+time2;
       cout <<" 时间复杂度为: ";
       cout <<time <<endl;
       char answer;
       cout <<" 是否要打印排序前的数组 ?(y/n)" <<endl;
       cin >>answer;
       if(answer=='y')
       {
              for(int ii=0;ii<n;ii++)
                     cout <<B[ii] <<" ";
       }
       cout <<endl;
       getchar();
       sort();
}
 
快速排序:
Quicksort.cpp
 
#include "stdafx.h"
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
void sort();
int time3=0;
int pation(int A[],int x,int y);
void quicksort(int A[], int x, int y)
{
    if(x>=y) return;
    int q=pation(A, x, y);
    quicksort(A, x, q-1);
    quicksort(A, q+1, y);
}
 
int pation(int A[], int x, int y)
{
    int n=A[x], i=x+1, j=y, temp;
    while(1)
    {
        while(A[i]<n)
              {
                     ++i;
                     time3++;
              }
              while(A[j]>n)
              {
                     --j;
                     time3++;
              }
              if(i>=j) break;
        temp=A[i]; A[i]=A[j]; A[j]=temp;
              time3++;
    }
    A[x]=A[j];
    A[j]=n;
    return j;
}
 
void qsort( )
{
    int i, A[80],n,B[80];
       char answer;
       cout <<" 请输入元素个数 :";
       cin >>n;
       cout <<" 请输入要排序的元素 :" <<endl;
    for(i=0; i<n; ++i)
        cin >>A[i];
       for(int j=0;j<n;j++)
              B[j]=A[j];
    quicksort(A, 0, n-1);
       cout <<" 排序后的结果为 :" <<endl;
    for(i=0; i<n; ++i)
        cout <<A[i] <<" ";
    cout <<endl;
    cout <<" 时间复杂度为 :" <<time3 <<endl;
       cout <<" 是否打印排序前的数组 ?(y/n)";
       cin >>answer;
       if(answer=='y')
       {
              for(int k=0;k<n;k++)
              {
                     cout <<B[k] <<" ";
              }
       }
    cout <<endl;
       getchar();
       sort();
      
}
 
Huffman 编码:
Huff.cpp
#include "stdafx.h"
#include <iostream.h>
#include "stdio.h"
#include "string.h"
#define MAX 99
char cha[MAX];
char hc[MAX-1][MAX];
int s1,s2; // 设置全局变量,以便在方法 ( 函数 )select 中返回两个变量
void menu();
typedef struct //huffman 树存储结构
{
 unsigned int wei;
 int lch,rch,parent;
}hufftree;
 
 
void select(hufftree tree[],int k) // 找寻 parent 0, 权最小的两个节点
{
 int i;
 for (i=1;i<=k && tree[i].parent!=0 ;i++); s1=i;
 for (i=1;i<=k;i++)
    if (tree[i].parent==0 && tree[i].wei<tree[s1].wei) s1=i;
 for (i=1; i<=k ; i++)
    if (tree[i].parent==0 && i!=s1) break; s2=i;
 for (i=1;i<=k;i++)
    if ( tree[i].parent==0 && i!=s1 && tree[i].wei<tree[s2].wei) s2=i;
}
 
void huffman(hufftree tree[],int *w,int n) // 生成 huffman
{ int m,i;
   if (n<=1) return;
   m=2*n-1;
 for (i=1;i<=n;i++)
   {
        tree[i].wei=w[i];
        tree[i].parent=0;
      tree[i].lch=0;
        tree[i].rch=0;
 }
 for (i=n+1;i<=m;i++)
   {
        tree[i].wei=0;
        tree[i].parent=0;
      tree[i].lch=0;
        tree[i].rch=0;
 }
   for (i=n+1;i<=m;i++)
   {
          select(tree, i-1);
       tree[s1].parent=i;
       tree[s2].parent=i;
       tree[i].lch=s1;
       tree[i].rch=s2;    
       tree[i].wei=tree[s1]. wei+ tree[s2].wei;
      }
}
void huffmancode(hufftree tree[],char code[],int n)
{
 int start,c,i,f;
 code[n-1]='/0';
 cout <<"Huffman 编码 :" <<endl;
 for(i=1;i<=n;i++)
 {
        start=n-1;
       for(c=i,f=tree[i].parent;f!=0;c=f,f=tree[f].parent)
       {  
               if(tree[f].lch==c)       
                      code[--start]='0';    
               else            
                      code[--start]='1';
        }
     strcpy(hc[i],&code[start]);
     cout <<cha[i] <<"-->" <<hc[i] <<endl;
 }
}
void tohuffmancode(int n)
{
   int i=0,j;
   char anychar[9999];
   cout <<" 请输入一段字符 :" <<endl;
   cin >>anychar;
   cout <<" 进行 Huffman 编码后的结果为 :" <<endl;
   for (;anychar[i]!='/0';i++)
   {
      j=0;
      for(;anychar[i]!=cha[j]&&j<=n;)
               j++;
      if (j<=n)
               cout <<hc[j];
   }
   cout <<endl;
}
 
void decode(char ch[],hufftree tree[],int n)
{
 int i,j,m;
 char b;
 m=2*n-1;
 i=m;
 cout <<" 请输入你要解码的编码 :" <<endl;
 cin >>b;
 cout <<" 解码结果为 :" <<endl;
 while(b!='#')   // 遇到回车时,结束
 {
 
 if(b=='0')
        i=tree[i].lch;
 else
        i=tree[i].rch;
 if(tree[i].lch==0)
 {
        cout <<ch[i];
      j=i,i=m;
 }
 cin >>b;
 }
 if(tree[j].lch!=0)
    cout <<" 发生错误 !!";
}
 
void huff()
{
 int i=0,n=0;
 int *w,wei[MAX];
 char code[MAX];
 hufftree tree[MAX];
 w=wei;
 cout <<" 请输入 n(n 为你要建树的字符个数 ):" <<endl;
 cin >>n;
 cout <<" 请输入字符和它的权值 ( 例如 :a20):" <<endl;
 for(i=1;i<=n;i++)
 {
        cin >>cha[i] >>wei[i];
 }
 huffman(tree,w,n);   // 生成 huffman
 huffmancode(tree,code,n); // 编码 A
 tohuffmancode(n);// 编码 B
 decode(cha,tree,n); // 译码
 cout <<" 按任意键返回 ";
 getchar();
 menu();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值