数据结构 实验报告06

一、实验目的和要求

设计并实现杨辉三角形输出。

二、实验环境

编译器:Vscode DevC++

系统:Windows10

CPU:i5-8265U@1.60GHz

 

三、实验内容

基于课后作业04内容,存储结构采用链式存储。基于链队列,尽量少的改动课后作业-04代码,完成杨辉三角形输出。要求抽象出链队列结构进行独立实现(建议直接利用 课堂作业-04代码)。 

四、实验过程

4.1 任务定义和问题分析

        构建功能完备的链队列 能够实现入队、出队、返回队头值、判空、判满等功能。

        仅需要在之前的队列类文件中修改即可

4.2 数据结构的选择和概要设计

链队列:

先构造了一个模板结构体

template <typename DataType>

struct node

{

    DataType data;

    node *next;

    node *last;

};

这里虽然设置的是双端队列的样式 但并没有怎么体现双端队列的优势

即可看作简单的单向队列 毕竟要实现的只有一个方向的入队 出队;

enum E_code

{

    success,

    underflow,

    overflow

};

 

4.3 详细设计

int count;

node<DataType> *front, *rear;

 

初始化时要将指针指向NULL  清空计数器

front = NULL;

rear = NULL;

count = 0;

判空操作 只需要检测计数器是否为0

 

判满操作 一直返回非满即可

 

接下来实现 返回队头 队尾(因为之前类似双端队列的设置可以实现返回对胃元素)

根据计数器是否为零(判空操作)来判断队列是否为空  

如果空 就输出提示语:the queue is empty 并结束操作 return underflow

如果非空  就利用front和rear进行数据的读取(这里 front和rear直接可以存储数据 没有绕到下一个进行存储)

 

入队操作:由于有两个指针变量 所以在队列不为空情况下的进队 我对rear进行了特殊化处理 (由于front和rear可以直接存储数据)同理 在队列为空时对front进行了特殊化处理

 

出队操作:首先对队列的计数器进行了判断  

如果空  则输出the queue is empty   it can't pop 并return underflow

否则就进行常规清楚队头结点

 

析构操作:为了对间接访问区进行delete  遍历整个队列

 

完成以上功能之后 将头文件进行更新即可

五、测试及结果分析

5.1 实验数据

10以下的数据:5 & 8

20以下的数据:13&17

20以上的数据:22

5.2 结果及分析

 

 

 

 

 

由于沿用的还是上一次的main函数 所以对于数据还是有限制

不过能在20以内有着很好的适用

六、实验收获

再次熟悉了链队列的操作

七、参考文献

八、附录(源代码)

yhsj.cpp

// #include"My_Queue_first.h"

#include "My_Queue_second.h"

#include<cstdio>

// Queue<int> q(101);

Queue<int>q;

int n;

void init()

{

    q.InsertQueue(0);

    q.InsertQueue(1);

    q.InsertQueue(0);

}

 

void work(int x)

{

    int l = 0, r = 0;

    q.InsertQueue(0);

    q.PopTop(r);

    // r = q.PopTop();

    for (int i = 1; i <= x; i++)

    {

        l = r;

        q.PopTop(r);

        // r = q.PopTop();

        if (i == 1 && x == n)

            printf("%3d", r);

        else

            printf("%6d", r);

        q.InsertQueue(r + l);

    }

    cout << "\n";

    l = r;

    q.PopTop(r);

    // r = q.PopTop();

    q.InsertQueue(l + r);

    q.InsertQueue(0);

}

void kprint(int numint x)

{

    if (num == x)

        return;

    int len = (num - x - 1) * 3;

    for (int i = 1; i <= len; i++)

    {

        cout << " ";

    }

}

int main()

{

    init();

    cin >> n;

    for (int i = 1; i <= n; i++)

    {

        kprint(n, i);

        work(i);

    }

    system("pause");

}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是数据结构二叉树的实验报告。 一、实验目的 1. 了解二叉树的概念、性质和基本操作; 2. 掌握二叉树的遍历算法; 3. 实现二叉树的建立、遍历和查找等基本操作。 二、实验原理 二叉树是一种树形结构,它的每个节点最多有两个子节点。二叉树的性质如下: 1. 每个节点最多有两个子节点,分别称为左子节点和右子节点; 2. 左子树和右子树都是二叉树; 3. 空树也是一棵二叉树。 二叉树的遍历有三种方式: 1. 先序遍历:先访问根节点,然后遍历左子树,最后遍历右子树; 2. 中序遍历:先遍历左子树,然后访问根节点,最后遍历右子树; 3. 后序遍历:先遍历左子树,然后遍历右子树,最后访问根节点。 三、实验步骤 本次实验我们将实现二叉树的建立、遍历和查找等基本操作。 1. 定义二叉树结构体。 ```c typedef struct Node { int data; struct Node *left; struct Node *right; } Node, *pNode; ``` 2. 实现二叉树的创建函数。 ```c pNode createTree() { int data; scanf("%d", &data); if(data == -1) { return NULL; } else { pNode node = (pNode)malloc(sizeof(Node)); node->data = data; node->left = createTree(); node->right = createTree(); return node; } } ``` 3. 实现二叉树的先序遍历函数。 ```c void preOrder(pNode node) { if(node != NULL) { printf("%d ", node->data); preOrder(node->left); preOrder(node->right); } } ``` 4. 实现二叉树的中序遍历函数。 ```c void inOrder(pNode node) { if(node != NULL) { inOrder(node->left); printf("%d ", node->data); inOrder(node->right); } } ``` 5. 实现二叉树的后序遍历函数。 ```c void postOrder(pNode node) { if(node != NULL) { postOrder(node->left); postOrder(node->right); printf("%d ", node->data); } } ``` 6. 实现二叉树的查找函数。 ```c pNode search(pNode node, int data) { if(node == NULL) { return NULL; } else if(node->data == data) { return node; } else if(node->data > data) { return search(node->left, data); } else { return search(node->right, data); } } ``` 7. 编写主函数进行测试。 ```c int main() { pNode root = createTree(); printf("先序遍历结果:"); preOrder(root); printf("\n中序遍历结果:"); inOrder(root); printf("\n后序遍历结果:"); postOrder(root); printf("\n请输入要查找的节点值:"); int data; scanf("%d", &data); pNode node = search(root, data); if(node == NULL) { printf("未找到该节点!"); } else { printf("已找到该节点,节点值为:%d", node->data); } return 0; } ``` 四、实验结果 经过测试,程序能够正确地实现二叉树的建立、遍历和查找等基本操作。 五、实验总结 通过本次实验,我们深入理解了二叉树的概念、性质和基本操作,并实现了二叉树的建立、遍历和查找等基本操作。同时,也加深了对指针和动态内存分配的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值