博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构学习笔记1
阅读量:5163 次
发布时间:2019-06-13

本文共 2017 字,大约阅读时间需要 6 分钟。

下面是我在学习数据结构时的一些经验和感受,谢谢大家分享!

1.数据结构链表

  数组存储需要连续的内存空间,如果需要太多内存,可以通过链表来实现,链表是离散存储。

2.数据结构图
  求最短路径等不能通过链表,属实现,只能通过图实现。

3.数据存储一般分两步

  特定的数据类型(数据本身)
  特定的存储结构(数据和数据的关系)
  
  数据结构=个体+个体的关系
  算法=对存储数据的操作

4.算法

  解题的方法和步骤
  衡量算法的标准
      (1)时间复杂度:大概程序要执行的次数,而非执行的时间。
       (2)空间复杂度:执行过程中大概所占的最大内存。
       (3)难易程度:容易看懂,应用。
       (4)健壮性:稳定性。

5.数据结构的地位

  简单的可以说成数据库是数据结构狭义的简单化实现。学好数据结构,类似于数据库的实现会非常容易。
  程序=数据的存储+数据的操作+计算机执行的语言。
  但是学了数据结构不一定能做出什么东西,只会在以后的学习中提供更大的帮助。

6.指针
  指针式c语言的灵魂,即地址
  是内存单元的编号,从o开始的非负整数,(0--FFFFFFFF)即(1到4G-1)
  指针变量时存放内存单元地址的变量,指针的本质是操作受限的分负整数。

  指针的一个好处:在传参的时候可以节省内存,节省时间,如果要将一个200个字节的结构体数据传递给另外一个函数,如果用首地址指针就只需要4个字节就可以完成。

7.如何通过(无返回值)被调函数改变主调函授的值
  (1)实参为相关变量地址
  (2)形参以相关变量类型为类型的指针变量。
   (3)在被调函数中可以通过*形参变量名的方式改变主函数的值。

8.将一个整数转换为变量地址
   (int *)0xFFFFFFFF;表示将0xFFFFFFFF强制转换为地址变量

9.类能够比结构体更好的实现目标函数实现,结构体函数实现由缺陷。

  结构体是用户根据实际需要自己定义的复合数据类型。

10.java中可以给一个字符串变量直接赋值,但是C++里面不可以,只能通过strcpy实现(加上#include <string.h>头文件)
  java:st.name="lisi";
  C++ :strcpy(st.name,"lisi");

11.结构体变量不能加减,只能赋值,st1=st2;

   普通结构体变量结构体指针变量作为函数参数传递。

12.跨函数使用内存只能通过动态分配实现,因为动态分配的内存在释放之间都存在,而其他局部变量,函数结束,寿命也跟着结束,但是如果不释放,很可能造成内存泄露,这就是操作系统时间越长运行越慢的原因。

13.存储方式:
   线性结构:
   连续存储(数组)
   离散存储(链表)
            定义:
                     n个节点离散分配
         彼此通过指针连接
         每个节点只有一个前驱结点,每个节点只有一个后续节点
         首节点没有前驱结点,尾节点没有后续节点
 专业术语:
         首节点:第一个有效节点
   尾节点:最后一个有效节点
   头结点:第一个有效节点之前的那个节点,头结点并没有有效数据,头结点是为了方便对链表的操作。头结点的数据类型和首节点是一样的。
   头指针:指向头结点的指针变量
   尾指针:指向尾节点的指针变量
    确定一个链表只需要头指针一个参数:因为可以通过头指针推算出链表的其他所有信息。
 
    链表的分类:
               单链表
    双链表:每一个节点有两个指针域
    循环链表:能通过任何一个节点找到其他所有节点的单链表
    非循环链表
   算法:
        遍历
        查找
  销毁
  清空
  删除
  求长度
  排序

   线性结构中最常用的是堆栈和队列

   非线性结构:树,图

14.数组的定义
   struct arr
   {
    int * pBase;   //存储数组第一个元素的地址
    int len;  //数组所能容纳的最大元素的个数
    int cnt;  //当前数组有效元素个数
   };

void init_arr(struct arr* pArr,int length);  //初始化,需要指定对谁初始化,就是初始化数组的地址,长度等

{
  pArr->pBase=(int*)malloc(sizeof(int)*length);   //注意要加<malloc.h>
if(NULL==pArr->pBase)
{printf("动态内存分配失败!\n");
 exit(-1);//终止整个程序
}
else
{pArr->len=length;
 pArr->cnt=0;
}
}

bool append_arr();//追加

bool insert_arr();//插入
bool delete_arr();
int get();
bool is_empty();
bool is_full();
void sort_arr();
void show_arr();
void inversion_arr(); 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/stream2011/archive/2012/08/30/2663514.html

你可能感兴趣的文章
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
如何将应用完美迁移至Android P版本
查看>>
【转】清空mysql一个库中的所有表的数据
查看>>
基于wxPython的python代码统计工具
查看>>
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>