DS博客作业02—线性表
1.本周学习总结
1.1思维导图
1.2学习体会
2.PTA实验作业
2.1.题目1:区间删除元素
2.1.1设计思路
建表
{
int i,随循环作为数组下标;
新建顺序表L;
for i=0 to n-1;
给data[i]赋值;
将n赋值给顺序表长度;
}
删除区间元素
{
int i,k,作为数组下标;
for i=0 to n-1;
if 判断数据是否属于给定区间;
重构数组,把数组中不在区间内的元素存入另一个数组,从而达到删除元素的目的;
k记录元素个数;
把k作为删除元素后的数组长度;
}
输出线性表
{
int i;
线性表为空则结束
for i=0,to L->length
输出L->data【i】;
除最后一个元素后外每个元素后都输出空格;
}
2.1.2代码截图
2.1.3本题提交列表及说明
Q1:在编译器上是可以通过测试数据,但把代码copy过去会出现编译错误;
A1:发现pta上只用提交部分函数,而我把全部代码copy过去;
Q2:再次提交发现还是有一个“全部删除”测试点不过,实在改不出来;
A2:后面问了同学,发现是格式跟给的不同,题目的“线性为空“”后边有一个空格;
2.2题目2:头插法建链表
2.2.1设计思路
建链表
{
LinkList s 创建头指针;
L=new LNode
L->next=NULL;
创建头结点,并将其next域置为NULL;
for int i=0 to n-1
循环创建数据结点s并给结点的数据域赋值;
将结点s插入到首节点之前头结点之后;
}
输出链表
{链表表为空则结束
循环到链表为空
输出结点s中的每个数据data;
除最后一个元素后外每个元素后都输出空格;
线性表为空则结束
for i=0,to L->length
输出L->data【i】;
除最后一个元素后外每个元素后都输出空格;
线性表为空则结束
for i=0,to L->length
输出L->data【i】;
除最后一个元素后外每个元素后都输出空格;
}
2.2.2代码截图
2.2.3本题提交列表及说明
Q1:头插法建链表大概都是模仿着课本上的算法打,在编译器上可以运行后就copy过去发现编译错误;
A1:发现提交的老是跟题目要求的函数接口不对应或者就是少了括号多了括号;
2.3题目3:有序表插入元素
2.3.1设计思路
{
int i作为数组下标,m记录下标位置,j,t分别用于排序中下标和中间变量;
for i=0,to n-1
遍历整个顺序表
if 插入元素小于某个元素
用m记录该元素的下标
break跳出循环;
for i=length to m;过不了
从m后的元素开始往后移
元素x插入到原来下标为m的位置;
顺序表长度加1;
两层循环;
冒泡排序插入元素后的顺序表;
}
2.3.2代码截图
2.3.3本题提交列表及说明
Q1:过不了数据插在最后一个位置的测试点,想不到怎么改;
A2:听同学建议可以先插在排序,然后想到用冒泡排序,在原来插入的代码后加了冒泡排序也就解决了;
3.阅读代码
3.1题目
长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
3.2解题思路
设置两个计数器,一个为i,记录扫描过的元素的个数;一个为j,记录扫描过的非x的元素的个数。从1~n对所有的元素进行扫描,如果该元素不是x,则i++,j++并令i对应的元素赋给j;如果该元素是x,i++,j不变,并将i对应的元素赋给j。
3.3代码截图
3.4学习体会
通过对以上代码的阅读,我学习到了一般要删除线性表中的某个元素或者某个区间的元素,我们可以通过遍历整个表的数据和给定条件进行比对,用另一个数组来存放符合条件的数据元素,就可以达到删除某个或某段数据元素的目的,以此延伸,也可以根据条件达到分离一个线性表中的元素,扩展为两个或多个数组的目的。通过查阅大量的代码,我们可以提高阅读代码的能力,同时也能把一些代码的优点集中,用于自己的题目