您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习笔记(二)

2016-07-06 15:17 471 查看
数据结构学习笔记(二)

逻辑结构和物理结构之间没有--对应关系

         数据结构是由一组存储区和一组相关的函数构成的

         这组函数规定了这些存储区的使用方法

 

 

         队列 -        先进先出

         桟    -         先进后出

        

                   //双向链表演示

                 2

                 3 #include <stdlib.h>

                 4 /*

                 5 typedef struct node{

                 6

                 7    int number;

                 8    struct node * p_next;

                 9    struct node * p_pre;

                   10 }NODE;

                   11

                   12 typedef struct{

                   13     NODE head;

                   14     NODE tail;

                   15     struct NODE * p_cur;

                   16 }LINK;

                   17 */

                   18 //链表初始化

                   19 void link_init( LINK *p_link )

                   20 {

                   21

                   22     p_link->head.p_next = &p_link->tail;

                   23     p_link->tail.p_next = NULL;

                   24     p_link->tail.p_pre =&(p_link->head);

                   25     p_link->head.p_pre = NULL;

                   26

                   27     p_link->p_cur = NULL;

                   28

                   29 }

                   30

                   31 //链表清理函数

                   32 void link_deinit( LINK *p_link )

                   33 {

                   34    // NODE * pnode_i = NULL;

                   35

                   36     while ( p_link->head.p_next !=&p_link->tail )

                   37     {

                   38         NODE * pnode_first =&p_link->head;

                   39         NODE * pnode_mid =pnode_first->p_next;

                   40         NODE * pnode_last =pnode_mid->p_next;

                   41

                   42         pnode_first->p_next = pnode_last;

                   43         pnode_last->p_pre = pnode_first;

                   44

                   45         free( pnode_mid );

                   46         pnode_mid = NULL;

                   47     }

                   48

                   49     p_link->p_cur = NULL;

                   50 }

                   51

                   52 //统计有效节点个数

                   53 int link_size( const LINK* p_link )

                   54 {

                   55

                   56     const NODE * pnode_i = NULL;

                   57

                   58     int size = 0;

                   59

                   60     for( pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = p_node_i->p_next )

                   61     {

                   62         const NODE * pnode_first = pnode_i;

                   63         const NODE * pnode_mid =pnode_first->p_next;

                   64         const NODE * pnode_last =pnode_mid->p_next;

                   65

                   66         if( pnode_mid !=&(p_link->tail) )

                   67         {

                   68             size++;

                   69         }

                   70     }

                   71

                   72     return size;

                   73 }

                   74

                   75 //把新数字加入到链表的最后

                   76 void link_add_end( LINK *p_link, int num )

                   77 {

                   78     //NODE * pnode_i = NULL;

                   79

                   80     NODE * pnode_temp = NULL;

                   81

                   82     pnode_temp = (NODE *) malloc(sizeof(NODE));

                   83

                   84     if(!pnode_temp)

                   85     {

                   86         return;

                   87     }

                   88

                   89     pnode_temp->number = num;

                   90     pnode_temp->p_next = NULL;

                   91     pnode_tmep->p_pre = NULL;

                   92 /*

                   93     for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn    ode_i->p_next )

                   94     {

                   95         NODE * pnode_first = pnode_i;

                   96         NODE * pnode_mid =pnode_first->p_next;

                   97         NODE * pnode_last =pnode_mid->p_next;

                   98

                   99         if(pnode_mid ==&(p_link->tail))

                   100         {

                   101             pnode_first->p_next =pnode_temp;

                   102             pnode_temp->p_pre =pnode_first;

                   103

                   104             pnode_temp->p_next = pnode_mid;

                   105             pnode_mid->p_pre = pnode_temp;

                   106             break;

                   107         }

                   108     }

                   109 */

                   110

                   111     NODE * pnode_first =&(p_link->tail.p_pre);

              
4000
     112     NODE * pnode_mid = p_first->p_next;

                   113     NODE * pnode_last =pnode->mid->p_next

                   114

                   115       pnode_first->p_next =pnode_temp;

                   116     pnode_tmep->p_pre = pnode_first;

                   117

                   118     pnode_temp->p_next = pnode_mid;

                   119     pnode_mid->p_pre = pnode_temp;

                   120 }

                   121

                   122 //把新数字加入到链表头

                   123 void link_add_head( LINK* p_link, int num )

                   124 {

                   125     NODE * pnode_temp = NULL;

                   126     pnode_temp = (NODE *) malloc(sizeof(NODE));

                   127     if(!pnode_temp)

                   128     {

                   129         return;

                   130     }

                   131

                   132     pnode_temp->number = num;

                   133     pnode_temp->p_next = NULL;

                   134

                   135       NODE * pnode_first =&(p_link->head);

                   136       NODE * pnode_mid = pnode_first->p_next;

                   137     NODE * pnode_last = pnode_mid->p_next;

                   138 

                   139       pnode_first->p_next =pnode_temp;

                   140     pnode_temp->p_pre = pnode_first;

                   141

                   142     pnode_temp->p_next = pnode_mid;

                   143     pnode_mid->p_pre = pnode_temp;

                   144 }

                   145

                   146  //按大到小的顺序把新数字加入链表

                   147 void link_add_order( LINK* p_link, int num )

                   148 {

                   149

                   150     NODE * pnode_temp = NULL;

                   151     NODE * pnode_i = NULL;

                   152

                   153     pnode_temp = (NODE *) malloc (sizeof(NODE));

                   154     if( !pnode_temp )

                   155     {

                   156         return;

                   157     }

                   158

                   159     pnode_temp->number = num;

                   160     pnode_temp->p_next = NULL;

                   161

                   162

                   163     for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn    ode_i->p_next)

                   164     {

                   165         NODE * pnode_first = pnode_i;

                   66         NODE * pnode_mid =pnode_first->p_next;

                   7         NODE * pnode_last =pnode_mid->p_next;

                   8

                   9         if( pnode_mid ==&(p_link->head) || pnode_mid->number > num )

                   0         {

                   1             pnode_first->p_next =pnode_temp;

                   2             pnode_temp->p_pre =pnode_first;

                   3

                   4             pnode_temp->p_next = pnode_mid;

                   5             pnode_mid->p_pre = pnode_temp;

                   6

                   7             break;

                   8         }

                   9     }

                   0

                   1 }

                   2

                   3  //根据编号查找数字的函数

                   4  int search_by_pos( const LINK * p_link, intpos)

                   5  {

                   6      int cnt = 0;

                   7

                   8      const NODE * p_node = NULL;

                   9      for( p_node = &(p_link->head);p_node != &(p_link->tail); p_node = p_n    ode->p_next)

                   0      {

                   1          const NODE * pnode_first = p_node;

                   2          const NODE * pnode_mid =pnode_first->p_next;

                   3          const NODE * pnode_last =pnode_mid->p_next;

                   4

                   5          if(pnode_mid !=&(p_link->tail))

                   6          {

                   7              if(cnt == pos)

                   8              {

                   9                  return pnode_mid->number;

                   0              }

                   1          }

                   2

                   3          cnt++;

                   4      }

                   5

                   6      return -1;

                   7  }

                   8

                   9

                   0 //根据数字查找编号的函数

                   1  int link_search_val( const LINK * p_link, intval)

                   2  {

                   3      int cnt = 0;

                   4

                   5      const NODE * p_node = NULL;

                   6      for( p_node = &(p_link->head);p_node != &(p_link->tail); p_node = p_n    ode->p_next)

                   7      {

                   8          const NODE * pnode_first = p_node;

                   9          const NODE * pnode_mid =pnode_first->p_next;

                   0          const NODE * pnode_last =pnode_mid->p_next;

                   1

                   2          if(pnode_mid !=&(p_link->tail))

                   3          {

                   4              if(pnode_mid->number  == val)

                   5              {

                   6                  return cnt;

                   7              }

                   8          }

                   9

                   0          cnt++;

                   1      }

                   2

                   3      return -1;

                   4  }

                   5

                   6 //删除第一个有效节点

                   7 void link_remove_head( LINK* p_link )

                   8 {

                   9

                   0     if(p_link->head.p_next ==&(p_link->tail))

                   1     {

                   2         return;

                   3     }

                   4

                   5     NODE * pnode_first =&(p_link->head);

                   6     NODE * pnode_mid = pnode_first->p_next;

                   7     NODE * pnode_last = pnode_mid->p_next;

                   8

                   9     pnode_first->p_next = pnode_last;

                   0     pnode_last->p_pre = pnode_first;

                   1

                   2     free(pnode_mid);

                   3     pnode_mid = NULL;

                   4 }

                   5

                   6 //删除最后一个有效节点

                   7 void link_remove_tail( LINK* p_link )

                   8 {

                   9 /*

                   0     NODE * pnode_i = NULL;

                   1    

                   2     for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn    ode_i->p_next )

                   3     {

                   4         NODE * pnode_first = pnode_i;

                   5         NODE * pnode_mid =pnode_first->p_next;

                   6         NODE * pnode_last =pnode_mid->p_next;

                   7         if(pnode_last ==&(p_link->tail))

                   8         {

                   9             pnode_first->p_next =pnode_last;

                   0             pnode_last->p_pre =pnode_first;

                   1

                   2             free(pnode_mid);

                   3             pnode_mid = NULL;

                   4         }

                   5     }

                   6 */

                   7

                   8     if( p_link->head.p_next ==&(p_link->tail))//-------

                   9     {

                   0         return;

                   1     }

                   2

                   3     NODE * pnode_last =&(p_link->p_head);

                   4     NODE * pnode_mid = pnode_last->p_pre;

                   5     NODE * pnode_first = pnode_mid->p_pre;

                   6

                   7     pnode_first->p_next = pnode_last;

                   8     pnode_last->p_pre = pnode_first;

                   9

                   0     free(pnode_mid);

                   1     pnode_mid = NULL;

                   2 }

                   4 //删除某个数字所在的节点

                   5 void remove_num( LINK *p_link, int num )

                   6 {

                   7     NODE * pnode_i = NULL;

                   8

                   9     for(pnode_i = &(p_link->head);pnode_i != &(p_link->tail); pnode_i = pn    ode_i->p_next)

                   0     {

                   1         NODE * pnode_first = pnode_i;

                   2         NODE * pnode_mid =pnode_first->p_next;

                   3         NODE * pnode_last =pnode_mid->p_next;

                   4

                   5         if( pnode_mid !=&(p_link->tail) && pnode_mid->number == num )

                   6         {

                   7             pnode_first->p_next =pnode_last;

                   8             pnode_last->p_pre =pnode_first;

                   9             free(pnode_mid);

                   0             pnode_mid = NULL;

                   1             break;

                   2         }

                   3     }

                   4

                   5 }

 

                   8 //开始从前想向后遍历

                   9

                   0 void link_begin( LINK *p_link )

                   1 {

                   2     p_link->p_cur = &(p_link->head);

                   3 }

                   4

                   5 //获得后一个数字

                   6 int link_next( LINK *p_link, int * p_num )

                   7 {

                   8

                   9     if(!p_link->p_cur)

                   0     {

                   1         return 0;

                   2     }

                   3

b328
                   4     p_link->p_cur =p_link->p_cur->p_next;

                   5

                   6

                   7     if(p_link->p_cur ==&(p_link->tail))

                   8     {

                   9         p_link->p_cur = NULL;

                   0         return 0;

                   1     }

                   2

                   3     * p_num =p_link->p_cur->number;

                   4

                   5     return 1;

                   6 }

                   7

                   8 //从后向前遍历

                   9 void link_rbegin( LINK *p_link )

                   0 {

                   1     p_link-p_cur = &(p_link->tail)

                   2 }

                   3

                   4 //获得前一个数字

                   5 int link_prev( LINK *p_link, int * p_num )

                   6 {

                   7     if(!p_link->p_cur)

                   8     {

                   9         return 0;

                   0     }

                   1

                   2     p_link->p_cur =p_link->p_cur->p_pre;

                   3

                   4     if( p_link->p_cur ==&(p_link->head) )

                   5     {

                   6         p_link->p_cur = NULL;

                   7         return 0;

                   8     }

                   9

                   0     *p_num = p_link->p_cur->number;

                   1

                   2     return 1;

                   3

                  4}

续:数据结构学习笔记(三)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: