第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 有序表的抽象数据类型描述,存储结构,基本运算,以及归并算法,及应用
    以上相关操作集包括建立,删除,查找,插入,销毁,初始化......

3.代码Git提交记录截图

posted on 2018-03-24 17:04  开心仔  阅读(866)  评论(2编辑  收藏  举报

导航