zoukankan      html  css  js  c++  java
  • 数据结构

    数据结构学习笔记

    数据:
    信息的载体,能够输入到计算机中,并且能被计算机识别,存储和处理的符号的总称

    数据元素:
    数据元素是数据的基本单位,称为记录

    数据项:
    数据元素由多个数据项组成

    结构:
    逻辑结构:
    集合结构:数据元素之间除了属于同一个集合外,没有其他任何关系

    线性结构:数据元素之间具有一对一的关系

    树形结构:数据元素之间具有一对多的关系

    图形结构:数据元素具有多对多的关系

    存储结构(物理结构):
    顺序存储结构:数据元素存储在连续分配的地址空间中

    链式存储结构:数据元素存储在任意合法的地址空间中,地址空间可以连续也可以不连续

    索引存储结构:数据元素在存储时建立附加的索引表

    散列(哈希)存储结构:很据key值,和特定的函数计算出数据元素的存储位置
    数据的操作:
    增、删、改、查

    程序 = 数据结构 + 算法

    算法:
    为了解决特定问题的步骤的描述

    算法的特性:
    输入、输出、有穷性、确定性、可行性

    算法的设计要求:
    正确性、可读性、健壮性、时间效率高和存储量低

    算法的时间复杂度:
    随着输入规模n的增加,算法的执行时间的增长率和算法执行次数的增长率保持一致。
    我们称为算法的渐近时间复杂度,简称算法的时间复杂度

    大O推导:
    1.使用常数1替代表达式中的加法常数项
    2.在修改后的表达式中,只保留最高阶次项
    3.如果最高阶次项存在且不为1,去掉最高阶次项的系数

    冒泡排序:
    T(n) = O(n^2)

    算法的空间复杂度:


    线性表:
    表中的数据元素具有线性结构(一对一)

    直接前驱:直接相邻的前一个数据元素
    直接后继:直接相邻的后一个数据元素

    特性:(非空表)
    1.a1是表头,没有直接前驱
    2.an是表尾,没有直接后继
    3.除了表头表尾外的数据元素有且只有一个直接前驱和一个直接后继

    顺序表:
    线性表的顺序存储结构
    list.c:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #define SIZE 20
      4 
      5 typedef struct list
      6 {
      7     int data[SIZE];//存数据元素
      8     int last;//表中最后一位有效数据元素的位置(下标)
      9 }list_t;//顺序表的类型
     10 //struct list == list_t  (int)
     11 
     12 //创建
     13 list_t * creat_list()
     14 {
     15     //申请空间
     16     list_t * list = malloc(sizeof(list_t));//    void *   list_t *
     17     if(list == NULL)
     18     {
     19         printf("空间申请失败!\n");
     20         return NULL;
     21     }
     22 
     23     //空表的初始化
     24     list->last = -1;
     25 
     26     //返回堆区申请的空间首地址
     27     return list;
     28 }
     29 
     30 //判满
     31 int isfull(list_t * list)
     32 {
     33     return list->last == (SIZE - 1);
     34 #if 0
     35     if(list->last == (SIZE - 1))
     36     {
     37         return 1;
     38     }
     39     else
     40     {
     41         return 0;
     42     }
     43 #endif
     44 }
     45 
     46 //判空
     47 int isnull(list_t * list)
     48 {
     49     return list->last == -1;
     50 }
     51 
     52 //从头增加
     53 int ins_head_list(list_t * list, int data)
     54 {
     55     //判满
     56     if(isfull(list))
     57     {
     58         printf("表为满,无法执行头增操作!\n");
     59         return -1;
     60     }
     61 
     62     //挪,从最后位置开始挪,将值赋值给后一个
     63     int i;
     64     for(i = list->last; i >= 0; i--)
     65     {
     66         list->data[i+1] = list->data[i];
     67     }
     68 
     69     //存入数据
     70     list->data[0] = data;
     71 
     72     //修改last的值
     73     list->last++;
     74     
     75     return 0;
     76 }
     77 
     78 //指定位置增加数据
     79 int ins_index_list(list_t * list, int data, int index)
     80 {
     81     //判断实施条件
     82     if(isfull(list) || index < 0 || index > list->last+1)//last+1:实现的是尾部增加数据
     83     {
     84         printf("增加数据,指定位置出错!\n");
     85         return -1;
     86     }
     87 
     88     //挪,从最后位置开始挪,到指定位置结束
     89     int i;
     90     for(i = list->last; i >= index; i--)
     91     {
     92         list->data[i+1] = list->data[i];
     93     }
     94 
     95     //存入数据
     96     list->data[index] = data;
     97 
     98     //修改last的值
     99     list->last++;
    100 
    101     return 0;
    102 }
    103 //从头删除
    104 int del_head_list(list_t * list)
    105 {
    106     //判空
    107     if(isnull(list))
    108     {
    109         printf("表为空,无法执行头删操作!\n");
    110         return -1;
    111     }
    112 
    113     //挪(删除),从头开始挪,将后面的值给前面
    114     int i;
    115     for(i = 0; i < list->last; i++)
    116     {
    117         list->data[i] = list->data[i+1];
    118     }
    119 
    120     //修改last值
    121     list->last--;
    122 
    123     return 0;
    124 }
    125 
    126 //指定位置删除数据
    127 int del_index_list(list_t * list, int index)
    128 {
    129     //判断实施条件
    130     if(isnull(list) || index < 0 || index > list->last)
    131     {
    132         printf("删除数据,指定位置出错!\n");
    133         return -1;
    134     }
    135 
    136     //挪(删除数据)
    137     int i;
    138     for(i = index; i < list->last; i++)
    139     {
    140         list->data[i] = list->data[i+1]; 
    141     }
    142 
    143     //修改last的值
    144     list->last--;
    145 
    146     return 0;
    147 }
    148 //打印
    149 int print_list(list_t * list)
    150 {
    151     //判空
    152     if(isnull(list))
    153     {
    154         printf("表为空,无法执行打印操作!\n");
    155         return -1;
    156     }
    157 
    158     //打印数据
    159     int i;
    160     for(i = 0; i <= list->last; i++)
    161     {
    162         printf("%d ", list->data[i]);
    163     }
    164     printf("\n");
    165 
    166     return 0;
    167 }
    168 
    169 //指定位置修改数据
    170 int change_list(list_t * list, int data, int index)
    171 {
    172     //判断实施条件
    173     if(isnull(list) || index < 0 || index > list->last)
    174     {
    175         printf("修改数据,指定位置出错!\n");
    176         return -1;
    177     }
    178 
    179     //指定位置修改数据
    180     list->data[index] = data;
    181 
    182     return 0;
    183 }
    184 
    185 //查找数据
    186 int locate_list(list_t * list, int data)
    187 {
    188     //判空
    189     if(isnull(list))
    190     {
    191         printf("表为空,无法执行查找操作!\n");
    192         return -1;
    193     }
    194 
    195     //遍历查找,返回下标
    196     int i;
    197     for(i = 0; i <= list->last; i++)
    198     {
    199         if(list->data[i] == data)
    200         {
    201             return i;
    202         }
    203     }
    204 
    205     //如果没找到,提示操作者
    206     printf("表中没有该数据!\n");
    207     return -1;
    208 }
    209 
    210 //清空
    211 int clean_list(list_t * list)
    212 {
    213     list->last = -1;
    214     return 0;
    215 }
    216 
    217 //销毁
    218 int dis_list(list_t * list)
    219 {
    220     free(list);
    221 
    222     return 0;
    223 }
    224 int main(int argc, const char *argv[])
    225 { 
    226     list_t * list = creat_list();//调用创建函数
    227     if(list == NULL)
    228     {
    229         printf("creat_list()执行出错!\n");
    230         return -1;
    231     }
    232 
    233     int i;
    234     for(i = 1; i <= 20; i++)
    235     {
    236         if(    ins_head_list(list, i*10) == 0)//执行20次从头增加数据函数
    237             print_list(list);
    238     }
    239     //print_list(list);
    240 
    241     for(i = 1; i <= 10; i++)
    242     {
    243         del_head_list(list);//执行10次从头删除函数
    244     }
    245     print_list(list);//打印函数
    246 
    247     ins_index_list(list, 666, 6);//调用指定位置增加数据函数
    248     print_list(list);
    249 
    250     del_index_list(list, 6);
    251     print_list(list);
    252 
    253     change_list(list, 666, 6);
    254     print_list(list);
    255 
    256     int ret = locate_list(list, 666);
    257     printf("ret:%d\n", ret);
    258 
    259     clean_list(list);
    260     print_list(list);
    261 
    262     dis_list(list);
    263     return 0;
    264 }
    list

    创建表、判空、判满、增(头增、指定位置增)、删(头删、指定位置删)、改、查、清空、销毁
    list_size.c(指定大小的顺序表)

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 
      5 typedef struct list
      6 {
      7     int * data;//存数据元素
      8     int size;//记录数据元素的个数
      9     int last;//表中最后一位有效数据元素的位置(下标)
     10 }list_t;//顺序表的类型
     11 //struct list == list_t  (int)
     12 
     13 //创建
     14 list_t * creat_list(int size)
     15 {
     16     //申请空间
     17     list_t * list = malloc(sizeof(list_t));//    void *   list_t *
     18     if(list == NULL)
     19     {
     20         printf("空间申请失败!\n");
     21         return NULL;
     22     }
     23     
     24     list->data = malloc(sizeof(int) * size);
     25     if(list->data == NULL)
     26     {
     27         return NULL;
     28     }
     29 
     30     list->size = size;//记录数据元素的个数
     31 
     32     //空表的初始化
     33     list->last = -1;
     34 
     35     //返回堆区申请的空间首地址
     36     return list;
     37 }
     38 
     39 //判满
     40 int isfull(list_t * list)
     41 {
     42     return list->last == (list->size - 1);
     43 #if 0
     44     if(list->last == (list->size - 1))
     45     {
     46         return 1;
     47     }
     48     else
     49     {
     50         return 0;
     51     }
     52 #endif
     53 }
     54 
     55 //判空
     56 int isnull(list_t * list)
     57 {
     58     return list->last == -1;
     59 }
     60 
     61 //从头增加
     62 int ins_head_list(list_t * list, int data)
     63 {
     64     //判满
     65     if(isfull(list))
     66     {
     67         printf("表为满,无法执行头增操作!\n");
     68         return -1;
     69     }
     70 
     71     //挪,从最后位置开始挪,将值赋值给后一个
     72     int i;
     73     for(i = list->last; i >= 0; i--)
     74     {
     75         list->data[i+1] = list->data[i];
     76     }
     77 
     78     //存入数据
     79     list->data[0] = data;
     80 
     81     //修改last的值
     82     list->last++;
     83     
     84     return 0;
     85 }
     86 
     87 //指定位置增加数据
     88 int ins_index_list(list_t * list, int data, int index)
     89 {
     90     //判断实施条件
     91     if(isfull(list) || index < 0 || index > list->last+1)//last+1:实现的是尾部增加数据
     92     {
     93         printf("增加数据,指定位置出错!\n");
     94         return -1;
     95     }
     96 
     97     //挪,从最后位置开始挪,到指定位置结束
     98     int i;
     99     for(i = list->last; i >= index; i--)
    100     {
    101         list->data[i+1] = list->data[i];
    102     }
    103 
    104     //存入数据
    105     list->data[index] = data;
    106 
    107     //修改last的值
    108     list->last++;
    109 
    110     return 0;
    111 }
    112 //从头删除
    113 int del_head_list(list_t * list)
    114 {
    115     //判空
    116     if(isnull(list))
    117     {
    118         printf("表为空,无法执行头删操作!\n");
    119         return -1;
    120     }
    121 
    122     //挪(删除),从头开始挪,将后面的值给前面
    123     int i;
    124     for(i = 0; i < list->last; i++)
    125     {
    126         list->data[i] = list->data[i+1];
    127     }
    128 
    129     //修改last值
    130     list->last--;
    131 
    132     return 0;
    133 }
    134 
    135 //指定位置删除数据
    136 int del_index_list(list_t * list, int index)
    137 {
    138     //判断实施条件
    139     if(isnull(list) || index < 0 || index > list->last)
    140     {
    141         printf("删除数据,指定位置出错!\n");
    142         return -1;
    143     }
    144 
    145     //挪(删除数据)
    146     int i;
    147     for(i = index; i < list->last; i++)
    148     {
    149         list->data[i] = list->data[i+1]; 
    150     }
    151 
    152     //修改last的值
    153     list->last--;
    154 
    155     return 0;
    156 }
    157 //打印
    158 int print_list(list_t * list)
    159 {
    160     //判空
    161     if(isnull(list))
    162     {
    163         printf("表为空,无法执行打印操作!\n");
    164         return -1;
    165     }
    166 
    167     //打印数据
    168     int i;
    169     for(i = 0; i <= list->last; i++)
    170     {
    171         printf("%d ", list->data[i]);
    172     }
    173     printf("\n");
    174 
    175     return 0;
    176 }
    177 
    178 //指定位置修改数据
    179 int change_list(list_t * list, int data, int index)
    180 {
    181     //判断实施条件
    182     if(isnull(list) || index < 0 || index > list->last)
    183     {
    184         printf("修改数据,指定位置出错!\n");
    185         return -1;
    186     }
    187 
    188     //指定位置修改数据
    189     list->data[index] = data;
    190 
    191     return 0;
    192 }
    193 
    194 //查找数据
    195 int locate_list(list_t * list, int data)
    196 {
    197     //判空
    198     if(isnull(list))
    199     {
    200         printf("表为空,无法执行查找操作!\n");
    201         return -1;
    202     }
    203 
    204     //遍历查找,返回下标
    205     int i;
    206     for(i = 0; i <= list->last; i++)
    207     {
    208         if(list->data[i] == data)
    209         {
    210             return i;
    211         }
    212     }
    213 
    214     //如果没找到,提示操作者
    215     printf("表中没有该数据!\n");
    216     return -1;
    217 }
    218 
    219 //清空
    220 int clean_list(list_t * list)
    221 {
    222     list->last = -1;
    223     return 0;
    224 }
    225 
    226 //销毁
    227 int dis_list(list_t * list)
    228 {
    229     free(list->data);
    230     free(list);
    231 
    232     return 0;
    233 }
    234 
    235 int dis_list1(list_t ** list)
    236 {
    237     free((*list)->data);
    238     free(*list);
    239     *list = NULL;
    240 
    241     return 0;
    242 }
    243 
    244 int main(int argc, const char *argv[])
    245 { 
    246     list_t * list = creat_list(20);//调用创建函数
    247     if(list == NULL)
    248     {
    249         printf("creat_list()执行出错!\n");
    250         return -1;
    251     }
    252 
    253     int i;
    254     for(i = 1; i <= 20; i++)
    255     {
    256         if(    ins_head_list(list, i*10) == 0)//执行20次从头增加数据函数
    257             print_list(list);
    258     }
    259     //print_list(list);
    260 
    261     for(i = 1; i <= 10; i++)
    262     {
    263         del_head_list(list);//执行10次从头删除函数
    264     }
    265     print_list(list);//打印函数
    266 
    267     ins_index_list(list, 666, 6);//调用指定位置增加数据函数
    268     print_list(list);
    269 
    270     del_index_list(list, 6);
    271     print_list(list);
    272 
    273     change_list(list, 666, 6);
    274     print_list(list);
    275 
    276     int ret = locate_list(list, 666);
    277     printf("ret:%d\n", ret);
    278 
    279     clean_list(list);
    280     print_list(list);
    281 
    282 //  dis_list(list);
    283     dis_list1(&list);
    284     printf("%p\n", list);
    285     return 0;
    286 }
    list_size

    链表:
    线性表的链式存储结构
    link.c(单向链表)

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef struct node
      5 {
      6     int data;//数据域
      7     struct node * next;//指针域,存放下一个结点的地址
      8 }link_t;//单链中结点的类型
      9 
     10 //创建
     11 link_t * creat_link()
     12 {
     13     //申请头结点的空间
     14      link_t * head = malloc(sizeof(link_t));
     15      if(head == NULL)
     16      {
     17          printf("头结点申请失败!\n");
     18         return NULL;
     19      }
     20 
     21      head->next = NULL;//头结点中的指针域初始化
     22 
     23      return head;//返回申请的头结点的地址
     24 }
     25 
     26 //判空
     27 int isnull(link_t * head)
     28 {
     29     return head->next == head;
     30 }
     31 
     32 //头增
     33 int ins_head_link(link_t * head, int data)
     34 {
     35     //申请新结点的空间
     36     link_t * newnode = malloc(sizeof(link_t));
     37     
     38     //存入数据
     39     newnode->data = data;
     40 
     41     //将新结点连入到链表中
     42     newnode->next = head->next;//先修改新结点的后继
     43     head->next = newnode;//修改头结点的后继
     44     
     45     return 0;
     46 }
     47 
     48 //指定位置(相对位置)增加数据
     49 int ins_index_link(link_t * head, int data, int index)
     50 {
     51     if(index < 0)
     52     {
     53         printf("增加数据,指定位置过小!\n");
     54         return -1;
     55     }
     56 
     57     //偏移到指定位置到前一个结点处
     58     while(index--)
     59     {
     60         head = head->next;
     61         if(head == NULL) 
     62         {
     63             printf("增加数据,指定位置过大!\n");
     64             return -1;
     65         }
     66     }
     67 
     68     ins_head_link(head,data);//直接调用头增函数
     69 
     70     return 0;
     71 }
     72 
     73 //头删
     74 int del_head_link(link_t * head)
     75 {
     76     //判空
     77     if(isnull(head))
     78     {
     79         printf("表为空,无法执行删除操作!\n");
     80         return -1;
     81     }
     82 
     83     //备份要删除的结点
     84     link_t * temp = head->next;
     85 
     86     //删除
     87     head->next = temp->next;//head->next = head->next->next;
     88 
     89     //释放
     90     free(temp);
     91 
     92     return 0;
     93 }
     94 
     95 //指定位置删除
     96 int del_index_link(link_t * head, int index)
     97 {
     98     //判断实施条件
     99     if(isnull(head) || index < 0)
    100     {
    101         printf("删除数据,指定位置过小!\n");
    102         return -1;
    103     }
    104     
    105     //偏移
    106     while(index--)
    107     {
    108         head = head->next;
    109         if(head->next == NULL)//判断偏移后结点的下一个结点是否存在
    110         {
    111             printf("删除数据,指定位置过大!\n");
    112             return -1;
    113         }
    114     }
    115 
    116     //删除数据
    117     del_head_link(head);
    118 
    119     return 0;
    120 }
    121 //打印
    122 int print_link(link_t * head)
    123 {
    124     if(isnull(head))//判空
    125     {
    126         printf("表为空,无法执行打印操作!\n");
    127         return -1;
    128     }
    129 
    130     head = head->next;//跳过头结点
    131     while(head != NULL)//判断不为空就打印数据域里面的值
    132     {
    133         printf("%d ", head->data);
    134         head = head->next;
    135     }
    136     printf("\n");
    137 
    138     return 0;
    139 }
    140 
    141 //指定位置修改数据
    142 int change_link(link_t * head, int data, int index)
    143 {
    144     //指定位置过小
    145     if(isnull(head) || index < 0)
    146     {
    147         printf("修改数据,指定位置过小!\n");
    148         return -1;
    149     }
    150 
    151     //偏移
    152     while(index--)
    153     {
    154         head = head->next;
    155         if(head->next == NULL)
    156         {
    157             printf("修改数据,指定位置过大!\n");
    158             return -1;
    159         }
    160     }
    161 
    162     //修改
    163     head->next->data = data;
    164 
    165     return 0;
    166 }
    167 
    168 //查找数据
    169 link_t * locate_link(link_t * head, int data)
    170 {
    171     //判空
    172     if(isnull(head))
    173     {
    174         printf("表为空,无法执行查找操作!\n");
    175         return NULL;
    176     }
    177 
    178     //遍历查找,返回前一个结点的地址,方便进行对结点数据操作
    179     while(head->next != NULL)
    180     {
    181         if(head->next->data == data)
    182         {
    183             return head;
    184         }
    185         head = head->next;//量的改变
    186     }
    187 
    188     //没有找到
    189     printf("表中没有该数据!\n");
    190 
    191     return NULL;
    192 }
    193 
    194 //清空
    195 int clean_link(link_t * head)
    196 {
    197     while(!isnull(head))
    198     {
    199         del_head_link(head);
    200     }
    201     return 0;
    202 }
    203 
    204 //销毁
    205 int dis_link(link_t * head)
    206 {
    207     clean_link(head);
    208     free(head);
    209     return 0;
    210 }
    211 
    212 //逆向输出(临时链表)
    213 int reprint_link(link_t * head)
    214 {
    215     //创建临时链表
    216     link_t * temp = creat_link();
    217 
    218     //判断原链表数据结点不为空,执行临时链表从头增加数据
    219     while(head->next != NULL)
    220     {
    221         ins_head_link(temp, head->next->data);
    222         head = head->next;
    223     }
    224 
    225     //打印临时链表
    226     print_link(temp);
    227 
    228     //销毁临时链表
    229     dis_link(temp);
    230 
    231     return 0;
    232 }
    233 
    234 //递归实现逆向输出
    235 void reprint_link1(link_t * head)
    236 {
    237     //递归结束条件
    238     if(head->next == NULL)
    239     {
    240         return ;
    241     }
    242     //自己调用自己
    243     reprint_link1(head->next);
    244 
    245     //打印
    246     printf("%d ",head->next->data);
    247 }
    248 
    249 int main(int argc, const char *argv[])
    250 {
    251     link_t * link = creat_link();
    252     if(link == NULL)
    253     {
    254         return -1;
    255     }
    256 
    257     int i;
    258     for(i = 1; i <= 20; i++)
    259     {
    260         ins_head_link(link, i*10);
    261     }
    262     print_link(link);
    263 
    264     for(i = 1; i <= 10; i++)
    265     {
    266         del_head_link(link);
    267     }
    268     print_link(link);
    269 
    270     ins_index_link(link, 666, 6);
    271     print_link(link);
    272 
    273     del_index_link(link, 6);
    274     print_link(link);
    275     
    276     change_link(link, 666, 6);
    277     print_link(link);
    278 
    279     link_t * ret = locate_link(link, 666);
    280     if(ret != NULL)
    281     {
    282         del_head_link(ret);
    283     }
    284     print_link(link);
    285 
    286     printf("逆向输出1:");
    287     reprint_link(link);
    288 
    289     printf("逆向输出2:");
    290     reprint_link1(link);
    291     printf("\n");
    292 
    293 
    294     clean_link(link);
    295     print_link(link);
    296 
    297     dis_link(link);
    298 
    299     return 0;
    300 }
    link

    dblink.c(双向链表)

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct node
     5 {
     6     int data;//数据域
     7     struct node * front;//指针域,指向前一个结点
     8     struct node * next;//指向后一个结点
     9 }dblink_t;//双向链表的结点类型
    10 
    11 
    12 //创建
    13 dblink_t * creat_dblink()
    14 {
    15     //申请头尾结点空间
    16     dblink_t * head = malloc(sizeof(dblink_t));
    17     if(head == NULL)
    18     {
    19         printf("头结点申请失败!\n");
    20         return NULL;
    21     }
    22 
    23     dblink_t * tail = malloc(sizeof(dblink_t));    
    24     if(tail == NULL)
    25     {
    26         printf("尾结点申请失败!\n");
    27         return NULL;
    28     }
    29 
    30     //初始化
    31     head->next = tail;
    32     head->front = NULL;
    33     tail->next = NULL;
    34     tail->front = head;
    35 
    36     //返回申请空间的首地址
    37     return head;
    38 }
    39 
    40 
    41 int main(int argc, const char *argv[])
    42 {
    43     dblink_t * dblink = creat_dblink();
    44     if(dblink == NULL)
    45     {
    46         return -1;
    47     }
    48 
    49     
    50     return 0;
    51 }
    dblink 
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef struct node
      5 {
      6     int data;//数据域
      7     struct node * front;//指针域,指向前一个结点
      8     struct node * next;//指向后一个结点
      9 }dblink_t;//双向链表的结点类型
     10 
     11 
     12 //创建
     13 dblink_t * creat_dblink()
     14 {
     15     //申请头尾结点空间
     16     dblink_t * head = malloc(sizeof(dblink_t));
     17     if(head == NULL)
     18     {
     19         printf("头结点申请失败!\n");
     20         return NULL;
     21     }
     22 
     23     dblink_t * tail = malloc(sizeof(dblink_t));    
     24     if(tail == NULL)
     25     {
     26         printf("尾结点申请失败!\n");
     27         return NULL;
     28     }
     29 
     30     //初始化
     31     head->next = tail;
     32     head->front = NULL;
     33     tail->next = NULL;
     34     tail->front = head;
     35 
     36     //返回申请空间的首地址
     37     return head;
     38 }
     39 
     40 //判空
     41 int isnull(dblink_t * head)
     42 {
     43     return head->next->next == NULL;
     44 }
     45 
     46 //头增
     47 int ins_head_dblink(dblink_t * head, int data)
     48 {
     49     //新节点申请空间
     50     dblink_t * newnode = malloc(sizeof(dblink_t));
     51 
     52     //存入数据
     53     newnode->data = data;
     54 
     55     //将新结点连入到链表中
     56     newnode->next = head->next; //修改新结点的后继
     57     newnode->front = head;//修改新结点的前驱
     58     
     59     head->next->front = newnode;//1.修改head->next的前驱
     60     head->next = newnode;//修改head的后继
     61 
     62 #if 0
     63     head->next = newnode;//2
     64     newnode->next->front = newnode;
     65 
     66     newnode->next->front = newnode;//3   1,2,3所对应的2句话可以互换
     67     newnode->front->next = newnode;
     68 
     69 #endif
     70     return 0;
     71 }
     72 
     73 //头删
     74 int del_head_dblink(dblink_t * head)
     75 {
     76     //判空
     77     if(isnull(head))
     78     {
     79         printf("表为空,无法执行删除操作!\n");
     80         return -1;
     81     }
     82 
     83     //备份
     84     dblink_t * temp = head->next;
     85 
     86     //删除
     87     head->next = temp->next;
     88     temp->next->front = head;
     89 
     90     //释放
     91     free(temp);
     92 
     93     return 0;
     94 }
     95 //打印
     96 int print_dblink(dblink_t * head)
     97 {
     98     if(isnull(head))
     99     {
    100         printf("表为空,无法执行打印操作!\n");
    101         return -1;
    102     }
    103 
    104     //正向打印
    105     printf("正向打印:");
    106     while(head->next->next != NULL)
    107     {
    108         head = head->next;
    109         printf("%d ", head->data);
    110     }
    111     printf("\n");
    112     
    113     //逆向打印    
    114     printf("逆向打印:");
    115     while(head->front != NULL)
    116     {
    117         printf("%d ",head->data);
    118         head = head->front;
    119     }
    120     printf("\n");
    121 
    122 
    123     return 0;
    124 }
    125 
    126 //修改
    127 int change_dblink(dblink_t * head, int data, int index)
    128 {
    129     //判断
    130     if(isnull(head) || index < 0)
    131     {
    132         printf("修改数据,指定位置过小!\n");
    133         return -1;
    134     }
    135 
    136     //偏移
    137     while(index--)//while(index);index = index-1;
    138     {
    139         head = head->next;
    140         if(head->next->next == NULL)
    141         {
    142             printf("修改数据,指定位置过大!\n");
    143             return -1;        
    144         }
    145     }
    146 
    147     //修改
    148     head->next->data = data;
    149 
    150     return 0;
    151 }
    152 
    153 //查找
    154 dblink_t * locate_dblink(dblink_t * head, int data)
    155 {
    156     //判空
    157     if(isnull(head))
    158     {
    159         printf("表为空,无法执行查找操作!\n");
    160         return NULL;
    161     }
    162 
    163     //遍历查找,返回前一个结点的地址
    164     while(head->next->next != NULL)
    165     {
    166         if(head->next->data == data)
    167         {
    168             return head;
    169         }
    170         head = head->next;
    171     }
    172 
    173     //没有找到
    174     printf("表中没有该数据!\n");
    175     return NULL;
    176 }
    177 
    178 //清空
    179 int clean_dblink(dblink_t * head)
    180 {
    181     while(!isnull(head))
    182     {
    183         del_head_dblink(head);
    184     }
    185     return 0;
    186 }
    187 
    188 //销毁
    189 int dis_dblink(dblink_t * head)
    190 {
    191     clean_dblink(head);
    192     free(head->next);
    193     free(head);
    194 
    195     return 0;
    196 }
    197 int main(int argc, const char *argv[])
    198 {
    199     dblink_t * dblink = creat_dblink();
    200     if(dblink == NULL)
    201     {
    202         return -1;
    203     }
    204 
    205     int i;
    206     for(i = 1; i <= 20; i++)
    207     {
    208         ins_head_dblink(dblink, i * 10);
    209     }
    210     print_dblink(dblink);
    211     
    212     for(i = 1; i <= 10; i++)
    213     {
    214         del_head_dblink(dblink);
    215     }
    216     print_dblink(dblink);
    217 
    218     change_dblink(dblink, 666, 6);    
    219     print_dblink(dblink);
    220 
    221     dblink_t * ret = locate_dblink(dblink, 666);
    222     if(ret != NULL)
    223     {
    224         del_head_dblink(ret);
    225     }
    226     print_dblink(dblink);
    227 
    228     clean_dblink(dblink);
    229     print_dblink(dblink);
    230 
    231     dis_dblink(dblink);
    232 
    233     return 0;
    234 }
    dblink2

    link_c.c(单向循环链表)

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 typedef struct node
     4 {
     5     int data;
     6     struct node * next;
     7 }link_t;
     8 
     9 //创建
    10 link_t * creat_link()
    11 {
    12     //申请空间
    13     link_t * head = malloc(sizeof(link_t));
    14     if(head == NULL)
    15     {
    16         printf("头结点空间申请失败!\n");
    17         return NULL;
    18     }
    19 
    20     //初始化
    21     head->next = head;
    22 
    23     return head;
    24 }
    25 
    26 //判空
    27 int isnull(link_t * head)
    28 {
    29     return head->next == head;
    30 }
    31 
    32 //头增
    33 int ins_head_link(link_t * head, int data)
    34 {
    35     //申请空间
    36     link_t * newnode = malloc(sizeof(link_t));
    37 
    38     //存入数据
    39     newnode->data = data;
    40 
    41     //将新节点连入链表中
    42     newnode->next = head->next;
    43     head->next = newnode;
    44 
    45     return 0;
    46 }
    47 
    48 //打印
    49 int print_link(link_t * head)
    50 {
    51     //判空
    52     if(isnull(head))
    53     {
    54         printf("表为空,无法执行打印操作!\n");
    55         return -1;
    56     }
    57 
    58     //标记头结点
    59     link_t * temp = head;
    60 
    61     //跳过头结点
    62     head = head->next;
    63 
    64     //遍历打印
    65     while(head != temp)
    66     {
    67         printf("%d ", head->data);
    68         head = head->next;    
    69     }
    70     printf("\n");
    71 
    72     return 0;
    73 }
    74 int main(int argc, const char *argv[])
    75 {
    76     link_t * link = creat_link();
    77     if(link == NULL)
    78     {
    79         return -1;
    80     }
    81 
    82     int i;
    83     for(i = 1; i <= 20; i++)
    84     {
    85         ins_head_link(link, i*10);
    86     }
    87     print_link(link);
    88 
    89     return 0;
    90 }
    link_c

    栈:
    栈具有先进后出(FILO)/后进先出(LIFO)的线性结构
    栈顶:允许进行入栈、出栈的一端
    栈底:固定的一端

    入栈、压栈(增加数据)
    出栈、弹栈(删除数据)

    顺序栈:
    栈的顺序存储结构(尾入尾出)
    stack.c

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 typedef struct 
      4 {
      5     int *data;//存数据
      6     int size;//记录数据元素的个数
      7     int top;//标记栈顶元素的位置
      8 }stack_tt;//栈的数据类型
      9 
     10 //创建
     11 stack_tt * creat_stack(int size)
     12 {
     13     //申请结构体空间
     14     stack_tt * stack = malloc(sizeof(stack_tt));
     15     if(stack == NULL)
     16     {
     17         return NULL;
     18     }
     19     //申请数据空间
     20     stack->data = malloc(sizeof(int) * size);
     21     if(stack->data == NULL)
     22     {
     23         return NULL;
     24     }
     25 
     26     //初始化
     27     stack->size = size;
     28 
     29     stack->top = -1;
     30 
     31     //返回申请空间首地址
     32     return stack;
     33 }
     34 //判满
     35 int isfull(stack_tt * stack)
     36 {
     37     return stack->top == (stack->size - 1);
     38 }
     39 
     40 //判空
     41 int isnull(stack_tt * stack)
     42 {
     43     return stack->top == -1;
     44 }
     45 
     46 //入栈
     47 int push_stack(stack_tt * stack, int data)
     48 {
     49     //判满
     50     if(isfull(stack))
     51     {
     52         printf("栈为满,无法执行入栈操作!\n");
     53         return -1;
     54     }
     55 
     56     //入栈
     57     stack->data[stack->top+1] = data;
     58 
     59     //修改栈顶位置
     60     stack->top++;
     61 
     62     return 0;
     63 }
     64 //出栈
     65 int pop_stack(stack_tt * stack, int * data)
     66 {
     67     //判空
     68     if(isnull(stack))
     69     {
     70         printf("栈为空,无法执行出栈操作!\n");
     71         return -1;
     72     }
     73 
     74     //获取出栈的数据
     75     *data = stack->data[stack->top];
     76 
     77     //删除栈顶数据
     78     stack->top--;
     79 
     80     return 0;
     81 }
     82 //获取栈顶数据
     83 int get_top(stack_tt * stack, int *data)
     84 {
     85     //判空
     86     if(isnull(stack))
     87     {
     88         printf("栈为空,无法执行获取栈顶数据!\n");
     89         return -1;
     90     }
     91 
     92     //获取栈顶数据
     93     *data = stack->data[stack->top];
     94 
     95     return 0;
     96 }
     97 
     98 //打印
     99 int print_stack(stack_tt * stack)
    100 {
    101     //判空
    102     if(isnull(stack))
    103     {
    104         printf("栈为空,无法执行打印操作!\n");
    105         return -1;
    106     }
    107 
    108     //循环遍历打印(栈顶开始打印)
    109     printf("栈顶\n");
    110     int i;
    111     for(i = stack->top; i >= 0; i--)
    112     {
    113         printf("%d\n",stack->data[i]);
    114     }
    115     printf("栈底\n");
    116 
    117     return 0;
    118 }
    119 //清空
    120 int clean_stack(stack_tt * stack)
    121 {
    122     stack->top = -1;
    123     return 0;
    124 }
    125 
    126 //销毁
    127 int dis_stack(stack_tt * stack)
    128 {
    129     free(stack->data);
    130     free(stack);
    131     return 0;
    132 }
    133 
    134 int main(int argc, const char *argv[])
    135 {
    136     stack_tt * stack = creat_stack(10);
    137     if(stack == NULL)
    138     {
    139         return -1;
    140     }
    141 
    142     int i;
    143     for(i = 1; i <= 10; i++)
    144     {
    145         push_stack(stack, i*10);
    146     }
    147     print_stack(stack);
    148 
    149     int data;
    150     for(i = 1; i <= 3; i++)
    151     {
    152         pop_stack(stack,&data );
    153         printf("pop_data:%d\n", data);
    154         print_stack(stack);
    155     }
    156 
    157     int get_top_data;
    158     get_top(stack, &get_top_data);
    159     printf("get_top_data:%d\n", get_top_data);
    160     
    161     clean_stack(stack);
    162     print_stack(stack);
    163 
    164     dis_stack(stack);
    165 
    166     return 0;
    167 }
    stack

    链式栈:
    栈的链式存储结构(头入头出)
    linkstack.c 

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef struct node
      5 {
      6     int data;
      7     struct node * next;
      8 }linkstack_t;
      9 
     10 //创建
     11 linkstack_t * creat_linkstack()
     12 {
     13     //申请空间
     14     linkstack_t * head = malloc(sizeof(linkstack_t));
     15     if(head == NULL)
     16     {
     17         printf("空间申请失败 !\n");
     18         return NULL;
     19     }
     20 
     21     //初始化
     22     head->next = NULL;
     23 
     24     //返回首地址
     25     return head;
     26 }
     27 
     28 //判空
     29 int isnull(linkstack_t * head)
     30 {
     31     return head->next == NULL;
     32 }
     33 
     34 //入栈
     35 int push_linkstack(linkstack_t * head, int data)
     36 {
     37     //申请空间
     38     linkstack_t * newnode = malloc(sizeof(linkstack_t));
     39     
     40     //存入数据
     41     newnode->data = data;
     42     
     43     //将新结点连入到栈中
     44     newnode->next = head->next;
     45     head->next = newnode;
     46 
     47     return 0;
     48 }
     49 
     50 //出栈
     51 int pop_linkstack(linkstack_t * head, int *data)
     52 {
     53     //判空
     54     if(isnull(head))
     55     {
     56         printf("栈为空,无法执行出栈操作!\n");
     57         return -1;
     58     }
     59     //备份
     60     linkstack_t * temp = head->next;
     61 
     62     //获取出栈数据
     63     *data = temp->data;
     64     
     65     //删除
     66     head->next = temp->next;
     67 
     68     //释放
     69     free(temp);
     70     return 0;
     71 }
     72 
     73 //获取栈顶数据
     74 int get_top(linkstack_t * head, int *data)
     75 {
     76     //判空
     77     if(isnull(head))
     78     {
     79         printf("栈为空,无法执行获取栈顶数据!\n");
     80         return -1;
     81     }
     82 
     83     //获取栈顶数据
     84     *data = head->next->data;
     85 
     86     return 0;
     87 }
     88 
     89 //打印
     90 int print_linkstack(linkstack_t * head)
     91 {
     92     //判空
     93     if(isnull(head))
     94     {
     95         printf("栈为空,无法执行打印操作!\n");
     96         return -1;
     97     }
     98 
     99     //遍历打印
    100     head = head->next;//跳过头结点
    101 
    102     printf("栈顶\n");
    103     while(head != NULL)
    104     {
    105         printf("%d\n", head->data);
    106         head = head->next;
    107     }
    108     printf("栈底\n");
    109     
    110     return 0;
    111 }
    112 //清空
    113 int clean_linkstack(linkstack_t * head)
    114 {
    115     int temp;
    116     while(!isnull(head))
    117     {
    118         pop_linkstack(head,&temp );
    119     }
    120 
    121     return 0;
    122 }
    123 
    124 //销毁
    125 int dis_linkstack(linkstack_t * head)
    126 {
    127     clean_linkstack(head);
    128     free(head);
    129 
    130     return 0;
    131 }
    132 
    133 int main(int argc, const char *argv[])
    134 {
    135     linkstack_t * linkstack = creat_linkstack();
    136     if(linkstack == NULL)
    137     {
    138         return -1;
    139     }
    140 
    141     int i;
    142     for(i = 1; i <= 10; i++)
    143     {
    144         push_linkstack(linkstack, i*10);
    145     }
    146     print_linkstack(linkstack);
    147 
    148     int data;
    149     for(i = 1; i <= 3; i++)
    150     {
    151         pop_linkstack(linkstack, &data);
    152         printf("pop_data:%d\n", data);
    153         print_linkstack(linkstack);
    154     }
    155 
    156     int get_top_data;
    157     get_top(linkstack, &get_top_data);
    158     printf("get_top_data:%d\n", get_top_data);
    159 
    160     clean_linkstack(linkstack);
    161     print_linkstack(linkstack);
    162 
    163     dis_linkstack(linkstack);
    164     return 0;
    165 }
    linkstack

    队列:
    队列具有先进先出/后进后出的线性结构
    队列允许在两端进行操作,一端入队一端出队

    入队:(数据的增加)
    出队:(数据的删除)

    链式队列:
    linkqueue.c(尾入头出)

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef int data_t;
      5 
      6 typedef struct node
      7 {
      8     data_t data;//数据域
      9     struct node * next;//指针域,指向下一个结点
     10 }node_t;//结点的类型
     11 
     12 
     13 typedef struct queue
     14 {
     15     node_t * head;//头指针,指向头结点
     16     node_t * tail;//尾指针,指向尾巴结点
     17 }queue_t;//队列的类型
     18 
     19 //创建
     20 queue_t * creat_queue()
     21 {
     22     node_t * head = malloc(sizeof(node_t));//申请头结点
     23     if(head == NULL)
     24     {
     25         printf("头结点空间申请失败!\n");
     26         return NULL;
     27     }
     28     head->next = NULL;
     29     
     30     queue_t * queue = malloc(sizeof(queue_t));//申请队列标识
     31     if(queue == NULL)
     32     {
     33         return NULL;
     34     }
     35 
     36     queue->head = head;//头指针指向头结点
     37     queue->tail = head;//尾指针初始状态也指向头结点(约定尾指针指向尾巴结点)
     38 
     39     return queue;//返回队列标识
     40 }
     41 
     42 //判空
     43 int isnull(queue_t * queue)
     44 {
     45     return queue->head == queue->tail;
     46     //return queue->head->next == NULL;
     47 }
     48 
     49 //入队
     50 int in_queue(queue_t * queue, data_t data)
     51 {
     52     //申请新节点空间
     53     node_t * newnode = malloc(sizeof(node_t));
     54 
     55     //存入数据
     56     newnode->data = data;
     57 
     58     //入队
     59     newnode->next = queue->tail->next;//修改新节点的后继
     60     queue->tail->next = newnode;//修改尾指针指向的尾巴结点的后继
     61 
     62     //修改tail的指向
     63     queue->tail = newnode;
     64 
     65     return 0;
     66 }
     67 
     68 //出队
     69 int out_queue(queue_t * queue, data_t * data)
     70 {
     71     //判空
     72     if(isnull(queue))
     73     {
     74         printf("表为空,无法执行出队操作!\n");
     75         return -1;
     76     }
     77 
     78     //备份
     79     node_t * temp = queue->head->next;
     80     
     81     //获取出队数据
     82     *data = temp->data;
     83 
     84     //删除
     85     queue->head->next = temp->next;
     86 
     87     //释放
     88     free(temp);
     89 
     90     //如果出队数据后,队列为空,找回尾指针的指向
     91     if(queue->head->next == NULL)
     92     {
     93         queue->tail = queue->head;
     94     }
     95 
     96     return 0;
     97 }
     98 
     99 //打印
    100 int print_queue(queue_t * queue)
    101 {
    102     //判空
    103     if(isnull(queue))
    104     {
    105         printf("队列为空,无法执行打印操作!\n");
    106         return -1;
    107     }
    108 
    109     //标记头结点
    110     node_t * head = queue->head;
    111 
    112     //跳过头结点
    113     head = head->next;
    114 
    115     //打印
    116     printf("队头:");
    117     while(head != NULL)
    118     {
    119         printf("%d ", head->data);
    120         head = head->next;    
    121     }
    122     printf("队尾\n");
    123     
    124     return 0;
    125 }
    126 
    127 //获取队列长度
    128 int get_length(queue_t * queue)
    129 {
    130     //判空
    131     if(isnull(queue))
    132     {
    133         printf("队列为空,长度为0!\n");
    134         return 0;
    135     }
    136     
    137     int  len = 0;
    138 
    139     //标记头结点
    140     node_t * head = queue->head;
    141 
    142     //跳过头结点
    143     head = head->next;
    144 
    145     //循环遍历,计算长度
    146     while(head != NULL)
    147     {
    148         len++;
    149         head = head->next;
    150     }
    151 
    152     //返回长度
    153     return len;
    154 }
    155 
    156 //清空
    157 int clean_queue(queue_t * queue)
    158 {
    159     data_t temp;
    160     while(!isnull(queue))
    161     {
    162         out_queue(queue, &temp);
    163     }
    164 
    165     return 0;
    166 }
    167 //销毁
    168 int dis_queue(queue_t * queue)
    169 {
    170     clean_queue(queue);
    171     free(queue->head);//先释放头结点
    172     free(queue);//再释放结构体标识
    173     return 0;
    174 }
    175 
    176 //队列逆向输出(利用2个顺序栈实现)
    177 int reprint_queue(queue_t * queue)
    178 {
    179     //创建2个临时顺序栈
    180     data_t * stack1 = malloc(sizeof(data_t)*get_length(queue));
    181     int top1 = -1;
    182 
    183     data_t * stack2 = malloc(sizeof(data_t)*get_length(queue));
    184     int top2 = -1;
    185 
    186     //当队列不为空,出队列,进栈1
    187     data_t data;
    188     while(!isnull(queue))
    189     {
    190         out_queue(queue, &data);
    191         stack1[++top1] = data;
    192     }
    193 
    194     //当栈1不为空,出栈1,出来一个打印一个,将数据进栈2
    195     while(top1 != -1)
    196     {
    197         data = stack1[top1--];
    198         printf("%d ", data);
    199         stack2[++top2] = data;
    200     }
    201     printf("\n");
    202 
    203     //当栈2不为空,出栈2,进队列
    204     while(top2 != -1)
    205     {
    206         data = stack2[top2--];
    207         in_queue(queue, data);
    208     }
    209 
    210     //销毁2个临时顺序栈
    211     free(stack1);
    212     free(stack2);
    213 
    214     return 0;
    215 }
    216 
    217 int main(int argc, const char *argv[])
    218 {
    219     queue_t * queue = creat_queue();
    220     if(queue == NULL)
    221     {
    222         printf("creat_queue()执行失败!\n");
    223         return -1;
    224     }
    225     
    226     int i;
    227     for(i = 1; i <= 20; i++)
    228     {
    229         in_queue(queue, i*10);
    230     }
    231     print_queue(queue);
    232 
    233     data_t data;
    234     for(i = 1; i <= 10; i++)
    235     {
    236         out_queue(queue,&data);
    237         printf("out_data:%d\n", data);
    238     }
    239     print_queue(queue);
    240 
    241     int ret = get_length(queue);
    242     printf("长度:%d\n", ret);
    243 
    244     printf("逆向打印:");
    245     reprint_queue(queue);
    246 
    247     clean_queue(queue);
    248     print_queue(queue);
    249 
    250     dis_queue(queue);
    251 
    252     return 0;
    253 }
    linkqueue

    顺序循环队列:
    queue.c(尾入头出)

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef int data_t;
      5 
      6 typedef struct queue
      7 {
      8     data_t * data;//存数据
      9     int size;//标记数据元素个数
     10     int head;//即将要取数据的位置
     11     int tail;//即将要存数据的位置
     12 }queue_t;//顺序循环队列的类型
     13 
     14 //创建
     15 queue_t * creat_queue(int size)
     16 {
     17     queue_t * queue = malloc(sizeof(queue_t));//申请队列标识
     18     if(queue == NULL)
     19     {
     20         printf("申请失败!\n");
     21         return NULL;
     22     }
     23 
     24     queue->data = malloc(sizeof(data_t) * size);//申请存储数据空间
     25     if(queue->data == NULL)
     26     {
     27         printf("申请失败!\n");
     28         return NULL;
     29     }
     30 
     31     //初始化
     32     queue->size = size;
     33     
     34     queue->head = 0;
     35     queue->tail = 0;
     36 
     37     return queue;
     38 }
     39 
     40 //判空
     41 int isnull(queue_t * queue)
     42 {
     43     return queue->head == queue->tail;
     44 }
     45 
     46 //判满
     47 int isfull(queue_t * queue)
     48 {
     49     return (queue->tail + 1) % queue->size  == queue->head;
     50 }
     51 
     52 //入队
     53 int in_queue(queue_t * queue, data_t data)
     54 {
     55     //判满
     56     if(isfull(queue))
     57     {
     58         printf("队列为满,无法执行入队操作!\n");
     59         return -1;
     60     }
     61 
     62     //入队数据,尾入
     63     queue->data[queue->tail] = data;
     64 
     65     //修改tail的值
     66     queue->tail = (queue->tail + 1) % queue->size;
     67 
     68     return 0;
     69 }
     70 
     71 //出队
     72 int out_queue(queue_t * queue, data_t * data)
     73 {
     74     //判空
     75     if(isnull(queue))
     76     {
     77         printf("队列为空,无法执行出队操作!\n");
     78         return -1;
     79     }
     80 
     81     //获取出队数据
     82     *data = queue->data[queue->head];
     83 
     84     //出队数据,修改head的值
     85     queue->head = (queue->head + 1) % queue->size;
     86 
     87     return 0;
     88 }
     89 
     90 //打印
     91 int print_queue(queue_t * queue)
     92 {
     93     //判空
     94     if(isnull(queue))
     95     {
     96         printf("队列为空,无法执行打印操作!\n");
     97         return -1;
     98     }
     99 
    100     //循环遍历打印
    101     int i;
    102     printf("队头:");
    103     for(i = queue->head; i != queue->tail; i = (i+1)%queue->size)
    104     {
    105         printf("%d ", queue->data[i]);
    106     }
    107     printf("队尾\n");
    108 
    109     return 0;
    110 }
    111 
    112 //获取队列长度
    113 int get_length(queue_t * queue)
    114 {
    115     return (queue->tail + queue->size - queue->head) % queue->size;
    116 }
    117 
    118 //清空
    119 int clean_queue(queue_t * queue)
    120 {
    121     queue->head = 0;
    122     queue->tail = 0;
    123 
    124     return 0;
    125 }
    126 
    127 //销毁
    128 int dis_queue(queue_t * queue)
    129 {
    130     free(queue->data);
    131     free(queue);
    132 
    133     return 0;
    134 }
    135 int main(int argc, const char *argv[])
    136 {
    137     queue_t * queue = creat_queue(10);
    138     if(queue == NULL)
    139     {
    140         return -1;
    141     }
    142 
    143     int i;
    144     for(i = 1; i <= 9; i++)
    145     {
    146         in_queue(queue, i*10);
    147     }
    148     print_queue(queue);
    149 
    150     data_t data;
    151     for(i = 1; i <= 3; i++)
    152     {
    153         out_queue(queue, &data);
    154         printf("出队数据:%d\n", data);
    155     }
    156     print_queue(queue);
    157 
    158     int ret = get_length(queue);
    159     printf("get_length:%d\n", ret);
    160 
    161     clean_queue(queue);
    162     print_queue(queue);
    163 
    164     dis_queue(queue);
    165 
    166         
    167     return 0;
    168 }
    queue

    树的实现
    tree.c

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct node
     5 {
     6     int data;//编号
     7     struct node * lchild;//保存左孩子的地址
     8     struct node * rchild;//保存右孩子的地址
     9 }tree_t;//树的结点类型
    10 
    11 //创建
    12 tree_t * creat_tree(int num)
    13 {
    14     //创建
    15     if(num > 6)
    16     {
    17         return NULL;
    18     }
    19     tree_t * root = malloc(sizeof(tree_t));//申请空间
    20     
    21     //初始化编号、左孩子、右孩子
    22     root->data = num;//存入编号
    23     printf("%d ", root->data);
    24 
    25     root->lchild = creat_tree(num*2);//保存左孩子的地址
    26     root->rchild = creat_tree(num*2+1);//保存右孩子的地址
    27 
    28     return root;//返回申请空间的地址
    29 }
    30 
    31 int main(int argc, const char *argv[])
    32 {
    33     tree_t * tree = creat_tree(1);
    34 
    35 
    36     
    37     return 0;
    38 }
    tree

    先序:根左右
    中序:左根右
    后序:左右根

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef struct node
      5 {
      6     int data;//编号
      7     struct node * lchild;//保存左孩子的地址
      8     struct node * rchild;//保存右孩子的地址
      9 }tree_t;//树的结点类型
     10 
     11 //创建
     12 tree_t * creat_tree(int num)
     13 {
     14     //创建
     15     if(num > 6)
     16     {
     17         return NULL;
     18     }
     19     tree_t * root = malloc(sizeof(tree_t));//申请空间
     20     
     21     //初始化编号、左孩子、右孩子
     22     root->data = num;//存入编号
     23 //    printf("%d ", root->data);
     24 
     25     root->lchild = creat_tree(num*2);//保存左孩子的地址
     26     root->rchild = creat_tree(num*2+1);//保存右孩子的地址
     27 
     28     return root;//返回申请空间的地址
     29 }
     30 
     31 //先序遍历(根左右)
     32 void pre_tree(tree_t * root)
     33 {
     34     //结束条件
     35     if(root == NULL)
     36     {
     37         return ;
     38     }
     39     
     40     //访问自己(根节点)
     41     printf("%d ",root->data );
     42 
     43     //访问左孩子
     44     pre_tree(root->lchild);
     45 
     46     //访问右孩子
     47     pre_tree(root->rchild);
     48 
     49 }
     50 
     51 //中序遍历(左根右)
     52 void mid_tree(tree_t * root)
     53 {
     54     //结束条件
     55     if(root == NULL)
     56     {
     57         return ;
     58     }
     59 
     60     //访问左孩子
     61     mid_tree(root->lchild);
     62 
     63     //访问自己(根节点)
     64     printf("%d ", root->data);
     65 
     66     //访问右孩子
     67     mid_tree(root->rchild);
     68 
     69 }
     70 //后序遍历(左右根)
     71 void post_tree(tree_t * root)
     72 {
     73     //结束条件
     74     if(root == NULL)
     75     {
     76         return ;
     77     }
     78 
     79     //访问左孩子
     80     post_tree(root->lchild);
     81 
     82     //访问右孩子
     83     post_tree(root->rchild);
     84 
     85     //访问自己(根节点)
     86     printf("%d ", root->data);
     87 
     88 }
     89 
     90 //层次遍历(顺序队列实现)
     91 int levev_tree(tree_t * root)
     92 {
     93     //创建临时顺序队列(尾入头出)
     94     tree_t * queue[20];
     95     int head = 0;
     96     int tail = 0;
     97 
     98     //创建临时变量存放出队结点
     99     tree_t * temp;
    100 
    101     //入队根结点
    102     queue[tail++] = root;
    103 
    104     //判断队列是否为空,不为空,出队,打印其编号,判断其是否有左右孩子,有入队,没有跳过
    105     while(head != tail)
    106     {
    107         //出队队头结点
    108         temp = queue[head++];
    109         
    110         //打印出队结点编号
    111         printf("%d ", temp->data);
    112 
    113         //判断出队结点是否有左孩子,有入队
    114         if(temp->lchild != NULL)
    115         {
    116             queue[tail++] = temp->lchild;
    117         }
    118 
    119         //判断出队结点是否有右孩子,有入队
    120         if(temp->rchild != NULL)
    121         {
    122             queue[tail++] = temp->rchild;
    123         }
    124 
    125     }
    126 
    127     printf("\n");
    128     
    129     return 0;
    130 }
    131 
    132 //销毁函数
    133 void free_tree(tree_t * root)
    134 {
    135     //结束条件
    136     if(root == NULL)
    137     {
    138         return ;
    139     }
    140 
    141     free_tree(root->lchild);
    142     free_tree(root->rchild);
    143     free(root);
    144 
    145 }
    146 
    147 int main(int argc, const char *argv[])
    148 {
    149     tree_t * tree = creat_tree(1);
    150 
    151     printf("先序遍历:");
    152     pre_tree(tree);
    153     printf("\n");
    154 
    155     printf("中序遍历:");
    156     mid_tree(tree);
    157     printf("\n");
    158 
    159     printf("后序遍历:");
    160     post_tree(tree);
    161     printf("\n");
    162 
    163     printf("层次遍历:");
    164     levev_tree(tree);
    165     
    166     free_tree(tree);
    167     levev_tree(tree);
    168 
    169 
    170     
    171     return 0;
    172 }
    tree2

    递归函数

     1 #include <stdio.h>
     2 
     3 int n_njc(int n)
     4 {
     5     if(n == 1)
     6         return 1;
     7     return n*n_njc(n-1);
     8 }
     9 
    10 #if 0
    11 
    12 递归就是说函数本身直接调用自己。
    13 递归在使用的时候耗费的内存很高,一旦代码实现错误,导致无限的递归,就会造成栈空间的不足。
    14 所以在执行递归的时候,一定要有递归结束的条件
    15 关于递归它是分为两个阶段的:
    16      一个是递推阶段、
    17      一个是回归阶段 
    18 
    19 #endif
    20 
    21 int main(int argc, const char *argv[])
    22 {
    23     int x;
    24     scanf("%d",&x);
    25     int ret = n_njc(x);
    26     printf("%d\n",ret);
    27     
    28     return 0;
    29 }
    递归函数
  • 相关阅读:
    spring之为java.util.Properties类型的属性进行赋值
    spring之为级联集合属性进行赋值
    spring之级联属性赋值的两种方式
    打造最佳开发团队的几点建议
    软件开发中的11个系统思维定律
    走向“持续部署”
    关于“兴趣爱好”之我见
    技术人员应真正学会的第二课程
    Java语言的动态性支持
    Java深度历险(九)——Java安全
  • 原文地址:https://www.cnblogs.com/hslixiqian/p/9560073.html
Copyright © 2011-2022 走看看