《数据结构》线性表

  “太专注于知识,而忽略得来知识的方法,难以将知识迁移..”第一节课上听到的,感觉很有道理,不过自己尚未琢磨明白。

刚刚开始学《数据结构》这门课其实是没什么头绪的,但是坐在前排也算是给自己的一个动力去学习这门课程。没有很多的话说,直接上图。

  以上基本是我在课堂上的一些笔记,也算是小结了,不过有点简陋,再补充一些我认为比较重要的:

  

  *线性表都是逻辑上相邻,但物理上不一定相连,如数组是物理上相邻,而链表则是物理上不一定相邻。

  *链表中头结点存在的意义:(1)便于首元结点的处理。(2)便于空表和非空表的统一处理。亦即在边界和非边界非处理上保持操作的一致性。

  *创建链表时不论是头插法还是尾插法,都需要将单链表L初始化。否则头插法中的p->next就会变成野指针,而尾插法r->next会出错?

  *顺序表和链表各有优势,顺序表的空间利用率为1,而链表的空间利用率少于1;在进行插入删除操作(数据量足够大)时,链表的时间复杂度小于顺序表;在进行查询操作时时间复杂度不相上下。

  *合并链表时采用带尾指针的单循环链表效果更佳。

  *在有序表的合并中,采用归并排序时间复杂度为O(m+n)从而避免pta上的超时问题。

  毕竟学习是理论上的,时间才是检验真理的唯一标准。

  果不其然,在上机课的题目,看似自己已经做出来了,可是后面总有一个随机数而不是样例里的,而且自己不会debug,所以我自闭了,最后我手动检查,最后发现原来是把i++和j++放在a[k++]=p[i]前面了,导致下标完全改变,并且自己检查要半天才能弄出来,当时真的很自闭。。。

  

  正确代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 int main() 
 5 {
 6     int n,m,k=0;
 7     cin>>n>>m;
 8     int a[200005];    //开辟大数组存放相同元素 。 
 9     int*p=new int[n];
10     int*q=new int[m];
11     for(int i=0;i<n;i++)
12         cin>>p[i];
13     for(int i=0;i<m;i++)
14         cin>>q[i];
15     sort(p,p+n);    //以下两行均为调用函数使数组升序存放 。 
16     sort(q,q+m);
17     for(int i=0,j=0;i<n&&j<m;){
18         if(p[i]==q[j]){     //k为相同元素个数 ; 
19             a[k++]=p[i];    //对俩数组进行遍历,遇到相同则存放到大数组中。 同时下标都+1; 
20             i++;
21             j++;
22         }
23         if(p[i]<q[j])       //对于不相等的情况,则使俩数中较小的那个下标+1,再进行比较 。 
24             i++;
25         if(p[i]>q[j])
26             j++;
27     }
28     cout<<k<<endl;
29     for(int i=0;i<k;i++){
30         if(i!=k-1) cout<<a[i]<<" ";                //输出已存放的元素,最后一个元素不带空格 。 
31         else cout<<a[i];
32     }
33     return 0;
34 }

  回到宿舍做程序填空题时,不知道为什么自己没有办法集中精力去解决他,头绪是有的,如下图:

  

  但是想了想实现代码,不想想了,于是开始干其他无聊的事情,打打游戏,看看番,不知不觉就开始忘了这件事,于是又要重新弄,下次得改。

  说到参考的话,也就是抱紧班里acm几位大佬的腿毛。

  我觉得自己需要投入更多的时间去编程,

  http://www.docin.com/p-1586344893.html,看了下大神的笔记之类觉得自己就是个菜鸡。

  目标:下周继续写博客。

  

  “太专注于知识,而忽略得来知识的方法,难以将知识迁移..”

  

原文地址:https://www.cnblogs.com/jyf2018/p/10546061.html