《数据结构与算法设计》实验报告书之线性表的操作

《数据结构与算法设计》实验报告书之线性表的操作

实验项目

线性表的操作

实验目的

1、帮助学生复习C++语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。

实验内容

1.线性表的基本操作:插入、删除、查找在顺序存储结构和链接存储结构上的实现。
2.掌握对多函数程序的输入、编辑、调试和运行过程。

算法设计分析

(一)数据结构的定义
为了能实现对顺序表的了解,所以先对顺序表的增删改查进行操作,这样便有利于更加深入的了解顺序表。
顺序表存储结构定义为:

#define maxsize 50
typedef struct
{
    int list[maxsize];//顺序表数据的存储
    int size;//顺序表的长度
} seqlist;

(二)总体设计
实验总共包括七个函数:主函数,初始化单链表函数,单链表表长函数,创建表函数,打印单链表函数,插入元素函数,删除元素函数,查找元素函数。

  • 主函数main()
  • 初始化单链表函数seqinit ()
  • 单链表表长函数listlength()
  • 创建表函数seqbulid()
  • 打印单链表函数seqprinter ()
  • 插入元素函数seqinsert ()
  • 删除元素函数seqdelete ()
  • 查找元素函数seqlocate ()

(三)各函数的详细设计:

  • 主函数main()
    主要就是进行功能的实现。
  • 初始化单链表函数seqinit ()
    简单的对顺序表的size进行初始化为0,不然程序会报错。
  • 单链表表长函数listlength()
    直接返回顺序表的长度size。
  • 创建表函数seqbulid()
    实行顺序表的创建,把输入的数据一个一个存进开辟好空间的顺序表中,并且顺序表的长度进行加加。
  • 打印单链表函数seqprinter ()
    就是直接将顺序表打印出来,不过要注意换行
  • 插入元素函数seqinsert ()
    插入元素,首先的找到要插入的位置,把该位置后面的数全部向后面移动一位,不过要注意的是要先移动最后的一个,前面的再逐个往后面移动,不然会导致数据的覆盖,当位置移好了之后,将数据直接插入即可,size在加加。
  • 删除元素函数seqdelete ()
    删除元素与插入元素差不多,只不过操作不同,删除元素就是,直接找到要删除的元素的位置,然后该位置后面的数据全部向前移动一位,这样就达到了删除的目的,最后再然size减减就完成了。
  • 查找元素函数seqlocate ()
    查找元素,直接遍历整个顺序表,找到与其相同的元素便可,返回其位置,结束。

实验测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验总结:(100字到200字)

此部分附上主要程序代码和相关的注释说明、调试数据及过程、问题及解决办法。 (最重要)
(1)调试过程中主要遇到哪些问题?是如何解决的?
在一开始写代码的过程中遇见了许多的问题,一一列举下来:
1.在编写SeqList.h函数代码时,打印顺序表的函数一直报错,结果是没加std::,最后加上之后就没报错了。
2.一开始创建顺序表的时候,由于自己的粗心,没有给顺序表开辟内存空间,导致创建顺序表的时候数一直存不进去,最后加上了,成功解决问题。
3.在最后使用switch的时候,case后面忘记添加break了,导致程序输出有误,幸好最后发现得到解决。
4.最后一个,在头文件里面写输出的时候,不能够使用endl换行,必须使用“\n”。
(2)经验和体会
要多动手,多实践。说实话不亲自动手写一下,你都不知道你有多少的问题,所以,在平时我们就应该多敲一下代码,加深一下自己的理解,这样才能够有助于自己更好的学习。
附录 实验程序代码(该部分请加注释)

SeqList.h函数代码:

#ifndef SEQLIST_H_INCLUDED
#define SEQLIST_H_INCLUDED

/*定义顺序表*/
#define maxsize 50
typedef struct
{
    int list[maxsize];
    int size;
} seqlist;

/*初始化顺序表*/
void seqinit(seqlist *l)
{
    l->size=0;
}

/*单链表表长函数listlength()*/
int listlength(seqlist *l)
{
    return l->size;
}

/*创建表函数seqbulid()*/
int seqbulid(seqlist *l,int x)
{
    l->list[l->size]=x;
    l->size++;
    return 1;
}

/*打印单链表函数seqprinter ()*/
void seqprinter(seqlist *l)
{
    int i;
    for(i=0; i<l->size; i++)
    {
        std::cout<<l->list[i]<<" ";
    }
    std::cout<<"\n";
}

/*插入元素函数seqinsert ()*/
int seqinsert(seqlist *l,int i,int x)
{
    int j;
    for(j=l->size; j>=i; j--)
    {
        l->list[j]=l->list[j-1];
    }
    l->list[i-1]=x;
    l->size++;
    return 1;
}

