博客作业2---线性表
一、PTA实验作业
题目1:线性表元素的区间删除
设计思路:
List A//新建一个链表A,用来存放处理后的数据
A=(List)malloc(sizeof(struct LNode))//申请空间
j=-1;
A->Last=j;//下标初始化
for(i=0 to L->Last){
if(minD>=L->data[i]&&L->data[i]<=maxD)
j++;//每符合条件一次下标+1;
存入A->data[j]
}
A->Last=j;返回A;
end
代码截图
PTA提交列表说明
14分的那次,我是运行超时,我是每次遍历一遍链表,删除一个数,这样的时间复杂度变
成了O(n^2),后面我改用一个新的链表直接存放符合条件的数据,时间复杂度为O(n)。
19分的那次,当输出空集时,我一开始下标直接定为0,当下标为0时,代表有一个数,即
当空集的时候就错误了。
题目2:jmu-ds-链表倒数第m个数
设计思路:
先判断L是否为NULL,若为NULL,返回-1.
定义新链表*P,*q,*p=L来存放L的信息。
重构链表L,将L逆置,L->next=NULL;
while (p){//重构L,将L逆置
q=p->next q存放p后面的信息
p->next=L->next
L->next=p
p=q
}
此时要查找的倒数第m个数即为正向顺序的第m个数,
for(i=1 to m){
L=L->next;
if(L=NULL) 返回-1
}
返回L->data.
end
代码截图
PTA提交列表说明
错误的地方在于我忘记了m的有效位置,第一次忘记写m的有效位置,则只过了一个点,
第二次我只写了m<0时,返回-1,忘记了m=0的情况,则只过了两个点。
题目3:两个有序序列的中位数
设计思路:
定义结构体链表
typedef struct LNode //定义单链表结点类型
{
ElemType data;//存放数据
struct LNode *next;
} LinkList;
int main(){
int i,n;
LinkList *h1,*h2,*h3;//h1,h2为两个输入链表。h3为合并链表
scanf("%d",&n);
CreateListR(h1,n);//建立链表
CreateListR(h2,n);//建立链表
Link(h1,h2,h3);//链接链表
Displise(h3,n);//输出中位数
return 0;
}
CreateListR(h,n){
L=new LinkList//新建链表
L->next=NULL
LinkList *s,*p=L;
for(1 to n){//输入数值
s=new LinkList
输入s->data
p->next=s;p=s;
}
p->next=NULL//尾结点结束
}
Link(h1,h2,h3){
LinkList *a,*b,*c,*s;
h3->next=NULL;
a=h1->next;b=h2->next;//a存储h1内容,b存储h2内容
while(a||b){
判断a->data与b->data大小关系,
if(a>=b) s=a,c->next=s,c=s,b=b->next
if(a<b) s=b,c->next=s,c=s,a=a->next
if(a==NULL) s=b,c->next=s,c=s,b=b->next
if(b==NULL) s=a,c->next=s,c=s,a=a->next
}
c->next=NULL;
}
Displise(h3,n){
for(1 to n) L=L->next;
输入L->next
}
代码截图
PTA提交列表说明
这一题较为顺利,因为这几个问题在前面编程题中有出现过。
二、截图本周题目集的PTA最后排名
1:顺序表
2:链表
3:总分:85+150=235
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
本周在学习数据结构的时候基本都是在晚上学习的,pta也是在晚上做的,晚上学习是一个挺不错的时间,
但是我主要还是学习的时间花的不多,导致之前一开始做pta题目的时候,感觉无从下手,后面慢慢就看
多了,做多了,后面几题的pta速度也跟上来了。
我本周的学习时间我感觉我是不满意的,以后应该要制定好,多花时间在练习上。
2.谈谈你对线性表的认识?
线性表我感觉就是像链表一样的东西,具体怎么说我是感觉我是说不清楚,是一个可以按照一定顺序存储
数据的东西,通常链表是由结构体为单位组成的。
3.代码Git提交记录截图
四、阅读代码
判断链表序列是否对称
void isSymmetric(Node *L){
int arr[maxSize];
//链表中共有n个元素
Node *r;
r = L->next;
int i = 0;
while(i < (linkListSize)/2){//当小于一半的时候
arr[i] = r->data;
r = r->next;//循环
i++;
}
i--;//回到数组的最高值
//若linkListSize是奇数,则需要后移一位(越过中心结点)
if(linkListSize%2==1) r= r->next;
while(r!=null)//未到链表尾部时
{
if(r->data == arr[i])
{
i--;
r = r->next;
}
else break;//跳出循环
}
if(i == -1){
printf("中心对称\n");
}
else{
printf("非中心对称\n");
}
}
它用了linkListSize函数,这个函数可以直接查询到链表的长度,这个代码
他是先用一个数组来存放前面一半的数据,然后在来比较,它的方法很简
单,主要是它让我知道了linkListSize这个函数,它可以直接查询到链表的
长度,这样对比较简便了。