• 博客作业2---线性表


    一、PTA实验作业

    题目1:线性表元素的区间删除

    设计思路:

       List A//新建一个链表A,用来存放处理后的数据
       A=(List)malloc(sizeof(struct LNode))//申请空间
       j=-1; 
       A->Last=j;//下标初始化 
       for(i=0 to L->Last){
       	if(minD>=L->data[i]&&L->data[i]<=maxD)
       	j++;//每符合条件一次下标+1; 
    	   存入A->data[j] 
       }
       A->Last=j;返回A; 
       end
    

    代码截图

    PTA提交列表说明

    14分的那次,我是运行超时,我是每次遍历一遍链表,删除一个数,这样的时间复杂度变
    成了O(n^2),后面我改用一个新的链表直接存放符合条件的数据,时间复杂度为O(n)。
    19分的那次,当输出空集时,我一开始下标直接定为0,当下标为0时,代表有一个数,即
    当空集的时候就错误了。

    题目2:jmu-ds-链表倒数第m个数

    设计思路:

       先判断L是否为NULL,若为NULL,返回-1.
       定义新链表*P,*q,*p=L来存放L的信息。
       重构链表L,将L逆置,L->next=NULL;
       while (p){//重构L,将L逆置 
       	 q=p->next  q存放p后面的信息
    	 p->next=L->next 
    	 L->next=p
    	 p=q	 
       } 
       此时要查找的倒数第m个数即为正向顺序的第m个数,
       for(i=1 to m){
       	L=L->next;
       	if(L=NULL)  返回-1 
       } 
       返回L->data. 
       end
    

    代码截图

    PTA提交列表说明

    错误的地方在于我忘记了m的有效位置,第一次忘记写m的有效位置,则只过了一个点,
    第二次我只写了m<0时,返回-1,忘记了m=0的情况,则只过了两个点。

    题目3:两个有序序列的中位数

    设计思路:

      定义结构体链表
      typedef struct LNode	//定义单链表结点类型
    {
      	ElemType data;//存放数据 
        struct LNode *next;
    } LinkList; 
      int main(){
    	int i,n;
    	LinkList *h1,*h2,*h3;//h1,h2为两个输入链表。h3为合并链表 
    	scanf("%d",&n);
    	CreateListR(h1,n);//建立链表 
    	CreateListR(h2,n);//建立链表 
    	Link(h1,h2,h3);//链接链表 
    	Displise(h3,n);//输出中位数 
    	return 0;
    }
    CreateListR(h,n){
    	L=new LinkList//新建链表
    	L->next=NULL
    	LinkList *s,*p=L;
    	for(1 to n){//输入数值 
    		s=new LinkList
    		输入s->data 
    		p->next=s;p=s;
    	}         
    	p->next=NULL//尾结点结束 
    } 
    Link(h1,h2,h3){
    	LinkList *a,*b,*c,*s;
    	h3->next=NULL;
    	a=h1->next;b=h2->next;//a存储h1内容,b存储h2内容
        while(a||b){
        	判断a->data与b->data大小关系,
    		if(a>=b) s=a,c->next=s,c=s,b=b->next
    		if(a<b)  s=b,c->next=s,c=s,a=a->next
    		if(a==NULL) s=b,c->next=s,c=s,b=b->next
    		if(b==NULL) s=a,c->next=s,c=s,a=a->next
    	}
    	c->next=NULL; 
    } 
    Displise(h3,n){
    	for(1 to n) L=L->next;
    	输入L->next 
    }
    

    代码截图



    PTA提交列表说明


    这一题较为顺利,因为这几个问题在前面编程题中有出现过。

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

    1:顺序表

    2:链表

    3:总分:85+150=235

    三、本周学习总结

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

    本周在学习数据结构的时候基本都是在晚上学习的,pta也是在晚上做的,晚上学习是一个挺不错的时间,
    但是我主要还是学习的时间花的不多,导致之前一开始做pta题目的时候,感觉无从下手,后面慢慢就看
    多了,做多了,后面几题的pta速度也跟上来了。
    我本周的学习时间我感觉我是不满意的,以后应该要制定好,多花时间在练习上。

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

    线性表我感觉就是像链表一样的东西,具体怎么说我是感觉我是说不清楚,是一个可以按照一定顺序存储
    数据的东西,通常链表是由结构体为单位组成的。

    3.代码Git提交记录截图

    四、阅读代码

    判断链表序列是否对称

    void isSymmetric(Node *L){  
        int arr[maxSize];         
        //链表中共有n个元素  
        Node *r;  
        r = L->next;  
        int i = 0;  
        while(i < (linkListSize)/2){//当小于一半的时候   
            arr[i] = r->data;  
            r = r->next;//循环   
            i++;   
        }  
        i--;//回到数组的最高值   
        //若linkListSize是奇数,则需要后移一位(越过中心结点)  
        if(linkListSize%2==1)   r= r->next;   
        while(r!=null)//未到链表尾部时   
        {  
            if(r->data == arr[i])  
            {  
                i--;   
                r = r->next;   
            }   
            else break;//跳出循环   
        }   
        if(i == -1){  
            printf("中心对称
    ");  
        }   
        else{  
            printf("非中心对称
    ");  
        }   
    }  
    

    它用了linkListSize函数,这个函数可以直接查询到链表的长度,这个代码
    他是先用一个数组来存放前面一半的数据,然后在来比较,它的方法很简
    单,主要是它让我知道了linkListSize这个函数,它可以直接查询到链表的
    长度,这样对比较简便了。

  • 相关阅读:
    [转]回车和换行
    计算机常见缩略词备忘录
    Linux多线程编程阅读链接
    字符串匹配KMP算法
    k8s测试集群部署
    搭建Vmware Harbor 镜像仓库
    GitLab搭建
    Gerrit2安装配置
    linux文件系统问题:wrong fs type, bad option, bad superblock
    Docker容器内不能联网的6种解决方案
  • 原文地址:https://www.cnblogs.com/gongshunde/p/8640846.html
Copyright © 2020-2023  润新知