数据结构读书笔记

来源:互联网 发布:金蝶科目初始数据录入 编辑:程序博客网 时间:2024/06/05 11:09
                                                                    第一章   关于数据结构

1.数据结构研究什么?(计算机加工的对象由数值——>非数值)

    将现实生活中大量而复杂的问题(非数值问题)以特定的数据类型(逻辑结构)和特定的存储结构(物理结构)保存到主存储器中,以及在此基础上为实现某个功能(删除、排序)相对应的操作。

2.数据的逻辑结构

3.存储结构(物理结构):

 1)顺序存储结构(借助元素在存储器中的相对位置)

 2)链式存储结构(借助元素存储地址的指针)

4.抽象数据类型ADT:

[cpp] view plaincopy
  1. ADT抽象数据类型名  
  2. {  
  3.    数据对象:<数据对象的定义>  
  4.    数据关系:<数据对象之间关系的定义>  
  5.    基本操作:<基本操作的定义>  
  6. }  

5、时间复杂度:

取决定性作用语句的重复次数

                                                                                  第二章    线性表

1.线性结构的基本特征:

1)集合中必存在唯一的一个“第一个元素”;

2)集合中必存在唯一的一个“最后元素”;

3)除最后元素外,均有唯一的后继;

4)除第一元素之外,均有唯一的前驱; 

2.ADT

[cpp] view plaincopy
  1. ADT List  
  2. {  
  3.   数据对象:D={ a1,a2, a3, ... an};  
  4.   数据关系:R={<a1, a2>, <a2, a3>, <a3, a4> … <an-1, an>};   
  5.   基本操作:  
  6.   InitList(&L);         //操作结果:构造线性表;  
  7.   DestroyList(&L);     //操作结果:销毁线性表;  
  8.   ListEmpty(L);        //操作结果:若L为空表,则返回TRUE,否则FALSE;  
  9.   ListLength(L);       //操作结果:返回L中元素个数;            
  10.   PriorElem(L,cur_e,&pre_e)//操作结果:cur_e是L的元素,但不是第一个  
  11.                            //则用pre_e返回它的前驱。若操作失败,pre_e无定义  
  12.   NextElem(L,cur_e,&next_e)//操作结果:cur_e是L的元素,但不是最后一个,  
  13.                            //则用next_e返回它的后继。若操作失败,next_e无定义    
  14.   GetElem(L,i,&e) //  1<= i <=LengthList(L) 操作结果:用e返回L中第i个元素的值。  
  15.   LocateElem(L,e,compare())//compare()是元素判定函数。返回L中第一个与e满足compare()的元素位序。  
  16.                            //若这样的元素不存在,则返回值为0。  
  17.   ListTraverse(L,visit( )) //依次对L的每个元素调用函数visit( ).一旦visit( )失败,则操作失败  
  18.   ClearList(&L)         //操作结果将L重置为空表。  
  19.   PutElem(L,i,&e)    //1<=i<=LengthList(L)  结果:L中第i个元素赋值为e  
  20.   ListInsert(&L,i,e) //1<=i <=LengthList(L) +1  结果:在L的第i个元素之前插入新的元素e,L的长度增1  
  21.   ListDelete(&L,i,&e)//1<=i <=LengthList(L) 结果:删除L的第i个元素,并用e返回其值,,L的长度减1  
  22. }ADT List  

3.顺序实现

 1)存储结构:

[cpp] view plaincopy
  1. #define LIST_INIT_SIZE   10  
  2. #define INCREAMENT   2  
  3. struct SqList  
  4. {  
  5.     ElemType * elem;  
  6.     int length;  
  7.     int listsize;  
  8. };  

 2)基本操作

