博客作业2---线性表
一、PTA实验作业
1.题目1:jmu-ds- 顺序表删除重复元素
2. 设计思路
void CreateSqList(List &L,int a[],int n)
为L申请动态空间
为L->length赋值为n
for i=0 to i<L->length
把a[i]赋值给L->data[i]
end for
void DispSqList(List L)
for i=0 to i<L->length
当i=0时,只输出L->data[i]
否则输出空格加L->data[i]
void DelSameNode(List &L)
定义一个长度为L->length的数组a
for i=L->length to i=0
for j=0 to j=i
if(l->data[i]==L->data[j])
把i存到a中去即a[k]=i
k++
退出break
for i=0 to i=k
for j=a[i] to j<L->length
前移一个单位即L->data[j]=L->data[j+1]
L->length减少为L->length-k
3.代码截图
4.PTA提交列表说明
这里从前到后遍历数组会导致删除元素时删除的是跟后面相同的前面的元素导致错误
1.题目2: jmu-ds-单链表逆置
2.设计思路
void CreateList(List &L,int n)
为L申请动态空间
定义两个结构体指针q,p,q初始化为L
for i=0 to i<n
为p申请动态空间
输入p->data
头插法插入p 即 q->next=q
q=p
让q的next为NULL
void ReverseList(List &L)
定义结构体指针pre,pre1,pre2,初始化pre为L->next,pre2为NULL
pre1=p->next;
while(p不为空的时候)
保存下一个节点即pre1=p->next
让p指向前一个节点即p->next=pre2;
pre2保持与pre1的相对关系即pre2=p->next;
p后移即p=pre1;
让头结点L=pre2
void PrintList(List L)
定义结构体指针p
if(L为NULL) 输出NULL
否则 for p=L to p=NULL
if(第一次输出) 则输出p->data
否则输出空格加p->data
3.代码截图
4.PTA提交列表说明
题目没有看清,没有判断链表为空的情况下要输出NULL
1.题目3:两个有序序列的中位数
2. 设计思路
main
定义结构体指针L1,L2,L3
为L3申请动态空间
初始化L3->next=NULL
scanf("%d",&n);
建立链表L1CreateList(L1,n);
建立链表L2CreateList(L2,n);
合并链表Union(L1,L2,L3);
输出中位数print(L3,n);
void CreateList(List &L,int n)
为L1申请动态空间
初始化L1->next为NULL
定义结构体指针q=L,p,定义整形变量i
for i=0 to n-1
为p申请动态空间
输入p->data
尾插法q->next为p
q=p
让q->next为NULL成功建立链表
void Union(List L1,List L2,List &L3)
定义结构体指针pre1=L1->next,pre2=L2->next,pre=L3,p
while(pre1不为NULL或者pre2不为NULL)
if(pre2为NULL或者pre1不等于NULL并且re1->data小于pre2->data)
为p申请动态空间
为p->data赋值为pre1->data
尾插法pre->next=p;
pre=p;
pre1走向下一个节点pre1=pre1->next;
if(pre1为NULL或者pre2不等于NULL并且re1->data大于pre2->data)
为p申请动态空间
为p->data赋值为pre2->data
尾插法pre->next=p;
pre=p;
pre2走向下一个节点pre2=pre2->next;
pre->next=NULL成功建立链表
void print(List L3,int n)
定义结构体指针p=L3->next,定义整形变量i=1
while(p不为NULL并且i不为中位数即i<(2*n+1)/2)
p走向下一个节点即p=p->next
i++
输出中位数printf("%d",p->data)
3.代码截图
4.PTA提交列表说明
第一次编译错误是PTA选择错了语言。第二次错误是因为判断中位数是一开始i的值取错了
二、截图本周题目集的PTA最后排名
- 我的总分:295
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
教新内容的时候会看书预习复习,pta出了就做,遇到不懂的问题会请教同学或者舍友。对自己的安排不满意的地方在于不会主动去做布置的作业之外的习题,代码量跟优秀的同学比起来还不够大,今后会多做题。
2.谈谈你对线性表的认识?
线性表是一种常用的数据结构。通过链表或者数组来实现。在实际应用中,线性表可以以栈、队列、数组等特殊线性表的形式来使用。掌握好线性表不同特性的使用,可以更好地提高程序的运行效率,也可以让代码写起来更为轻松。
本周教了顺序表的初始化,查找,插入,删除。链表的带头结点的建立链表:头插法建立链表或者尾插法建立链表,链表的查找:即通过遍历的方法查找,链表的插入:遍历链表找到要插入的位置的前一个结点就可以实现插入,链表的删除:遍历链表找到要删除的位置的前一个结点,再删除然后释放空间。还学习了链表和顺序表的区间删除:找到要删除的区间循环删除或者新建线性表。还学习了两个链表的归并:两个链表的头元素对比,找到需要的值然后尾插法插入新表,对应链表走向下一个节点不断重复直到两个链表被遍历完。
3.代码Git提交记录截图
四、阅读代码
这是吴军霖同学的代码,功能:多项式的乘法。代码优点显而易见,简短并且可读性高,在数据不大的情况下十分适用,O(n的平方)的时间复杂度,想比较于我用链表做简短乐非常非常多,但是吴军霖同学用数组做的话,在输入的数据过大的情况下,空间复杂度会变得很大,所以这个代码比较适用于数据不是太大的多项式乘法。