数据结构 实验报告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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值