码迷,mamicode.com
首页 > 其他好文 > 详细

博客作业2---线性表

时间:2018-03-25 22:15:32      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:保存   sqli   print   头结点   bubuko   元素   变量   http   改变   

一、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中 
 }

博客作业2---线性表

标签:保存   sqli   print   头结点   bubuko   元素   变量   http   改变   

原文地址:https://www.cnblogs.com/xzjj/p/8641149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!