数据结构实验一 线性表的基本操作

桂林电子科技大学

  实验1 线性表的基本操作、算法和应用  实验报告

一、实验目的

  1. 链表的基本操作
  2. 链表的算法设计
  3. 链表的应用

二、实验内容

  1. 链表插入算法
  2. 链表的删除算法
  3. 移动链表中的最大值到尾部
  4. 合并两个递增有序的单循环链表
  5. 链表中奇偶结点的移动
  6. 多项式的加法

三、实验环境

在PTA平台进行实验

四、实验要求

根据每个实训的要求完成代码提交和测评

五、实验步骤 

描述算法的思路原理或实现流程(测评完全正确或部分正确的实训)

6-1 链表的插入算法

本题要求实现一个插入函数,实现在链表llist中的元素x之后插入一个元素y的操作。

将y的指针指向x的后继,再将x的指针指向y

6-2 链表的删除算法

本题要求实现一个函数,实现删除链表llist中的指定元素deldata。

创建一个新节点,将新节点的指针指向要删除结点,再将要删除结点的前驱节点的指针指向新节点的后继结点,然后释放要删除的结点。

6-3 移动链表中的最大值到尾部

编写函数MoveMaxToTail(),实现查找单链表中值最大的结点,并将其移动到链表尾部,注意其他结点的相对次序不变。要求尽量具有较高的时间效率。

例如输入8 12 46 30 5,输出为8 12 30 5 46

首先写一个找最大值的函数,并生成两个新结点,将链表遍历一遍寻找最大值并将其中一个新结点p指向链表最后一个结点,将另一个新结点q的指针指向最大结点,将最大值结点的前驱结点指针指向最大值结点的后继结点,再将最大值结点的指针赋空。根据q找到最后一个结点再将p结点的指针赋给链表最后一个结点,然后释放结点p和q

6-4 合并两个递增有序的单循环链表

本题要求实现一个合并函数,实现对有序单循环链表tail1和tail2的合并,要求合并时实现去重操作,即合并后的链表中没有重复的元素,并且合并后的链表为递增有序链表。

因为是有序链表,所以不用再写一个新函数给两个链表排序。

具体想要把tail2的元素写入tali1中而不是再新建一个tali3,这样可以减小空间复杂度。新建三个空指针,p指向tali1的头节点,q指向tali2的头节点,然后开始比较两个指针指向的结点的数值大小。

当p指向的的元素比q指向的元素大时,将t指向该结点,q继续指向下一个结点,将p的指针赋给t指向的结点的指针,再将t的指针赋空。

当p指向的元素比q指向的元素小时,q指针不变,p指针指向该节点的后继结点,继续比较。

当P指向的元素比q指向的元素一样时,t指向该结点,p和q都指向它的后继结点,再将此节点释放。

当p指向的元素为空q指向的元素不为空时,直接将q的指针赋给p指向的元素的指针

如此重复,直至tali2为空,合并完成。

6-5 链表中奇偶结点的移动

本题要求实现一个函数,实现对单循环链表中奇数和偶数结点的移动,要求奇数在前面,偶数在后面,且结点之间的相对顺序不变。

创建三个空结点p,q和t,p指向头节点,q指向p,当p指向的结点是奇数时,p继续指向下一个结点,q指向此结点,当

p下一个结点时偶数时,q不动,p继续向下移动

p下一个结点为奇数且q指向的结点的下一结点指向的不是p时,把p的后继结点赋给t,p指向其后继结点的后继,t指向的结点指针指向q的后继,再将q指向t指向的结点,然后将t的指针赋空。

一直做此循环直至P指向空

7-1 多项式的加法

用链表表示多项式,并实现多项式的加法运算

输入格式:输入在第一行给出第一个多项式POLYA的系数和指数,并以0,0 结束第一个多项式的输入;在第二行出第一个多项式POLYB的系数和指数,并以0,0 结束第一个多项式的输入。

输出格式:对每一组输入,在一行中输出POLYA+POLYB和多项式的系数和指数。

结点应有数值:xushu zhishu

将链表遍历一遍,每当结点中zhishu相等时将其摘出,建立一个新列表,等链表遍历结束后会出现所有指数对应的链表。

然后将每个链表对应的xishu进行加减运算,得到新结点并把之前的结点释放掉

最后再将所有得到的新节点按顺序排序,得到结果

六、问题记录实验总结(必写

记录实验过程遇到的问题以及解决方法,并对实验收获进行总结。

在第三个问题中,除了指针遍历方法之外,还可以尝试使用for循环语句将链接列表的最大值移动到末尾。在这里,很容易模糊对for语句条件的判断。我将其分为三个语句,以for(q=H,p=H->next;p;q=p,p=p->next)作为基本条件,然后使用两个if条件语句对移动和取最大值进行操作。

结论:通过实验实践,除了进一步了解线性表的搜索、插入和删除等基本操作外,算法的程度也得到了提高。它不仅局限于一般运算,而且在原有的基础上抽象了问题,使算法的本质更加深入。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值