第02次作业-线性表
一、PTA实验作业
1.题目一 7.1最长连续递增子序列(20 分)
2.实验思路
struct list{
int a;
int b;
}data[100000];//定义结构体数组data[100000],用b来表示递增子列个数,a存数据
int i,j,n;定义变量i,j,n表示输入个数
int max=1,head;定义初始最大递增子列数max初始为1,定义head为最大递增子列的头
for(i=0;i<n;i++)//!!
{
for(j=i+1;j<n;j++) //与其后面元素相比较
{
if(data[j].a>data[j-1].a)
{
data[i].b++;//增加递增子列个数b
}
else 跳出循环
}
}
for(i=0;i<n;i++)
{
if(data[i].b>max)
{
max=data[i].b;//找出b最大所对应的i;
head=i;
}
}
for(i=head;i<head+max-1;i++)
{
printf("%d ",data[i].a);
}
printf("%d",data[head+max-1].a);//输入最后不带空格
3.代码截图
4.PTA的提交列表说明
- 多次错误
里面有格式错误和随机最大n的段错误。
题目中规定最后一项不得有多余空格,格式错误。增加
printf("%d",data[head+max-1].a);
- 部分错误
随机最大值n段错误
增大数组的长度由1000改到10000
1.题目二.6-2 jmu-ds-单链表逆置(25 分)
2.实验思路
void ReverseList(List &L)头插法实现逆置
{
*定义新链表newL ,指针p,q;
p指向L
if(L->next非空)
{
while(p不为空)
{
头插法将p中元素放入newl;
}
L=newL;
}
3.代码截图
4.PTA的提交列表说明
- 1.链表不空,格式错误
while(p->next!=NULL)
{
if(p->next!=NULL)
printf("%d ",p->data);
.........
改为
while(p->next!=NULL
{
if(p->next->next!=NULL)
printf("%d ",p->data);
- 2.链表为空,段错误
if(p==NULL)
printf("NULL");
while(p->next!=NULL)
{
.....
改为
if(p==NULL)
printf("NULL");
else{
while(p->next!=NULL)
{
思考:如果不加else的话,通过if语句后会进入while语句,可能若p为空执行p->next是否为空会导致段错误。
1.题目三 一元多项式的乘法与加法运算(20 分)
2.实验思路
typedef struct pnode
{
int xnumber;
int znumber;
struct pnode* *next;
}*polynomial,pnode;* *定义一个结构造组包含系数指数和指针。
void sumpolynomial(polynomial &a,polynomial &b,polynomial &c)
{
定义新链表c,并分配空间,定义新节点s
while(两个有序表不为空)
{ if(pa指数大于pb)
{ s保存pa数据,
用尾插法插入新链表c
}
if(pa指数小于pb)
{ s保存pb数据,
用尾插法插入新链表c
}
if(pa指数等于pb)
{ s保存pb数据,
用尾插法插入新链表c
}
}
}
void mulpolynomial(polynomial &a,polynomial &b,polynomial &c)
{
定义节点s,新链表c
if(a或b为空)
则c为空
while(a,b均不为空)
{
遍历链表a
使a中每个元素与系数相乘,指数相加
保存在新节点s
}
void sorting(polynomial &l)
{
定义指针p p=l->next->next;
while(p!=不为空)
{
q指向p->next
pre指向l;
while(pre->next不为空并且大于p的next)
pre指向其下一个;
else
p的next指向pre的next
pre->next=p;
p=q;
}
}
void conbine(polynomial &l)
{
while(l不为空)
{
定义两个指针指向p=l->next,q=p->next.
while(p->next不为空)
if(q,p指数相同)
{
系数相加,
p->next指向q->next,
q指向q->next并且删除q.
}
else{
p,q分别指向它们的下一个。
}
}
3.代码截图
4.PTA的提交说明
本题因提交多次,所以按照获得的分数档次说明。分别为0,12,14,16,18
- 0分->12分
①编译器选择错误
②没有写合并同类项函数。
③合并同类项函数出现段错误
void conbine(polynomial &l)
{
polynomial p,q,Q;
p=l->next;
q=p->next;
while(p->next!=NULL)
{
........
改为
while(q->next!=NULL)- 12分->14->16分->18
①同类项合并时有抵消
同类项合并时有抵消不需要输出“0 0”
if(q->znumber!=0&&q->xnumber==0)
{
q=q->next;
} 在输出函数中多添加一个类别,跳过合并同类项相消的那项。
②系数和指数取上限,结果有零多项式
if (!q)
{
printf("0 0");
} 若零多项式,按题目要求应输出“0 0”,在输出函数增添if语句。- 18分->20分
①输入有零多项式和常数多项式
若输入有零多项式和常数多项式,加法运算结果为h该常数多项式,乘法运算结果为“0 0”。不应是空白结果。
if(paNULL&&pbNULL)
{
s=new pnode;
s->xnumber=0;
s->znumber=0;
r->next=s;r=s;
r->next=NULL;
} 在加法运算中,除了分类a为空,b为空,还要分a,b同时为空
二、截图本周题目集的PTA最后排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:
必做全做,选做做部分。总分2.5
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
在周末的时候和周中有空闲的时间写代码,改代码。觉得自己改代码时间比较久,应该多多询问请教老师同学,并且多多熟悉书本里的基础操作集。注重细节的变化。
2.谈谈你对线性表的认识?
线性表从逻辑结构上说,是一种线性结构,里面的元素是一对一关系。
从存储结构上说,分顺序存储和链式存储。顺序存储与链式存储差别在于物理存储地址是否相邻。顺序存储包括顺序表,链式存储包括单链表,双链表,循环链表。
- 2.1 讲述线性表定义和逻辑结构,抽象数据类型
- 2.2 顺序存储之顺序表的相关操作集,及应用实例
- 2.3 链式存储之单,双,循环链表相关操作集
- 2.4 线性表应用
- 2.5 有序表的抽象数据类型描述,存储结构,基本运算,以及归并算法,及应用
以上相关操作集包括建立,删除,查找,插入,销毁,初始化......