博客作业2---线性表
一、PTA实验作业
1、6-3 jmu-ds- 顺序表删除重复元素
1)、设计思路
CreateSqList://新建顺序表,存放数据,记录个数
//给L分配内存;
L->length=n;
//循环变量i
for i=0 to n-1
//将a[i]的内容放到L->data[i]中
end i
DispSqList://输出顺序表,如果顺序表为空则不输出
//定义循环变量i
for i=0 to L->length-1
//如果i的值等于L->length-1
//就输出L->data[i]
//否则输出L->data[i]+" "
end i
DelSameNode://删除相同元素(即循环向前覆盖)
//定义循环变量i,j,k;定义s存放数值
for i=0 to L->length-1
//把L->data[i]的值放到s中
for j=i+1 to L->length-1
//如果s的值等于L->data[j]
for k=j to L->length-1 //循环覆盖
将L->data[k+1]的值放在L->data[k]中
end k;
L->length减一,i也减一;
end j;
end i;
2)、代码截图
3)、PTA提交列表说明
- 测试点中的空表,由于我第一次用的输出方式问题,使得在空表的时候会输出一些乱码。后来在输出的循环中加入判断来控制空格的输出就完成了。
- “全部重复数据”,则是由于循环覆盖的i的问题,覆盖完成后要使i减一,再次判断才行。至于那些5分的则是因为把i--放在了不合适的地方导致无限循环。
2、7-1 两个有序链表序列的合并
1)、设计思路
//定义结构体LNode{ int data ; struct LNode *next};其结构体指针别名为List
CreatList:
新建头结点L,定义n存放输入的数据,定义结构体指针p指向L;
while 1
//记录n
若n等于-1就结束循环
新建结点s,存放n的数值
以尾插法连接s和p
end while
DispList:
新建指针p指向头结点L的下一个结点
若p内容为空,就输出NULL
while p
若p的下一结点为空,则输出不带空格的p->data;
不然就输出p->data+" "
p指向p的下一结点
end while
Union:
//合并
新建指针:p1指向S1的下一个结点,p2指向S2下一结点,t,s。
给S3赋予空间,并把t指向S3
while p1 && p2
若p1指向的结点的数据数值小于p2指向的,就将p1指向的结点的数据以尾插法的形式放到S3中,并且p1移向下一结点。
不然就是p2指向的结点数据同样以尾插法放到S3中,p2移向下一结点
end while
while p1
若S1链表还有结点未经历,将这些结点也以尾插法放进S3里
end while
while p2
若S2链表还有结点未经历,将这些结点也以尾插法放进S3里
end p2
将t指向的结点的指针域初始为空
2)、代码截图
3)、PTA提交列表说明
- 基本上错在“有并列”和“大规模输入”这两个测试点。
- 在尝试之后发现题目不要求求并集,有并列的情况下无需去重。
- “大规模输入”的话,在我这里跟“有并列”是一起的,在改完代码之后就一起通过了。
3、7-2 一元多项式的乘法与加法运算
1)、设计思路
//定义结构体LNode{ int coef ; int expn ;struct LNode * next ;}//依次是系数、指数、指针域
CreateList:
//定义循环变量i,引入个数n
给L赋予空间,新建指针s,p;p指向L;
for i=0 to n-1
给s赋予空间,读入数据,尾插法与p连接
end i
p的指针域置为空
DispList:
定义控制变量i;使L指向L的下一结点
若L没有内容,输出“0 0”;
否则
while L
若i非0,不输出空格
不然,输出空格
输出该结点的系数和指数数据,中间有空格;L指向L的下一结点
end while
MultipList:
//乘法
定义整型变量coef、expn存放要用到的数据
新建指针p1指向L1的下一结点,p2指向L2的下一结点,指向要删除的结点的del,t,s;
赋予L3空间,让t指向L3,L3的指针域置为空
若L1、L2有一个为空链表,则返回
while p2
先使L1的第一项遍乘p2,将获得的多项式尾插法形式存放L3中;
end while p2
for p1=p1->next to NULL
将t重新指向L3,p2重新指向L2的下一结点
for p2 to NULL
coef存放p1的系数乘p2的系数之积,expn存放p1的指数加上p2的指数之和;
for t to t->next==NULL或t->next->expn>expn
end t;
若t->next为真且t->next->expn==expn
若t->next->coef + coef 值不为0,就使t->next->coef 加上coef
否则删除这一结点
不然尾插法加上新建的数据为coef和expn的结点
end p2
end p1
AddList:
//相加
给L3分配空间,将其指针域置为空
定义指针p指向L3,p1指向L1->next,p2指向L2->next,t;
while p1 && p2
若p1的指数等于p2的指数,
若p1与p2的系数相加不为0,则尾插法插入L3中,p1和p2指针指向向后移动。
或p1指数大于p2指数
新建结点,尾插法插入L3,p1指针指向向后移动
不然
新建结点,尾插法插入L3,p2指向向后移动
end while
若L1或L2链表还有结点未经历,则将这些未经历的结点尾插法接入L3中。
2)、代码截图
3)、PTA提交列表说明
- “系数和指数取上限,结果有零多项式”,原因是我使用的是来自数据结构群的模板,模板中的系数是float类型,不符合这个测试点的要求。
- “输入有零多项式和常数多项式”,原因是我在AddList函数里多加了一个对L1、L2是否有一个为空的判断,这个判断对于加法而言是没有必要的。
二、截图本周题目集的PTA最后排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:
- 261
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
- 在能够完成各科作业/预习作业/实验作业的基础上多花些时间看书或看视频学习。
- 不是很满意。想在周末的时候多花一些时间在数据结构的学习上。
2.谈谈你对线性表的认识?
- 线性表包含顺序表和链表。是常用的数据结构,合理的设计线性表能够更好的完成目标。
- 学习顺序表的操作集
- 学习链表的操作集
- 学习单链表、双链表的构建
- 学习循环单链表、循环双链表的构建