数据结构(实验一)

第一次写报告,虽然有点简单,但还是要勉励自己再接再厉。加油

 继续努力。

1.实验目的(结出本次实验所涉及并要求掌握的知识点)

1.掌握顺序表的存储结构形式及描述方法和基本运算的实现;

2.掌握用顺序表设计合理的数据结构,编写有关运算的算法。

2.实验内容(结出实验内容具体描述)

1.编写算法函数reverse(sque* l),实现顺序表的倒置;

2.编写算法函数spirt(sque *l1,sque* l2,sque* l3),将顺序表l1中的数据分类,奇数放在l2中,偶数放在l3中;

3.已知顺序表l1,l2均由从下到大排好序,请用尽可能快的方法将l1,l2中的数据合并到l3中,使数据在l3中按升序排列,编写函数merge(sque *l1,sque* l2,sque* l3 ).

4.假设顺序表la和lb分别存放在两个整数集合,编写函数inter(sque *l1,sque* l2,sque* l3)将l1,l2的交集存放到l3中.

5.编写函数partion(sque* l),尽可能快的将顺序表*l中的奇数调整到表的左边,偶数在右边,并分析算法的时间复杂度.

3.算法描述及实验步骤(用适当的形式表达算法设计思想与算法实现步骤)

#include <iostream>

#include <cstdio>

#define maxsize 100

using namespace std;

typedef int datatype;

typedef struct

{

    datatype a[maxsize];

    int size;

} sque;



void init(sque *st)

{

    st->size = 0;

}



void input(sque *st)

{

    init(st);

    datatype x;

    cout << "输入一组数据,最多100个数,以0位结束符" << endl;

    cin >> x;

    while (x)

    {

        st->a[st->size++] = x;

        cin >> x;

    }

}



void output(sque *st)

{

    for (int i = 0; i < st->size; i++)

    {

        cout << st->a[i] << ' ';

        if ((i + 1) % 10 == 0)

            cout << endl;

    }

    cout << endl;

}



void reverse(sque *st)//采用以中间为界首尾交换,依次向中间靠拢的思想

{

    int temp = st->size;

    for (int i = 0; i < (st->size) / 2; i++)

        swap(st->a[i], st->a[--temp]);

}



void sprit(sque *l1, sque *l2, sque *l3)//采用从头到尾直接遍历判断并分类的思想

{

    init(l2);

    init(l3);

    for (int i = 0; i < l1->size; i++)

    {

        if ((l1->a[i]) % 2 == 1)

            l2->a[l2->size++] = l1->a[i];

        else

            l3->a[l3->size++] = l1->a[i];

    }

}



void merge(sque *l1, sque *l2, sque *l3)//采用两顺序表从头开始比较大小小的进新表并进入下一个位置,大的不变,一表读完另一表直接进新表.





{

    init(l3);

    for (int i = 0, j = 0; i < l1->size || j < l2->size;)

    {

        if (l1->size != i && l2->size != j)

        {

            if (l1->a[i] < l2->a[j])

                l3->a[l3->size++] = l1->a[i++];

            else if (l1->a[i] > l2->a[j])

                l3->a[l3->size++] = l2->a[j++];

            else

            {

                l3->a[l3->size++] = l1->a[i++];

                l3->a[l3->size++] = l2->a[j++];

            }

        }

        if (l1->size == i)

            l3->a[l3->size++] = l2->a[j++];

        else if (l2->size == j)

            l3->a[l3->size++] = l1->a[i++];

    }

}



void inter(sque *l1, sque *l2, sque *l3)//二重循环依次寻找相同的数,找到后判断新表中是否有这个数,没有则存入这个数

{

    init(l3);

    for (int i = 0; i < l1->size; i++)

        for (int j = 0; j < l2->size; j++)

            if (l1->a[i] == l2->a[j])

            {

                int flag = 1;

                for (int k = 0; k < l3->size; k++)

                    if (l3->a[k] == l1->a[i])

                    {

                        flag = 0;

                        break;

                    }

                if (flag == 1)

                    l3->a[l3->size++] = l1->a[i];

            }

}



void partion(sque *l)

{

for (int i = 0, j = l->size - 1; i < j;)//从两端开始判断首为偶数,尾为奇数则交换,其余视情况做相应加减.

//时间复杂度为O(n);

    {

        if ((l->a[i]) % 2 == 1)

        {

            if ((l->a[j]) % 2 == 0)

                j--;

            i++;

        }

        else if ((l->a[i]) % 2 == 0)

        {

            if ((l->a[j]) % 2 == 1)

                swap(l->a[i++], l->a[j]);

            j--;

        }

    }

}



int main()

{

    // sque l;

    // input(&l);

    // output(&l);

    // reverse(&l);

    // output(&l);



    // sque l1, l2, l3;

    // input(&l1);

    // sprit(&l1, &l2, &l3);

    // output(&l1);

    // output(&l2);

    // output(&l3);



    // sque l1, l2, l3;

    // input(&l1);

    // input(&l2);

    // merge(&l1, &l2, &l3);

    // output(&l3);



    // sque l1, l2, l3;

    // input(&l1);

    // input(&l2);

    // inter(&l1, &l2, &l3);

    // output(&l3);



    // sque l;

    // input(&l);

    // partion(&l);

    // output(&l);



    system("pause");

    return 0;

}

  1. 调试过程及运行结果(详细记录在调试过程中出现的问题及解决方法。记录实验执行的结果)
  1.  样例1 输入1 2 3 4 5 6 0 输出6 5 4 3 2 1 正确

样例2 输入1 3 4 9 6 5 0 输出5 6 9 4 3 1 正确

  1.  样例1 输入1 2 3 4 5 6 0 输出1 3 5

2 4 6正确

样例2 输入1 3 5 7 10 6 0 输出1 3 5 7

10 6 正确

  1.  样例1 输入1 2 3 0 4 5 6 0 输出1 2 3 4 5 6 正确

样例2 输入1 5 9 0 3 7 8 0 输出1 3 5 7 8 9 正确

  1.  样例1 输入1 2 3 0 4 5 3 0 输出3 正确

样例2 输入5 6 9 0 4 5 6 0 输出5 6 正确

  1.  样例1 输入1 2 3 4 5 6 0 输出1 5 3 4 2 6 正确

样例2 输入5 6 8 9 7 10 5 6 0 输出5 5 7 9 8 10 6 6 正确

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辉哥哥哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值