博客作业2---线性表

Posted Longjingrap

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了博客作业2---线性表相关的知识,希望对你有一定的参考价值。

一、PTA实验作业

题目一:6-2 线性表元素的区间删除

设计思路

定义i控制循环,count进行控制是否要删除的数字
if 最大值小于最小值,返回L
for i=0 to   i<=L->Last 
       if  L->data在所要删除的区间范围内
                    count++
       else
             	L->Data[i-count]=L->Data[i];//进行删除数字
                                         end
   L的长度等于之前的长度减去count
     返回L;

代码截图

PTA提交列表说明。

  • 主要是时间复杂度太大了,之前用了两个循环,后面改成一个循环就可以了。

题目2:6-2 jmu-ds-单链表逆置

设计思路

输入函数:
       定义链表;类型 s,r;
       定义i来控制循环,m用来输入数据;
         给L创建头结点; 
           r始终指向尾节点,开始时指向头结点;
for  i=0 to   n-1  //循环建立数据节点
    创建数据节点s;
      将s插入r之后;//尾插法
                   end;
   ’尾节点next域置为NULL;
输出函数:
    定义p指向L的next域置;
       if  p为空
           输出NULL;
      else
          输出第一个数据,前面无空格
           p指向p的next域置
         while(p)
             先输出一个空格,在输出数据
                 p指向p的next域置
                                      end;
倒置函数:
      定义 p,q;
        p指向L的next,L的next置为空;
          while(p)   //头插法
                     q指向p的next域置
                    p的next域置等于L的next域置  
                    L的next域置等于p;
                    p=q;
                                     end;

3.代码截图

4.PTA提交列表说明。


  • 最后面那个链表倒置一直运行错误,错误如上图,一开始效仿尾插法也建立数据节点,一直运行错误,有时候结果出来了也是提示运行错误,后来搞不懂去请教同学,发现其实不用创建数据节点,然后我把数据节点去掉,再运用头插法就行了。

题目3:7-1 两个有序链表序列的合并

设计思路

输入函数void CreateListR(List &s,ElemType a[],int n);
    创建头结点L,List r,p;
    r始终指向尾节点,开始时指向头结点
        for i=0  to    i<n
            创建数据节点p
             将p插入r之后
                             end;
     尾节点next的域置为NULL;
输出函数void DispList(List &s);
     定义p指向s的next域置;
       if  p为空
           输出NULL;
      else
          输出第一个数据,前面无空格
           p指向p的next域置
         while(p)
             先输出一个空格,在输出数据
                 p指向p的next域置
                                      end;
                换行;                        end;
合并函数void sort(List s1,List s2,List &s3);
     List pa=s1->next, pb=s2->next,r,p;
      创建s3的头结点
        r始终指向s3的尾节点
    whilewhile(pa!=NULL&&pb!=NULL)
       if pa->data的数据小于pa->data的数据
           复制pb节点
             采用尾插法将p插入到s3中
      else  
            复制pa节点
              采用尾插法将p插入到s3中   end;
        while(pa不为空)
             复制pa节点
              采用尾插法将p插入到s3中   end;
         while(pb不为空)
             复制pb节点
              采用尾插法将p插入到s3中   end;
         r尾节点next的域置为NULL;

3.代码截图



4.PTA提交列表说明。


这题主要是大规模输入出现段错误,一开始不知道怎么改,然后随便把数组弄到1000001,一提交就对了。但是这样在DVC那边运行不了,具体如何解决现在还不是很了解。除了把数组调到1000001

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

1.顺序表PTA排名

2.链表PTA排名

3.我的总分:

85+150=235

三、本周学习总结

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

  • 没课的时候就抽时间来完成作业还有自习的时候来学习
  • 编程也是空闲的时候来完成PTA,分时间来完成,能写一题是一题
  • 不懂的话先翻书看书里有没有相应内容,没有自己再思考,想不出来就缓一下去问同学,同学也不懂的话就去网上查思路。

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

  • 链表为动态存储结构,可以随时申请或归还存储空间,且插入或删除结点时,只要修改链接的指针,不需移动数据结点,时间复杂度为O(1),它的缺点是不能随机访问数据节点,需要遍历链表,时间复杂度为O(n)。
  • 本次7-2用链表来完成的话后面的指数排序我觉得有点难,写了有点久,最会放弃了,改用数组来完成,所以链表有好处也有坏处。

3.代码Git提交记录截图

四.代码互评

#include <stdio.h>
#include <stdlib.h>
typedef struct _RingNode
{
     int pos;
     struct _RingNode *next;
}RingNode, *RingNodePtr;
void CreateRing(RingNodePtr pHead, int count)
{
     RingNodePtr pCurr = NULL, pPrev = NULL;
     int i = 1;
     pPrev = pHead;
     while(--count > 0)
      {
          pCurr = (RingNodePtr)malloc(sizeof(RingNode));
          i++;
          pCurr->pos = i;
          pPrev->next = pCurr;
          pPrev = pCurr;
      }
      pCurr->next = pHead;
  }
void KickFromRing(RingNodePtr pHead, int m)
{
     RingNodePtr pCurr, pPrev;
     int i = 1;    // 计数
     pCurr = pPrev = pHead;
     while(pCurr != NULL)
     {
         if (i == m)
         {
              pPrev->next = pCurr->next;
              free(pCurr);
              pCurr = pPrev->next;
              i = 1;
         }
          pPrev = pCurr;
          pCurr = pCurr->next;
          if (pPrev == pCurr)
          {
              printf("%d\\n", pCurr->pos);
              free(pCurr);
              break;
          }
          i++;
      }
}
int main()
{
     int n, m;
     RingNodePtr pHead = NULL;
     scanf("%d %d", &n,&m);
      pHead = (RingNodePtr)malloc(sizeof(RingNode));
      pHead->pos = 1;
      pHead->next = NULL;
      CreateRing(pHead, n);
     KickFromRing(pHead, m);
     return 0;
}
  • 这代码虽然用的是C语言,但这是一个典型的需要用双链表来解决的约瑟夫环问题

以上是关于博客作业2---线性表的主要内容,如果未能解决你的问题,请参考以下文章

博客作业2---线性表

博客作业2---线性表

博客作业02---线性表

博客作业2---线性表

博客作业2---线性表

博客作业2---线性表