博客作业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("中心对称\n");  
    }   
    else{  
        printf("非中心对称\n");  
    }   
}  

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

posted on 2018-03-25 22:14  ifcan  阅读(267)  评论(2编辑  收藏  举报

导航