第二周实验作业

一、PTA实验作业

题目1:7-1 最长连续递增子序列

2.设计思路:

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define MAXSIZE 100001
 4 
 5 typedef int ElemType;
 6 typedef struct LNode{
 7     ElemType Data[MAXSIZE];
 8     int length;
 9 }SqList; 
10 typedef SqList *List;
11 
12 List CreateSqList(List L);
13 void WriteSqList(List L,int n);
14 void FindSqList(List L1, List L2);
15 
16 
17 int main
18 {
19     定义变量n表示输入的正整数的个数
20     定义结构体指针变量L1(表示顺序表1),L2(表示顺序表2)
21     输入n
22     L1带入CreateSqList用来创建一个顺序表L1
23     L1带入WriteSqList用来给表L1中插入元素
24     L2带入CreateSqList用来创建一个顺序表L2
25     L1和L2带入FindSqList用来寻找L1中的最大递增子序列存到L2中
26     return 027 }
28 
29 List CreateSqList(List L)
30 {
31     给L申请存储空间malloc
32     初始化L的长度length为MAXSIZE
33     return L
34 }
35 
36 void WriteSqList(List L,int n)
37 {
38     定义变量i用来进行循环和当做表中数据下标
39     for i=0 to n-1 i++
40         scanf("%d",&L->Data[i])
41     给L->length赋值n
42 }
43 
44 void FindSqList(List L1, List L2)
45 {
46     定义变量i,j用于进行循环和做表中数据下标
47     for i=0 to L1->length i++
48     {
49         定义变量r用来记录子序列中元素的个数
50         for j=n to L1->length j++    
51         {
52             if L->data[j]<L->data[j+1]
53             {
54                 r++;
55                 将r存放进L2->data[i]中用于以后比较
56             }
57             else
58                 break
59         }
60     }
61     定义变量max用来在L2->data[i]中进行比较寻找最长子序列
62     定义变量f用来记录max的下表
63     for i=0 to L1->length i++
64     {
65         if(max<L2->data[i])
66         {
67             将L2->data[i]赋给max
68             将i赋给f
69         }
70     }  
71     for i=f to f+max i++
72     {
73          打印L1->data[i]打印最大子序列
74          打印“ ”
75     }  
76     打印 L1->data[f+max]打印出最大子序列的最大数
77 }

3.代码截图:

4.PTA提交列表说明:

编译错误:

在C程序中用了C++的指针的写法,“&”乱用了,删掉自定义函数中的“&”。

 

段错误:在为顺序表L申请空间时格式错误,L=(List *)malloc(sizeof(List))改为L=(类型名)malloc(sizeof(结构体名))

部分正确:n的范围定义错误实际错误实际位置与逻辑位置相差1所以应多定义1#define MAXSIZE 100001

题目二:jmu-ds-单链表逆置

1.设计思路:

 1 void CreateList(List &L,int n)
 2 {
 3     定义两个结构体指针变量r,s用来在插入节点是过渡
 4     定义变量i用来循环,e作为要插入的元素
 5     给L申请存储空间malloc
 6     r=L
 7     for i=0 to n i++
 8     {
 9         输入e
10         给s申请存储空间malloc
11         让s指向e
12         r->next=s
13         r=s
14     }
15     让r的下一个节点为NULL
16 }
17 
18 void ReverseList(List &L)
19 {
20     定义结构体指针变量f用来调出L中的节点数据
21     定义结构体指针变量q用来在尾插法中过渡用
22     定义结构体指针变量k用来在尾插法中过度用
23     定义变量i用于循环
24     定义数组a[]用来存放f调出的数据
25     f=L
26     while循环直到f=NULL
27     {
28          a[i]=f->data
29          f=f->next
30          i++
31     }
32     i=i-1让接下来的尾插法中从所需的数开始
33     k=L
34     for j=i to j>0 j--
35     {
36         为q申请存储空间
37         q->data=a[j]
38         k->next=q
39         k=q尾插法
40     }
41     k->next=NULL
42 }
43 
44 void PrintList(List L)
45 {
46     定义结构体指针变量p用来过渡
47     判断if( p指向的下一个节点为空)
48              输出NULL
49     while直到p为空
50     {
51         判断p指向的下一个节点是否为空
52             成立输出"p->data "
53         不成立输出"p->data"
54         p=p->next 
55     }
56 }

 

2.代码截图:

4.PTA提交列表说明:

首先是在放入PTA前一直存在错误,包括:1.程序中用到true和false头文件忘记加“stdlib.h”   2.在倒置时搞混了头插法和尾插法,头插法按顺序输出数据“先进后出”,尾插法按顺序输出数据“先进先出”(想逆置这段代码浪费了将近2个多小时)。

编译错误:将裁判员程序也一并粘贴进去了

题目三:两个有序链表序列的合并

1.设计思路:

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 #include <iostream>
 4 #include <malloc.h>
 5 
 6 typedef struct node{
 7    int data;
 8    struct node *next;
 9 }ListNode;
10 typedef ListNode *List;
11 
12 List InitList();
13 void WriteList(List S);
14 void AddList(List S1,List S2,List S3);
15 void PrintList(List S);
16 
17 int main()
18 {
19     定义结构体指针S1,S2,S3
20     将S1带入函数初始化建表
21     将S2带入函数初始化建表
22     将S3带入函数初始化建表
23     在Write函数中往S1中写入数据
24     在Write函数中往S2中写入数据
25     在Add函数中合并S1,S2并传给S3
26     PrintList(S3)打印S3
27     return 0;
28 }
29 
30 List InitList()
31 {
32     定义结构体指针S用于过渡
33     给结构体指针S申请存储空间
34     判断if(结构体指针S不为空) 返回NULL
35     否则else S->next=NULL
36     返回S
37 }
38 
39 
40 void WriteList(List S)
41 {
42     定义结构体指针q用于过渡
43     定义变量e用于当做输入数据的载体
44     输入数据scanf("%d",&e)
45     while(e>0)
46     {
47         给q申请存储空间
48         判断if(q不为空) 则返回重新进入Write函数 
49         q->data=e;
50         q->next=NULL;
51         S->next=q;
52         S=q;
53         scanf("%d",&e);
54     }
55     return;
56 }
57 
58 void AddList(List S1,List S2,List S3)
59 {
60     将S1从表头指向下一位next
61     将S2从表头指向下一位next
62     循环while(当S1!=NULL&&S2!=NULL)
63     {
64         判断if(S1->data>S2->data)已达到排序录入S3的目的
65         {
66             S3->next=S2;
67             S2=S2->next;
68         }
69         否则else
70         {
71             S3->next=S1;
72             S1=S1->next;
73         }
74         做完以上任意一项将S3往后移动一次
75     }
76     判断if(S1==NULL&&S2==NULL) 则返回重新进入本函数;
77     判断if(S1!=NULL)
78         S3->next=S1;
79     否则else S3->next=S2;
80     return;
81 }
82 
83 void PrintList(List S)
84 {
85     将S从表头指向下一位next  
86     判断if(S==NULL)已决定输出什么结果  
87     {  
88         打印("NULL");  
89         并结束;  
90     }  
91     循环while(当S)  
92     {  
93         判断if(S->next==NULL)决定输出方式已达到所要求的格式  
94             打印("%d",S->data);  
95        否则else printf("%d ",S->data);  
96         S=S->next;  
97     }  
98 }

2.代码截图:

 

3.PTA提交列表说明:

1.这道题在编译器上测试时由于int main后面未加括号导致一直无法编译;其次就是情况考虑不全经常落点一些情况

2.编译错误:在PTA提交的时候用成了C编译导致编译错误

 

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

1.顺序表PTA排名

2.链表PTA排名

 

3.我的总分

1分

三、本周学习总结

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

    在本周学习数据结构的时间安排上我并未付出很多时间,基本是只有上课时间和偶尔去图书馆的一部分时间用在了数据结构的学习上,于此的代价就是本周的任务尚未完成,以及所学只是很不牢固,是我在做PTA的过程中举步维艰,甚至有时别人认为很简单的一道题我必须用1+小时。因此我对自己的安排非常不满意,但我也一直在想该如何安排在所有所学科目上付出的时间,因此有鉴于今数据结构方面的极大退步,我接下来将在数据结构的学习上安排更多时间知道我牢固了前面的知识后再另作安排。

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

    首先线性表时具有相同特性的数据元素的一个有限序列,它包括顺序存储结构和链式存储结构,大致可分为:顺序表,链式表和有序表。线性表中数据元素之间的关系是一对一的关系,除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的,并且可以自由的删除或添加结点(这一点和数组比较像)。线性表是从 逻辑结构描述的数据结构而数组是从物理结构上描述的数据结构。

 

3.代码Git提交记录截图

 

 

 

posted @ 2018-03-24 20:00  Stephen-joker  阅读(277)  评论(2编辑  收藏  举报