[cpp] view plaincopy
  1. void InitList(SqList & L )  
  2. {  
  3.     L.elem   = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType) );  
  4.     L.length = 0;  
  5.     L.listsize = LIST_INIT_SIZE;  
  6. }  
  7. void DestroyList(SqList & L)  
  8. {  
  9.     free(L.elem);  
  10.     L.elem = NULL;  
  11.     L.length = 0;  
  12.     L.listsize = 0;  
  13. }  
  14. void ClearList( SqList & L)  
  15. {  
  16.     L.length = 0;  
  17. }  
  18. Status ListEmpty( SqList L)  
  19. {  
  20.     if( L.length != 0 )  
  21.         return FALSE;  
  22.     else  
  23.         return TRUE;  
  24. }  
  25. int ListLength(SqList L)  
  26. {  
  27.     return L.length;  
  28. }  
  29. Status GetElem(SqList L, int i , ElemType & e)  
  30. {  
  31.     if( i < 1 || i > L.length )  
  32.         return ERROR;  
  33.     e = *(L.elem + i - 1);  
  34.     return OK;  
  35. }   
  36. int LocateElem(SqList L,ElemType e, Status(*compare)(ElemType , ElemType))  
  37. {  
  38.     ElemType * p;  
  39.     p = L.elem;  
  40.     int i = 1;  
  41.     while(i < L.length && !(compare(e, *p)))  
  42.     {  
  43.         i++;  
  44.         p++;  
  45.      }  
  46.     if( i< L.length)  
  47.         return i;  
  48.     else  
  49.         return 0;  
  50. }  
  51. Status PriorElem(SqList L, ElemType cur_e, ElemType & pre_e)  
  52. {  
  53.     ElemType * p;  
  54.     p = L.elem + 1;   //p 和 i 之间进行合作  
  55.     int i = 2;  
  56.     while(i < L.length && *p!=cur_e)  
  57.     {  
  58.         i++;  
  59.         p++;  
  60.      }  
  61.     if( i< L.length)  
  62.     {  
  63.         pre_e = *(--p);  
  64.         return OK;  
  65.     }  
  66.     else  
  67.         return INFEASIBLE;  
  68. }  
  69. Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)  
  70.  { // 初始条件:顺序线性表L已存在  
  71.    // 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,  
  72.    //           否则操作失败,next_e无定义  
  73.    int i=1;  
  74.    ElemType *p=L.elem;  
  75.    while(i<L.length&&*p!=cur_e)  
  76.    {  
  77.      i++;  
  78.      p++;  
  79.    }  
  80.    if(i==L.length)  
  81.      return INFEASIBLE; // 操作失败  
  82.    else  
  83.    {  
  84.      next_e=*++p;  
  85.      return OK;  
  86.    }  
  87.  }  
  88. Status ListInsert(SqList & L, int i , ElemType e)  
  89. {  
  90.     if(i < 1 || i > L.length + 1)  
  91.         return ERROR;  
  92.     ElemType * newbase;  
  93.     if(L.length >= L.listsize)  
  94.     {  
  95.         
  96.       newbase = (ElemType *)realloc(L.elem,( L.listsize + INCREAMENT) * sizeof(ElemType));  
  97.       L.listsize = L.listsize + INCREAMENT;   
  98.       if(!newbase)  
  99.         exit(OVERFLOW);  
  100.       L.elem = newbase;  
  101.     }  
  102.     ElemType * p,*q;  
  103.     p = L.elem + L.length -1;  
  104.     q = L.elem + i -1;  
  105.     for(p = L.elem + L.length -1; p >= q;  --p)  
  106.     {  
  107.         *(p + 1) = * p;   
  108.     }     
  109.     *q = e;  
  110.     L.length = L.length + 1;  
  111.     return OK;  
  112. }  
  113.  Status ListDelete(SqList &L,int i,ElemType &e) // 算法2.5  
  114.  { // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)  
  115.    // 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1  
  116.    ElemType *p,*q;  
  117.    if(i<1||i>L.length) // i值不合法  
  118.      return ERROR;  
  119.    p=L.elem+i-1; // p为被删除元素的位置  
  120.    e=*p; // 被删除元素的值赋给e  
  121.    q=L.elem+L.length-1; // 表尾元素的位置  
  122.    for(++p;p<=q;++p) // 被删除元素之后的元素左移  
  123.      *(p-1)=*p;  
  124.    L.length--; // 表长减1  
  125.    return OK;  
  126.  }  
  127.  void ListTraverse(SqList L,void(*vi)(ElemType & ))  
  128.  { // 初始条件:顺序线性表L已存在  
  129.    // 操作结果:依次对L的每个数据元素调用函数vi()  
  130.    //           vi()的形参加'&',表明可通过调用vi()改变元素的值  
  131.    ElemType *p;  
  132.    int i;  
  133.    p=L.elem;  
  134.    for(i=1;i<=L.length;i++)  
  135.      vi(*p++);  
  136.    printf("\n");  
  137.  }  

4.链式实现

1)存储结构:

[cpp] view plaincopy
  1. struct LNode  
  2. {  
  3.     ElemType data;  
  4.     LNode * next;  
  5. };  
  6.   
  7. typedef LNode * LinkList ;  


 

2)基本操作:

