zoukankan      html  css  js  c++  java
  • 博客园作业02——线性表

    1.本周学习总结

    1.1思维导图

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

    本周我们学习了顺序表和链表的知识,自我感觉对它们已经有了初步的认识,但是可能因为链表相对于顺序表的操作可能会更加的复杂与抽象,对于一些相对复杂的操作可能还不是特别的熟悉,比如说逆置与插入,每次做题前都要想很久该怎么做,这其实就是对链表的基础掌握太不扎实。通过这一周数据结构的学习,我能很明显感觉到数据结构相较于c,会更加的理论化和抽象化,需要我们能更加深层的理解代码,要我们清楚的知道要怎么进行步骤。如果你只敲完代码,却不去真正理解,去想明白他的结构与变换方法,就会像我一样,敲完一题代码,过了几天,又把它的原理忘得一干二净。吸取了上次的教训,在今后的数据结构的学习中,我要更加频繁的去读代码,去理解代码,而不是一打完就晾在一旁,勤能补拙!
    

    2.PTA实验作业

    2.1.题目1:6-9 jmu-ds-有序链表合并

    2.1.1设计思路(伪代码)

    思路:先将两个链表的数据依次存入一个数组中,在对这个数组进行排序和删除重复元素的操作,再将这个数组通过尾插法插入一个新链表中,再将新链表的值赋给要返回的链表。
    伪代码:

    排序函数
     定义整形数组 a
     定义三个整型变量i=0,k,j
     LinkList p;
     p=p->next;
     while(p不为空)
       数据存入数组
       p移向下一个节点
       i++
    end while
    LinkList c;
    c=L2->next
    while(c不为空)
       数据存入数组
       c移向下一个节点;
       i++;
    end while
    for j=0 to i
      for k=0 to j
         冒泡法排序
       end for
     end for
    定义整型变量 q,w=0;
    删除数组里的重复元素
    LinkList s r L;
    定义一个整型变量 m
    用尾插法将数组数据写入一个链表
    L1=L;
    

    2.1.2代码截图


    2.1.3本题PTA提交列表说明

    说明

    • Q:一开始没想到用尾插法将数组的值写入
    • A:尾插法是一个很好的将数组的值输入链表的工具
    • Q:在数组里删除重复元素不太熟悉
    • A:我们以前的题目都是删数据后返回长度,对于这类的算法可能我接触的不多,最后想了很久终于想出来一种算法

    2.2.题目2:6-10 jmu-ds-有序链表的插入删除

    2.1.1设计思路(伪代码)

    思路:通过遍历链表找到插入位置进行插入,这样插入的得到的链表是有序的,在遍历链表得到相同的元素,继续删除,输出链表
    伪代码:

    插入函数
     LinkList p,r,q
     q = new LNode;
     p = L->next;
     r = L;
     q->data = e;
     q->next = NULL;
    while (p)
    if (p->data >= e)//寻找插入位置 	
      记录位置并插入
    end if
      后移
    end while
      q->next = p;
      r->next = q;
    删除函数
     if (L->next == NULL) return;
     LinkList p, r, c;
     p = r = L;
     c = L->next;
     while (r->next)
     if (c->data == e)//寻找删除元素 
      删除数据
     return;
    end if
     记录位置并后移
    end while
    cout << e <<"找不到!"<< endl;
    

    2.2.2代码截图

    2.2.3本题PTA提交列表说明

    说明

    • Q:没有按pta中的输出的要求的输出格式
    • A:以后这种东西我一定复制!!!!
    • Q:一开始忘记记录位置直接开始往下继续遍历链表
    • A:导致位置多移了一位

    2.3.题目3:7-1 两个有序序列的中位数 (25 分

    2.3.1设计思路(伪代码)

    思路:将两个有序表里的数据按顺序输入一个数组中,在输出这个数组中相应位置的元素
    伪代码:

    #include <iostream>
    #define MaxSize 100000
    using namespace std;
    typedef int ElemType; 
    typedef struct 
    {	
        int data[MaxSize];		//存放顺序表元素
        int length ;			//存放顺序表的长度
    } List;	
    typedef List *SqList;
    void CreateList(SqList &L,int n);//建顺序表 
    void LineNode(SqList &L1,SqList &L2,int n);//排序 
    int main() 
    {
    	定义两个整型变量i,n
    	新建两条链L1,L2
    	输入线性表元素个数 
    	CreateList(L1,n);//创建线性表
    	CreateList(L2,n);//创建线性表
    	LineNode(L1,L2,n);//排序 
    } 
    void CreateList(SqList &L,int n)
    {
    	尾插法建链表
    }
    void LineNode(SqList &L1,SqList &L2,int n)
    {
    	定义两个整型变量i,j和num,t都等于0
    	SqList L;	
    	定义一个整形数组
    	判断大小分别以小的数据写入数组,i与j要小于两条链的长度
    	长度翻倍
    	num=(n-1)*0.5;
    	cout<<b[num];
     } 
    
    
    

    2.3.2代码截图


    2.3.3本题PTA提交列表说明

    说明

    • Q:一开始直接将两个链表的元素写入数组,再在数组中进行冒泡法排序
    • A:导致时间复杂度过大,没有达到题目要求的时间限制
    • Q:输出时没把握好输出的位置,导致输出错误
    • A:题目叫你输出那个位置你就输出,不用相应的加减

    3、阅读代码

    3.1 题目

    从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。

    3.2 解题思路

    搜索整个线性表,查找最小值元素的位置,并记录该位置,然后用最后一个元素的值将其覆盖,并返回最小值。

    3.3 代码截图

    3.4 学习体会

    为什么不传递值,而传递地址?
    函数内部的都是局部变量,对这些变量的操作只在函数内部有效。细节一点儿,局部变量存放在计算机的寄存器中,不写入主存,也就不改变内存中的C代码(数据)。
    这里如果函数调用传递的是顺序表L,L就相当于局部变量,相当于复制了L,并不会修改最初的L。而如果引用L的地址,可以直接操作内存,修改的就是L,修改后的内容也会被写入L对应的存储空间。

  • 相关阅读:
    八皇后问题
    Catalan数与出栈顺序个数,Java编程模拟
    推荐系统中的协同过滤
    集成学习
    背包问题
    逆波兰表达式
    [leetcode]775. Global and Local Inversions
    [LeetCode]Minimum Moves to Equal Array Elements1,2
    链接属性
    常用表格属性
  • 原文地址:https://www.cnblogs.com/ashinluox/p/10629562.html
Copyright © 2011-2022 走看看