博客作业2---线性表

一、PTA实验作业

1.题目1:7-1 最长连续递增子序列

2. 设计思路(伪代码或流程图)

定义变量n存放顺序表长度,i,j=0控制循环,l=1存放子列长度,k,m,max存放最大子列长度,flag存放最长子列数组下标,sum=0求和;
	scanf("%d",&n);
	int a[n]存放母列 ,b[100000] 存放子列长度 
	for i=0  to n
		输入母列
        end for
	for i=1 to n
		if(a[i]>a[i-1]){
			l++;
                    判断递增子列
		}
		else {
			b[j++]=l;
			l=1;
                        将子列长度存入数组,长度为1继续遍历
		}
	end for
	b[j]=l 存放最后的子列
	max=b[0]
	for i=0 to j+1
		if(b[i]>max){
			max=b[i];
			flag=i;
                    循环遍历求最大长度子列
		}
	end for
	for k=0 to flag
		sum=sum+b[k];
                求最长子列中第一个数的下标
	end for

	for m=sum to sum+max 输出最大子列的每个元素
		if(m==sum+max-1){
			printf("%d",a[m]);
		}
		else{
		printf("%d ",a[m]);
		}
	end for

3.代码截图

4.PTA提交列表说明(调试问题说明)


1.部分正确:段错误 :之前定义的b[]数组的长度为n,结果输出是对的,但是提交结果是段错误,因为题目给的n是小于10的5次方,所以我就把长度改为10000,发现结果正确


2.漏存了最后一列子列,导致输出。

1.题目2:6-3 jmu-ds-链表倒数第m个数

2. 设计思路(伪代码或流程图)

int Find(LinkList L, int m )
	定义变量LinkList q=L表示第一个指针用来移动至m,后移动至尾结点  p=L表示第二个指针用来移动至n-m个数(第m个倒数)
	定义变量int j=0 计算链表长度
	while  j<m&&q!=NULL
		j++;
		q=q->next;
                第一个指针移动至m个数
	end while
	while q!=NULL   第一,二个指针同时遍历
		j++;
		p=p->next; 第一个指针移动至尾结点
		q=q->next;第二个指针移动至n-m个数
		
	end while
	if(m<=0||m>j-1) return -1 判断无效位置
	return p->data 返回倒数m位置的数值

3.代码截图

4.PTA提交列表说明(调试问题说明)


部分正确:段错误:没有判断好链表的长度,变量j把尾结点后一个空指针的长度也计算进去了,所以需要减1

1.题目3:7-4(选做) 一元多项式求导

2. 设计思路(伪代码或流程图)

using namespace std;
typedef int ElemType;
typedef struct LNode	
{	
	ElemType coef; 定义系数
  	ElemType expn; 定义指数
    struct LNode *next;
} LinkList;
typedef LinkList *List;
void PrintList(List L); 输出函数
void back(List &L); 求导函数

	定义变量List LA用于存放系数和指数的链表,q,p帮助LA建立存放数值  
	int expn1,coef1;用于输入系数和指数
	LA=new LNode;
	p=LA;
	while (cin>>coef1>>expn1)
		q=new LNode;
		q->coef=coef1;
		q->expn=expn1;
		p->next=q;
		p=q;
                运用尾插法插入结点
		if(expn1==0||coef1==0) break;  以指数为0或系数为0作为结束标志
	end for
	p->next=NULL;
	back(LA);
	PrintList(LA);
	return 0;

void back(List &L)
	List m=L->next遍历链表 pre=L存放m的上一个结点
	while (m)
		if(m->expn!=0){  指数不为0,可求导
			m->coef=m->coef*m->expn; 系数等于原系数乘以原指数
			m->expn=m->expn-1; 原指数减1
		}
		else if(m->expn==0){  指数为0,求导需删除
			if(m->next!=NULL){  该结点下一个结点不为空,删除该结点
				pre->next=m->next; 
				free(m);
			}
			else{ 该结点下一个结点为空,说明是尾结点,让其上一个结点pre的下一个结点为空,也能起到删除结点的作用
				pre->next=NULL;
				break;
			}
		}
		pre=m;
		m=m->next;
	end while

