一、PTA实验作业
1.题目1:线性表元素的区间删除
2. 设计思路
定义整形变量i,j=0
for i=0 to i<=L->Last
if L->data[i]在要删除的区间内
j++
else 移动数组L->data[i-j]=L->data[i]
end for
最后一个下标减少 L-Last-=j;
3.代码截图
4.PTA提交列表说明
- 碰到的问题
对L->Last的理解错误,导致答案错误,data[]数组的下标是从0开始的,而顺序表元素的逻辑序号是从1开始的。
1.题目2:单链表逆置
2. 设计思路
void CreateList(List &L,int n){ //正序建表
L=new ListNode 申请空间
L->next=NULL;
if n=0 return
定义 List r=L,s;
int i;
for i=0 to n //尾插发
s=new ListNode
输入s->data
r->next=s
r=s
end for
r->next=NULL
}
void ReverseList(List &L){ //逆序
List p,q
p保存链表 p=L->next
L->next=NULL 重构链表
while p!=NUNLL
q=p->next 记下后节点
头插法插入节点啊
end while
}
void PrintList(List L){
int flag=0
L=L->next
if !L 输出NULL
while L!=NULL
if flag=1
输出 " L->data" end if
else
输出 "L->data"
flag=1
end else
L=L->next
end while
}
3.代码截图
4.PTA提交列表说明
本题没有碰到问题
1.题目3:
2. 设计思路
加法:
void Add(LinkList L1,LinkList L2,LinkList &L3){
定义 LinkList p=L1->next,q=L2->next,r,s
L3申请空间
r=L3
while(p&&q){
if p的指数大于q的指数{
用s保存p,并用尾插法插入L3
p指针后移
}
else if p的指数大q的指数{
用s保存q,并用尾插法插入L3
q指针后移
}
else {
用s保存q与p的系数之和以及指数
若系数之和为零则不插入,不为零则用尾插法插入L3
q指针后移
p指针后移
}
}
遍历p或q剩下的元素,用尾插法插入L3
}
乘法:
void Mul(LinkList L1,LinkList L2,LinkList &L3){
定义 LinkList p=L1->next,q=L2->next,pre,r,s
L3申请空间,L3->next=NULL;
while(p){
每次遍历L2前让q的指针重新指向L2,q=L2->next
while(q){
用s保存q与p所指向数据的系数乘积和指数之和
pre=L3;r=L3->next;
遍历L3,找到第一比q与p的指数之和大的数据,然后进行插入
若找到指数相等的,则进行系数相加;
若相加后系数之和为0,则进行删除;
}
}
}
3.代码截图
4.PTA提交列表说明
- 碰到的问题
最开始用cout输出,输出的答案是按科学计数法,导致答案错误,试了半天,最后改成printf输出
二、截图本周题目集的PTA最后排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:245
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做?
对于本周的数据结构学习时间安排的有些分散,主要的时间还是安排在晚上,PTA是一次做好几个小时,然后隔了几天才再去做,上周5晚上就开始做了PTA,但后来到星期二才安排了时间继续做,中间隔得时间有点久,总的来说对于自己的时间按排有些不满意,以后的打算是每天的时间分配好,做PTA的时候不要求一次做好几题,有的时候做几个小时有的题目也做不出来,以后每天能做一、两题,这样安排时间会更合理一些。
2.谈谈你对线性表的认识?
线性表是具有相同特性的数据元素的一个有限序列。主要分为顺序表和链表。
顺序表:
结构
typedef struct{
Elemtype data[] //存放顺序表中元素
int length //存放顺序表长度
}Sqlist
各种操作时间复杂度
初始化:O(1)
销毁:O(1)
判断是否为空表:O(1)
求顺序表长度:O(1)
输出顺序表:O(L->length)
求某个数据元素的值:O(1)
按某个元素值查找:O(L->length)
插入数据元素:O(n)
删除数据元素:O(n)
链表
链表分为单链表、双链表、循环链表、循环双链表
- 单链表
结构
typedef struct{
Elemtype data 1//存放链表中元素
...
LinkLNode *next //指向下个节点
}LinkLNode
各种操作时间复杂度
头插法建表:O(n)
尾插法建表:O(n)
初始化:O(1)
销毁:O(n)
判断是否为空表:O(1)
求链表长度:O(n)
输出链表:O(n)
求某个数据元素的值:O(n)
按某个元素值查找:O(n)
插入数据元素:O(n)
删除数据元素:O(n)
- 双链表
结构
typedef struct{
Elemtype data 1//存放链表中元素
...
DLinkLNode *next //指向下个节点
DLinkLNode *prior //指向前一个节点
}DLinkLNode
- 循环链表
即单链表的尾结点指向头结点
- 循环双链表
双链表的头尾结点相连
链表与顺序表各自的优点
顺序表在查找某个位置的元素是比链表跟快,但在删除和插入数据元素是,链表比顺序表更快,而且链表不要移动结点位置,只需改变结点的指向关系就可以实现。
3.代码Git提交记录截图
四、阅读代码
归并排序
#include<stdio.h>
void merge_sort(int r[],int s[],int m,int n); //实现归并排序
void merge(int r[],int s[],int x1,int x2,int x3);//实现一次归并
void main()
{
int a[11];
int i;
printf("输入10个数: \\n");
for(i=1;i<=10;i++) scanf("%d",&a[i]);
merge_sort(a,a,1,10);
printf("排序后的顺序是:");
for(i=1;i<10;i++)
printf("%5d",a[i]);
printf("\\n";)
}
void merge_sort(int r[],int s[],int m,int n);
int p;
int t(20);
if(m==n) s[m]=r[m];
else{
p=(m+n)/2;
merge_sort(r,t,m,p); //调用函数将r[m]到r[p]归并成t[m]到t[p]
merge_sort(r,t,p+1,n);//调用函数将r[p+1]到r[n]归并成t[p+1]到t[n]
merge(t,s,m,p,n); //调用函数将前两部分归并到s[m]到[n]中 }
}
void merge(int r[],int s[],int x1,int x2,int x3){
int i,j,k;
i=x1;j=x2+1;k=x1;
while((i<=x2)&&(j<=x3)) //筛选两部分中较小的元素放到数组s中
if(r[i]<=r[j])
s[k++]=r[i++];
else
s[k++]=r[j++];
while(i<=x2)
s[k++]=r[i++]; //将x1 -- x2范围 内为比较的数顺次加到数组r中
while(j<=x3)
s[k++]=r[j++]; //将x2+1 -- x3范围内为比较的数顺次加到数组r中
}