数据结构第二次作业
一、PTA实验作业(5分)
1.题目1:6-3 顺序表删除重复元素
2. 设计思路(伪代码或流程图)
创建链表函数
定义i用于循环;
为L申请新空间;
for i=0 to n-1
将a[i]的值赋给L->data[i] ;
end for;
将n的值赋给L->Length;
删除重复元素函数
定义i,j用于循环,temp=0用于判断最终长度;
for i=0 to L->Length-1
for j = 0 to j < i
如果L->data[j] == L->data[i])跳出循环
如果j>=i则令L->data[temp] = L->data[i],并使temp++;
end for;
将temp赋给L->length
输出结果函数
定义i用于循环
如果L->length!=0
则从 i=0 to i=L->length=1
输出L->Data[i]
3.代码截图
4.PTA提交列表说明。
编译错误:使用的是vs编译器,导致添加的头函数include"stdafx.h"不被识别
部分正确:没有判断空表
1.题目2:单链表逆置
2. 设计思路(伪代码或流程图)
创建单链表函数
如果传进来的数n为0
为L申请新空间
L->next = NULL;
如果传进来的数n不为0
定义新的LinkList类型结构体变量*s,*r;
定义i,x用于循环和储存数字
为L申请新空间
r = L;
for i = 0 to i < n
为s申请新空间
输入x的值并赋给s->data
将r后移一个位置
end for
r->next = NULL;
}
逆置链表函数(头插法重建)
if (L->next != NULL) ;
创建node类型的结构体 *s, *q = L;
为L申请新空间
L->next = NULL;
while(q不为空)
为s申请新空间;
将q的数据给s;
s->next = L->next;
L->next = s;
q = q->next;
end while;
end if;
输出结果函数
定义i用于循环
如果L->length!=0
则从 i=0 to i=L->length=1
输出L->Data[i]
3.代码截图
4.PTA提交列表说明。
部分正确:没有考虑到空链表的情况
1.题目3:两个有序链表序列的合并
2. 设计思路(伪代码或流程图)
结构体
struct LinkList {
int data;
struct LinkList *next;
};
主函数
定义LinkList类型结构体 *ha, *hb, *hc;
定义a b两个数组,长度为1000001
定义i用于循环,number用于存放数字
while (1) {
输入number
令a[i++]=number,直至number为-1时跳出循环
}
创建ha链表(函数执行)
i = 0;
while (1) {
输入number
令a[i++]=number,直至number为-1时跳出循环
}
创建hb链表(函数执行)
执行联合函数
hc = hc->next;
输出hc
创建单链表函数
如果传进来的数n为0
为L申请新空间
L->next = NULL;
如果传进来的数n不为0
定义新的LinkList类型结构体变量*s,*r;
定义i,x用于循环和储存数字
为L申请新空间
r = L;
for i = 0 to i < n
为s申请新空间
输入x的值并赋给s->data
将r后移一个位置
end for
r->next = NULL;
}
联合函数
LinkList *pa = ha->next, *pb = hb->next, *r, *s;
为hc开辟新空间
令r = hc;
while (pa != NULL && pb != NULL) {
r中接受a的数据,a往后移动一位
}
else if (pa->data == pb->data) {
r中接受2次a(或者b)的数据
a和b都往后移动一位
}
else {
r中接受b的数据,b往后移动一位
}
}
如果a为NULL,则将b中剩余所有数字存入r
如果b为NULL,则将a中剩余所有数字存入r
r->next = NULL;
3.代码截图
4.PTA提交列表说明。
段错误:定义的a b给了1000万个单元,太大了
部分正确:定义的a和b给的单元数太少
二、截图本周题目集的PTA最后排名(3分)
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:215
本题评分规则:
(3)PTA总分在200--250分:2分(必做题大部分做完)
三、本周学习总结(2分)
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?(1分)
学习安排:在打代码之前会先看看书,能够让自己代码思路更清晰,还可以
编程安排:本周数据结构的PTA基本都是在临近结束时完成,对自己的安排不满意,之后打算平均分配每日任务量,让每天都能得到一定的代码能力训练
不懂问题:有放在群上问,也有私底下问同学,效果很好
安排内容:学习时间安排、编程时间安排、不懂问题是哪种方式交流?
2.谈谈你对线性表的认识?(1分)
此处先谈你自己主观认识,后面再具体总结本章各个小节内容。
线性表是具有相同特性的数据元素的一个有序序列,他的抽象数据类型主要用ADT表示,线性表的储存结构由顺序表和链表,其中,线性表的顺序储存结构是,把线性表中的所有元素按照其逻辑顺序一次储存到从计算机储存器中指定储存位置开始的一块连续的储存空间。链表则可以实现储存空间动态管理的链式储存方式,链表还可以分为单链表,双链表,循环链表等。
有序表是线性表中的元素是按照升序或降序的方式排列的,也是顺序表的一种。
3.代码Git提交记录截图
四、阅读代码(选做,加1分)
找1篇优秀代码贴图展示,并说明该代码功能是什么,优点是什么?
代码可以是自己同学代码,也可以是其他地方找的代码。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int xishu;
int zhishu;
struct node *next;
}ListNode;
typedef ListNode *List;
typedef int Elemtype;
void CreateList(List &L);//
void DestroyList(List &L);//
void qiudao(List s1,List &h2);//
void shuchu(List L);//
int main()
{
List s1,s2;
CreateList(s1);
qiudao(s1,s2);
shuchu(s2);
DestroyList(s1);
DestroyList(s2);
}
void CreateList(List &L){
List tail,t;
L=new ListNode;
tail=L;
char ch=0;
int xishu,zhishu;
L->next=NULL;
while(1){
if(ch=='\n')break;
scanf("%d%d%c",&xishu,&zhishu,&ch);
t=new ListNode;
t->xishu=xishu;
t->zhishu=zhishu;
tail->next=t;
tail=t;
}
tail->next=NULL;
}
void DestroyList(List &L){
List r=L;
while(L){
r=L;
L=L->next;
free(r);
}
}
void qiudao(List s1,List &s2){
List r=s1->next,tail,t;
s2=new ListNode;
tail=s2;
s2->next=NULL;
if(r==NULL){
return;
}
while(r){
if(r->xishu*r->zhishu==0){
r=r->next;
break;
}
t=new ListNode;
t->xishu=r->xishu*r->zhishu;
t->zhishu=r->zhishu-1;
tail->next=t;
tail=t;
r=r->next;
}
tail->next=NULL;
}
void shuchu(List L)//
{
List r=L->next;
if(r==NULL)printf("0 0");
int flag=1;
while(r){
if(flag)flag=0;
else printf(" ");
printf("%d %d",r->xishu,r->zhishu);
r=r->next;
}
}
点评:郑伟同学将指数和系数包装在一起(我之前一道类似的是用数组做),并能巧妙的融合几个相同指数,他的代码风格也很值得学习,每个代码都没有多余的话,基本上没有多余的废话,他的缺点是注释太少,要是能再多点注释就让读者更容易理解代码。