void PrintList(List L){
	List p=L->next;
	if(p==NULL)   考虑空链表 也要输出0 0
		printf("0 0");
		return;
	while(p!=NULL)
		if(p->next==NULL){
			printf("%d %d",p->coef,p->expn);
		}
		else{
			printf("%d %d ",p->coef,p->expn);
		}
		p=p->next;
	end while
}

3.代码截图


4.PTA提交列表说明(调试问题说明)


错误:内存超限
分析:第一次碰到这种情况,当时有点手足无措,改了很多地方依然没有解决问题,后来思考,最大可能是循环输入数据的时候出现了错误,后面把输入coef1,expn1作为循环条件,发现答案正确

二、截图本周题目集的PTA最后排名

1.顺序表PTA排名

2.链表PTA排名

3.我的总分:245

三、本周学习总结

1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?

学习时间安排:从其他学科作业量出发考虑,每周的三个晚自习会不定时的复习数据结构的内容,预习作业也是在晚自习时花上一个或半个小时自己完成

编程时间安排:PTA布置后,每个晚上都会花上2~3个小时的时间去写代码,如果在晚自习完成其他任务的情况下,会对PTA上的题进行初步地思路设计,回到宿舍后在验证自己的思路是否正确,以及相应地调试。

不懂问题是哪种方式交流:1.首先必定是自己上网查阅资料或者翻书,自己独立解决2.是先和舍友交流讨论,一般情况都是能够讨论出正确理想的答案 3.上QQ群询问同学老师

总结:对自己的安排还不是特别满意,希望自己能花更多的时间在数据结构上,也会尽量挤出多点时间用于数据结构的学习,只有真正花时间和精力下去才能学好。

2.谈谈你对线性表的认识?

  • 主观认识:我个人认为就是一连串数据有规律地按照某种特定的关系组织在一起,其数据的数量还可以在程序运行的时候进行增加和减少,关系也能够发生改变。

  • 线性表及其逻辑结构:线性表是具有相同特性得数据元素的一个有限序列,其逻辑结构可以用抽象数据类型来描述

  • 线性表的顺序存储结构:线性表的顺序存储结构是顺序表,是把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中。
    顺序表基本运算的实现由以下步骤:1.初始化线性表 2.建立顺序表 3.销毁线性表 4.判断是否为空链表 5.插入、查找、删除元素 6.输出线性表

  • 线性表的链式存储结构:线性表的链式存储结构是链表,分为单链表:每个节点有一个指针域,指向其后继节点。
    双链表:每个节点后两个指针域,一个指向其后继节点,另一个指向其前驱节点。
    循环链表:表中尾结点的指针域不再是空,而是指向头结点,整个链表形成一个环。
    有序表:是指其中所以元素以递增或递减方式有序排列的线性表,最重要的算法是二路归并法。



3.代码Git提交记录截图

四、阅读代码

void delete(LinkList &L, int mink, int maxk) {
   p=L->next; //首元结点
   while (p && p->data<mink)
      { pre=p;  p=p->next; }
   if (p) 
            {
               while (p && p->data<=maxk)  p=p->next;               
      q=pre->next;
      pre->next=p;
      while (q!=p) 
         { s=q->next;  delete q;  q=s; } // 释放结点空间
   }//if
}

功能是删除递增有序链表中值大于min且小于max的所有元素

优点:这道题是课堂派上的题目,当初这道题做错了,没有理解代码的含义,回过头来认真看,才发现是利用指针p来进行查找第一个大于min的结点,指针pre总是作为p的前一个结点,再用p去查找第一个大于max的结点,直接利用pre->next=p去除满足大于min小于max的所有结点,这里的pre是最后一个小于min的结点,p是第一个大于max的结点,最后再利用q!=p这个条件进行结点的删除,非常巧妙,而且容易理解,阅读代码环节写这道题是为了让自己对这个好算法有更深的印象。

posted @ 2018-03-25 22:17  朱杰伟  阅读(329)  评论(3编辑  收藏  举报