[cpp] view plaincopy
  1. void InitList(LinkList &L)  
  2.  { // 操作结果:构造一个空的线性表L  
  3.    L=(LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点  
  4.    if(!L) // 存储分配失败  
  5.      exit(OVERFLOW);  
  6.    L->next=NULL; // 指针域为空  
  7.  }  
  8.  void DestroyList(LinkList &L)  
  9.  { // 初始条件:线性表L已存在。操作结果:销毁线性表L  
  10.    LinkList q;  
  11.    while(L)  
  12.    {  
  13.      q=L->next;  
  14.      free(L);  
  15.      L=q;  
  16.    }  
  17.  }  
  18.  void ClearList(LinkList L) // 不改变L  
  19.  { // 初始条件:线性表L已存在。操作结果:将L重置为空表  
  20.    LinkList p,q;  
  21.    p=L->next; // p指向第一个结点  
  22.    while(p) // 没到表尾  
  23.    {  
  24.      q=p->next;  
  25.      free(p);  
  26.      p=q;  
  27.    }  
  28.    L->next=NULL; // 头结点指针域为空  
  29.  }  
  30.  Status ListEmpty(LinkList L)  
  31.  { // 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE  
  32.    if(L->next) // 非空  
  33.      return FALSE;  
  34.    else  
  35.      return TRUE;  
  36.  }  
  37.  int ListLength(LinkList L)  
  38.  { // 初始条件:线性表L已存在。操作结果:返回L中数据元素个数  
  39.    int i=0;  
  40.    LinkList p=L->next; // p指向第一个结点  
  41.    while(p) // 没到表尾  
  42.    {  
  43.      i++;  
  44.      p=p->next;  
  45.    }  
  46.    return i;  
  47.  }  
  48.  Status GetElem(LinkList L,int i,ElemType &e) // 算法2.8  
  49.  { // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR  
  50.    int j=1; // j为计数器  
  51.    LinkList p=L->next; // p指向第一个结点  
  52.    while(p&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空  
  53.    {  
  54.      p=p->next;  
  55.      j++;  
  56.    }  
  57.    if(!p||j>i) // 第i个元素不存在  
  58.      return ERROR;  
  59.    e=p->data; // 取第i个元素  
  60.    return OK;  
  61.  }  
  62.  int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))  
  63.  { // 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)  
  64.     /*操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。 
  65.               若这样的数据元素不存在,则返回值为0*/  
  66.    int i=0;  
  67.    LinkList p=L->next;  
  68.    while(p)  
  69.    {  
  70.      i++;  
  71.      if(compare(p->data,e)) // 找到这样的数据元素  
  72.        return i;  
  73.      p=p->next;  
  74.    }  
  75.    return 0;  
  76.  }  
  77. Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)  
  78.  { // 初始条件: 线性表L已存在  
  79.    /* 操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, 
  80.               返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE*/  
  81.    LinkList q,p=L->next; // p指向第一个结点  
  82.    while(p->next) // p所指结点有后继  
  83.    {  
  84.      q=p->next; // q为p的后继  
  85.      if(q->data==cur_e)  
  86.      {  
  87.        pre_e=p->data;  
  88.        return OK;  
  89.      }  
  90.      p=q; // p向后移  
  91.    }  
  92.    return INFEASIBLE;  
  93.  }  
  94.  Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)  
  95.  { // 初始条件:线性表L已存在  
  96.  /*   操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, 
  97.               返回OK;否则操作失败,next_e无定义,返回INFEASIBLE*/  
  98.    LinkList p=L->next; // p指向第一个结点  
  99.    while(p->next) // p所指结点有后继  
  100.    {  
  101.      if(p->data==cur_e)  
  102.      {  
  103.        next_e=p->next->data;  
  104.        return OK;  
  105.      }  
  106.      p=p->next;  
  107.    }  
  108.    return INFEASIBLE;  
  109.  }  
  110. Status ListInsert(LinkList L,int i,ElemType e) // 算法2.9。不改变L  
  111.  { // 在带头结点的单链线性表L中第i个位置之前插入元素e  
  112.    int j=0;  
  113.    LinkList p=L,s;  
  114.    while(p&&j<i-1) // 寻找第i-1个结点  
  115.    {  
  116.      p=p->next;  
  117.      j++;  
  118.    }  
  119.    if(!p||j>i-1) // i小于1或者大于表长  
  120.      return ERROR;  
  121.    s=(LinkList)malloc(sizeof(LNode)); // 生成新结点  
  122.    s->data=e; // 插入L中  
  123.    s->next=p->next;  
  124.    p->next=s;  
  125.    return OK;  
  126.  }  
  127.  Status ListDelete(LinkList L,int i,ElemType &e) // 算法2.10。不改变L  
  128.  { // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值  
  129.    int j=0;  
  130.    LinkList p=L,q;  
  131.    while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前驱  
  132.    {  
  133.      p=p->next;  
  134.      j++;  
  135.    }  
  136.    if(!p->next||j>i-1) // 删除位置不合理  
  137.      return ERROR;  
  138.    q=p->next; // 删除并释放结点  
  139.    p->next=q->next;  
  140.    e=q->data;  
  141.    free(q);  
  142.    return OK;  
  143.  }  
  144.  void ListTraverse(LinkList L,void(*vi)(ElemType))  
  145.   //vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&不同  
  146.  { // 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi()  
  147.    LinkList p=L->next;  
  148.    while(p)  
  149.    {  
  150.      vi(p->data);  
  151.      p=p->next;  
  152.    }  
  153.    printf("\n");  
  154.  } 
原创粉丝点击