/*删除元素函数seqdelete ()*/
int seqdelete(seqlist *l,int i)
{
    int j;
    for(j=i-1; j<l->size-1; j++)
    {
        l->list[j]=l->list[j+1];
    }
    l->size--;
    return 1;
}

/*查找元素函数seqlocate ()*/
int seqlocate(seqlist *l,int x)
{
    int j;
    j=0;
    while(j<l->size&&l->list[j]!=x)
    {
        j++;
    }
    if ( j<l->size )
        return j+1;
    else
        return 0;
}

#endif // SEQLIST_H_INCLUDED

menu.h菜单函数代码:

#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED
void menu(){
    std::cout<<"\n";
    std::cout<<" ********************************************************\n";
    std::cout<<" *                                                      *\n";
    std::cout<<" *     a:创建顺序表          b:打印顺序表               *\n";
    std::cout<<" *     c:插入元素            d:删除元素                 *\n";
    std::cout<<" *     e:查找元素            f:打印顺序表的长度         *\n";
    std::cout<<" *                                                      *\n";
    std::cout<<" ********************************************************\n";
}
#endif // MENU_H_INCLUDED

主函数代码:

#include <iostream>
#include "SeqList.h"
#include "menu.h"
using namespace std;
int main(){
    void operation();
    operation();
    return 0;
}
void operation(){
    seqlist *l = new seqlist;//申请内存空间
    seqinit(l);//顺序表的初始化
    for(;;){
        char n;
        int i,x;
        menu();
        cin>>n;
        switch (n){
        case 'a'://查找
            cout<<"请输入数据:\n";
            while(cin>>x && x>0){
                seqbulid(l,x);//建立
            }
            break;
        case 'b'://打印
            cout<<"打印的数据表为:\n";
            seqprinter(l);
            break;
        case 'c'://插入元素
            cout<<"请输入插入的位置:\n";
            cin>>i;
            cout<<"请输入插入的元素:\n";
            cin>>x;
            seqinsert(l,i,x);
            break;
        case 'd'://删除元素
            cout<<"请输入删除的位置:\n";
            cin>>i;
            seqdelete(l,i);
            break;
        case 'e'://查找元素
            cout<<"请输入查找的元素:\n";
            cin>>x;
            if(seqlocate(l,x)){
                cout<<"在顺序表中有该元素,位置是:"<<seqlocate(l,x)<<"\n";
            }else{
                cout<<"在顺序表中没有该元素\n";
            }
            break;
        case 'f'://打印表长
            cout<<"该顺序表的表长为:"<<listlength(l)<<"\n";
            break;
        default:
            cout<<"输入的字符有问题,请重新输入!!";
            break;
        }
    }
}
  • 3
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
选题1:(易)实现顺序表各种基本运算的算法 参考实验指导“实验题 1:实现顺序表各种基本运算的算法实现”。 选题2:(易)实现单链表各种基本运算的算法 参考实验指导“实验题 2:实现单链表各种基本运算的算法实现”。 选题3:(易)编写算法实现二个有序的线性表的合并问题(存储结构可选:顺序表/单链表)。 参考课件“chap002线性表.ppt”相关例题。 选题4:(难)运用单向循环链表实现约瑟夫环的问题。 参考实验指导“实验题 4:运用单向循环链表实现约瑟夫环的问题”。 选题5:(易)将元素X插入到链表中合适的位置。 完成习题集中的算法并编程实现:2.11。参考课件“chap002线性表习题讲解.ppt”2.11。 带头结点的单链表L,其中有n 个元素非递减有序排列,将元素X插入到链表中合适的位置。 提示:先创建链表,其中的元素值可由随机函数按阶段生成或键盘输入,先打印初始链表数据,然后插入新结点,再打印结果链表。 插入前: 插入后: 选题6:(易)删除表中所有大于mink且小于maxk的元素。 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。 参考实验指导“实验题 5:删除有序单链表中所有大于 mink 且小于 maxk的元素”。 选题7:(中等)删除单链表中多余元素。 完成习题集中的算法并编程实现:2.20。参考课件“chap002线性表习题讲解.ppt”2.20。 已知单链表中的元素有序,写一算法,删除表中所有值相同的多余元素(使操作线性表中的元素值均不相同),同时释放被删结点空间。 选题8:(易)实现单链表的就地逆置。 完成习题集中的算法并编程实现:2.22。参考课件“chap002线性表习题讲解.ppt”2.22。 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2...,an)逆置为(an,an-1,...,a1)。 选题9:(难)单链表拆分。 将带头结点的单链表LA中分拆成LB和LC两条单链表,LA中的data域为奇数的节点依次进入LB,而为偶数的节点进入LC。 参考课件“chap002线性表习题讲解.ppt”第35页例题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值