数据结构学习笔记1

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

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(); 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2012-08-30 12:35  stream2011  阅读(438)  评论(2)    收藏  举报