博客作业2---线性表

一、PTA实验作业

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

2. 设计思路

定义整形变量i,j=0
for i=0 to i<=L->Last
  if L->data[i]在要删除的区间内 
  	 j++
   else 移动数组L->data[i-j]=L->data[i]
 end for
 最后一个下标减少 L-Last-=j; 

3.代码截图

4.PTA提交列表说明

  • 碰到的问题
    对L->Last的理解错误,导致答案错误,data[]数组的下标是从0开始的,而顺序表元素的逻辑序号是从1开始的。

1.题目2:单链表逆置

2. 设计思路

void CreateList(List &L,int n){ //正序建表  
	 L=new ListNode 申请空间
	 L->next=NULL;
	 if n=0 return
	 定义 List r=L,s;
	 int i;
	 for i=0 to n  //尾插发 
	   s=new ListNode
	   输入s->data
	   r->next=s
	   r=s
	 end for 
	 r->next=NULL 
} 

 void ReverseList(List &L){ //逆序 
 	  List p,q
 	  p保存链表 p=L->next 
 	  L->next=NULL 重构链表
      while p!=NUNLL
	     q=p->next 记下后节点
		 头插法插入节点啊
	  end while 
}

 void PrintList(List L){
 	  int flag=0
	   L=L->next
	   if !L  输出NULL
	   while L!=NULL
	      if flag=1  
		     输出  " L->data" end if
		  else
		     输出 "L->data"
			 flag=1
			 end else
		  L=L->next
		end while  
 } 

3.代码截图

4.PTA提交列表说明

本题没有碰到问题

1.题目3:

2. 设计思路

加法:
void Add(LinkList L1,LinkList L2,LinkList &L3){
	 定义 LinkList p=L1->next,q=L2->next,r,s
	 L3申请空间
	 r=L3
	 while(p&&q){
	 	if p的指数大于q的指数{
		   	用s保存p,并用尾插法插入L3
		   	p指针后移 
			}
		else if p的指数大q的指数{
			 用s保存q,并用尾插法插入L3 
			 q指针后移 
		}
		else {
			 用s保存q与p的系数之和以及指数 
			  若系数之和为零则不插入,不为零则用尾插法插入L3 
			 q指针后移 
			 p指针后移 
		} 
	 } 
	 遍历p或q剩下的元素,用尾插法插入L3 
} 

乘法:
void Mul(LinkList L1,LinkList L2,LinkList &L3){
	  定义 LinkList p=L1->next,q=L2->next,pre,r,s
	 L3申请空间,L3->next=NULL;
	 while(p){
	 	每次遍历L2前让q的指针重新指向L2,q=L2->next
		 while(q){
		 	用s保存q与p所指向数据的系数乘积和指数之和
			 pre=L3;r=L3->next;
			 遍历L3,找到第一比q与p的指数之和大的数据,然后进行插入
	            若找到指数相等的,则进行系数相加;
			      若相加后系数之和为0,则进行删除; 
		 } 
	 }
} 

3.代码截图




4.PTA提交列表说明

  • 碰到的问题
    最开始用cout输出,输出的答案是按科学计数法,导致答案错误,试了半天,最后改成printf输出

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

1.顺序表PTA排名

2.链表PTA排名

3.我的总分:245

三、本周学习总结

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

对于本周的数据结构学习时间安排的有些分散,主要的时间还是安排在晚上,PTA是一次做好几个小时,然后隔了几天才再去做,上周5晚上就开始做了PTA,但后来到星期二才安排了时间继续做,中间隔得时间有点久,总的来说对于自己的时间按排有些不满意,以后的打算是每天的时间分配好,做PTA的时候不要求一次做好几题,有的时候做几个小时有的题目也做不出来,以后每天能做一、两题,这样安排时间会更合理一些。

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

线性表是具有相同特性的数据元素的一个有限序列。主要分为顺序表和链表。

顺序表:

结构

typedef struct{
    Elemtype data[] //存放顺序表中元素
    int length  //存放顺序表长度
}Sqlist

各种操作时间复杂度
初始化:O(1)
销毁:O(1)
判断是否为空表:O(1)
求顺序表长度:O(1)
输出顺序表:O(L->length)
求某个数据元素的值:O(1)
按某个元素值查找:O(L->length)
插入数据元素:O(n)
删除数据元素:O(n)

链表

链表分为单链表、双链表、循环链表、循环双链表

  • 单链表

结构

typedef struct{
    Elemtype data 1//存放链表中元素
    ...
    LinkLNode *next  //指向下个节点
}LinkLNode

各种操作时间复杂度
头插法建表:O(n)
尾插法建表:O(n)
初始化:O(1)
销毁:O(n)
判断是否为空表:O(1)
求链表长度:O(n)
输出链表:O(n)
求某个数据元素的值:O(n)
按某个元素值查找:O(n)
插入数据元素:O(n)
删除数据元素:O(n)

  • 双链表

结构

typedef struct{
    Elemtype data 1//存放链表中元素
    ...
    DLinkLNode *next  //指向下个节点
    DLinkLNode *prior  //指向前一个节点
}DLinkLNode
  • 循环链表

即单链表的尾结点指向头结点

  • 循环双链表

双链表的头尾结点相连

链表与顺序表各自的优点

顺序表在查找某个位置的元素是比链表跟快,但在删除和插入数据元素是,链表比顺序表更快,而且链表不要移动结点位置,只需改变结点的指向关系就可以实现。

3.代码Git提交记录截图

四、阅读代码

归并排序

#include<stdio.h>
void merge_sort(int r[],int s[],int m,int n); //实现归并排序 
 void merge(int r[],int s[],int x1,int x2,int x3);//实现一次归并 
void main()
{
	int a[11];
	int i;
	printf("输入10个数: \n");
	for(i=1;i<=10;i++) scanf("%d",&a[i]);
	merge_sort(a,a,1,10);
	printf("排序后的顺序是:");
	for(i=1;i<10;i++)
	  printf("%5d",a[i]);
	printf("\n";) 
 } 
 
 void merge_sort(int r[],int s[],int m,int n);
 	  int p;
 	  int t(20);
 	  if(m==n) s[m]=r[m];
 	  else{
 	  	p=(m+n)/2;
 	  	merge_sort(r,t,m,p); //调用函数将r[m]到r[p]归并成t[m]到t[p] 
 	  	merge_sort(r,t,p+1,n);//调用函数将r[p+1]到r[n]归并成t[p+1]到t[n] 
 	  	merge(t,s,m,p,n); //调用函数将前两部分归并到s[m]到[n]中	   }
 }
 void merge(int r[],int s[],int x1,int x2,int x3){
 	int i,j,k;
 	i=x1;j=x2+1;k=x1;
 	while((i<=x2)&&(j<=x3)) //筛选两部分中较小的元素放到数组s中 
       if(r[i]<=r[j])
       	  s[k++]=r[i++]; 
	   else
	   	  s[k++]=r[j++];
 	   while(i<=x2)
 	       s[k++]=r[i++];  //将x1 -- x2范围 内为比较的数顺次加到数组r中 
       while(j<=x3)
           s[k++]=r[j++]; //将x2+1 -- x3范围内为比较的数顺次加到数组r中 
 }
posted @ 2018-03-25 21:55  嘿嘿渣  阅读(310)  评论(2编辑  收藏  举报