DS博客作业01--线性表

1.本周学习总结

1.1思维导图

1.2.谈谈你对线性表的认识及学习体会

    线性表的储存结构分为顺序存储结构和链式存储结构,对于顺序存储结构就由数组结构和长度组成,而链式存储结构就是利用链表来存取数据。相对于顺序表而言,链表所能存取的数据可以比较复杂,但是链表的操作相对于比较麻烦。应该对问题进行认真分析后再选择合理的存储结构来存储数据。而在本章节中,由于没有理解指针的用法,导致程序频繁出错,不过在反思下有不少的收获。

2.PTA实验作业

2.1.题目1: 区间删除数据

实现在顺序表中删除某个区间数据。需要实现下述的三个函数完成该功能。
实现函数:
void CreateList(SqList &L,int n);//建顺序表,L表示顺序表指针,n表示输入数据个数。 
void DelNode(SqList &L,int min,int max);//删除区间元素。min,max表示删除的区间 
void DispList(SqList L); //输出顺序表内容 ,数据间空格隔开,尾部不能有空格。

2.1.1设计思路

1.函数void CreateList(SqList &L,int n)设计
         L=new List;//为L指针申请动态内存
         for i=1 to i=n { cin>>L->data[i] }; //建立循环输入数据
         L->length=n; //用L->length顺序表元素个数n
2.函数void DelNode(SqList &L,int min,int max)设计
         int j=0 //为了重构数组,使得该数组从L->data[0]开始
         for i=1 to i=L->length
             if(L->data[i]>max||L->data[i]<min); //判断L->data[i]是否落在要求的区间内
                 若在区间(min,max)内 则运行L->data[j]=L->data[i] ; j++
                //将落在区间的 L->data[i] 的值给 L->data[j] ,进行数组重构 ,运行后 j 自增 1
        最后将重构的数组长度记作 j 即进行 L->length=j
3.函数void DispList(SqList L)设计
         运用for循环输出重构的顺序表顺序表

2.1.2代码截图

2.1.3本题PTA提交列表说明

    本题在定义L指针后没有分配动态空间

2.2.题目2 有序链表合并

已知两个递增链表序列L1与L2,2个链表都是带头结点链表。设计函数实现L1,L2的合并,合并的链表仍然递增有序,头结点为L1的头结点。 合并后需要去除重复元素。
1.输入格式: 输入分两行,先输入数据项个数,再输入数据项,数字用空格间隔。
2.输出格式: 在一行中输出合并后新的递增链表,数字间用空格分开,结尾不能有多余空格;

2.2.1 设计思路

函数void MergeList(LinkList &L1,LinkList L2)设计
//利用合并再进行冒泡排序处理两组数据的合并,对两组数据没有顺序的要求
    LinkList head,ptr; //定义两个结构体指针
    head=L1->next;//先将L1->next指针给head
    for ptr=head to ptr->=NULL  ptr->next=L2->next //遍历head找到尾结点后和L2->next连接
   //用类似于冒泡排序法对链表进行排序,并进行删除重复数据的操作
   for ptr1=head to ptr1->next!=NULL 
       for ptr2=head to ptr2->next!=NULL
            if(ptr2->data>ptr2->next->data) 将ptr2->data和ptr2->next->data进行数值交换
            if(ptr2->data==ptr2->next->data) 
            //判断重复后先用ptr3存取ptr2->next所存取的地址,再将ptr2->next和ptr2->next->next连接,最后释放ptr3的空间
                ptr3=ptr2->next ; 
                ptr2->next=ptr2->next->next ; 
                delete(ptr3) ;
   最后把head指针存取的地址赋给L1->next       

2.2.2 代码截图

2.2.3 本题PTA提交列表说明

 1.由于本题是在没有编译器的条件下直接在pta网页直接完成,语法错误造成编译错误
 2.在语法错误都解决的情况下,没有控制好for循环导致了错误
 3.最后是漏了删除重复数据的操作

2.3 题目3 一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

2.3.1 设计思路

先设计主函数main()
        SqList L1,L2;//定义指针变量L1,L2
	CreateList(L1,n);//建立顺序表L1
	CreateList(L2,m);//建立顺序表L2
	multiplicative(L1,L2);//输出乘法运算结果
	Add(L1,L2);//输出加法运算结果
函数void CreateList(SqList &L,int n)设计
        int ratio,index; //定义两个整形变量以提供输入数值的存储,这里ratio,index是指d输入多项式的指系数和指数
        for i=1 to i=n 输入radio和index 进而L->data[index]=ratio //数组下标为指数,内容为系数
函数void multiplicative(SqList &L1,SqList &L2)设计
        int a[2500] 新定义数组a来存取最终运算结果
        定义两个整形变量p,q 
        //p为了储存两个项系数相乘后的数值,q为了储存指数相加后的数值
        //(乘法的两项相乘就是系数相乘,指数相加)
         for i=0 to i=1000
             for j=0 to j=1000
                 p=(L1->data[i])*(L2->data[j]);//p储存两个项系数相乘后的数值
		 q=i+j;//q储存指数相加后的数值
                 a[q]=a[q]+p;//即 a[指数]=系数 将运算结果存入a数组中,注意系数应该是要累加的
          最后利用for循环输出a数组
函数void Add(SqList &L1,SqList &L2)设计
         for i=0 to i=1000
            如果 L1->data[i]+L2->data[i]的结果不为零,直接输出结果

2.3.2 代码截图




2.3.3 本题PTA提交列表说明

1.没有注意零式的输出格式
2.数组越界

3.阅读代码

3.1 题目 有序链表合并

已知两个递增链表序列L1与L2,2个链表都是带头结点链表。设计函数实现L1,L2的合并,合并的链表仍然递增有序,头结点为L1的头结点。 合并后需要去除重复元素。
1.输入格式: 输入分两行,先输入数据项个数,再输入数据项,数字用空格间隔。
2.输出格式: 在一行中输出合并后新的递增链表,数字间用空格分开,结尾不能有多余空格;

3.2 解题思路

1.本人方法 合并链表后进行冒泡法排序
2.该同学方法 用两个指针同时遍历两个链表,一边遍历一边比较和插入
3.两种方法优劣
   (1) 合并链表后进行冒泡法排序适用范围较广,可以用于两个无序链表的合并,但是时间复杂度相对最大
   (2) 用两个指针同时遍历两个链表,一边遍历一边比较和插入只能用于合并两个有序的链表,但是时间复杂度相对较小

3.3 代码截图

参考同学的代码

3.4 学习体会

    在设计出的程序能运行的条件下,时间复杂度和空间复杂度小的代码更胜一筹,而将时间复杂度和空间复杂度降到最小就依赖于程序的算法。今后应当学习多多学习和设计出好的算法,使代码更加简单优质
原文地址:https://www.cnblogs.com/syt666/p/10630059.html