Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260755
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2015-11-17 08:44:58


点击(此处)折叠或打开

  1. #pragma once

  2. #include <memory.h>
  3. #include<assert.h>

  4. #define MAX_SIZE 100
  5. typedef int DataType;
  6. typedef struct SeqList
  7. {
  8.     DataType array[MAX_SIZE];    // 数据段
  9.     size_t size;                // 数据个数
  10. }SeqList;

  11. void InitSeqList(SeqList* pSeq)
  12. {
  13.     memset(pSeq->array, 0, sizeof(DataType)*MAX_SIZE);
  14.     pSeq->size = 0;
  15. }

  16. void PrintSeqList(SeqList* pSeq)
  17. {
  18.     size_t i = 0;
  19.     assert(pSeq);

  20.     for (i = 0; i < pSeq->size; ++i)
  21.     {
  22.         printf("%d ", pSeq->array[i]);
  23.     }

  24.     printf("\n");
  25. }

  26. void PushBack(SeqList* pSeq, DataType x)
  27. {
  28.     assert(pSeq);

  29.     if (pSeq->size >= MAX_SIZE)
  30.     {
  31.         printf("SeqList is Full\n");
  32.         return;
  33.     }

  34.     pSeq->array[pSeq->size++] = x;
  35. }

  36. void PopBack(SeqList* pSeq)
  37. {
  38.     assert(pSeq);

  39.     if (pSeq->size == 0)
  40.     {
  41.         printf("SeqList is Empty\n");
  42.         return;
  43.     }

  44.     --pSeq->size;
  45.     //pSeq->array[--pSeq->size] = 0;
  46. }

  47. void PushFront(SeqList* pSeq, DataType x)
  48. {
  49.     int begin = pSeq->size - 1;
  50.     assert(pSeq);

  51.     if (pSeq->size >= MAX_SIZE)
  52.     {
  53.         printf("SeqList is Full\n");
  54.         return;
  55.     }

  56.     for (; begin >= 0; --begin)
  57.     {
  58.         pSeq->array[begin + 1] = pSeq->array[begin];
  59.     }

  60.     pSeq->array[0] = x;

  61.     ++pSeq->size;
  62. }

  63. void PopFront(SeqList* pSeq)
  64. {
  65.     int i = 1;
  66.     assert(pSeq);

  67.     if (pSeq->size == 0)
  68.     {
  69.         printf("SeqList is Empty\n");
  70.         return;
  71.     }

  72.     for (; i < pSeq->size; ++i)
  73.     {
  74.         pSeq->array[i -1] = pSeq->array[i];
  75.     }

  76.     --pSeq->size;
  77. }

  78. void Insert(SeqList* pSeq, size_t pos, DataType x)
  79. {
  80.     int begin = pSeq->size - 1;
  81.     assert(pSeq);

  82.     if (pSeq->size >= MAX_SIZE)
  83.     {
  84.         printf("SeqList is Full\n");
  85.         return;
  86.     }

  87.     if (pos > pSeq->size)
  88.     {
  89.         printf("Pos is Over Cross\n");
  90.     }

  91.     for (; begin >= pos; --begin)
  92.     {
  93.         pSeq->array[begin + 1] = pSeq->array[begin];
  94.     }

  95.     pSeq->array[pos] = x;

  96.     ++pSeq->size;
  97. }

  98. int Find(SeqList* s, DataType x)
  99. {
  100.     int i = 0;
  101.     assert(s);

  102.     for (; i < s->size; ++i)
  103.     {
  104.         if (s->array[i] == x)
  105.         {
  106.             return i;
  107.         }
  108.     }

  109.     return -1;
  110. }

  111. // 删除pos位置的数据
  112. void Erase(SeqList* s, size_t pos)
  113. {
  114.     int i = pos;
  115.     assert(s);
  116.     assert(pos < s->size);

  117.     for (; i < s->size - 1; ++i)
  118.     {
  119.         s->array[i] = s->array[i + 1];
  120.     }

  121.     s->size--;
  122. }

  123. // 删除找到的第一个x
  124. void Remove(SeqList* s, DataType x)
  125. {
  126.     //int ret;
  127.     //assert(s);

  128.     //ret = Find(s, x);
  129.     //if (ret != -1)
  130.     //{
  131.     //    Erase(s, ret);
  132.     //}

  133.     int i = 0;
  134.     assert(s);


  135.     for (; i < s->size; ++i)
  136.     {
  137.         if (s->array[i] == x)
  138.         {
  139.             int j = i;
  140.             for (; j < s->size - 1; ++j)
  141.             {
  142.                 s->array[j] = s->array[j + 1];
  143.             }

  144.             break;
  145.         }
  146.     }
  147. }

  148. // 删除所有的x
  149. //void RemoveAll(SeqList* s, DataType x)
  150. //{
  151. //    //int ret;
  152. //    //assert(s);
  153. //
  154. //    //ret = Find(s, x);
  155. //    //while(ret != -1)
  156. //    //{
  157. //    //    Erase(s, ret);
  158. //    //    ret = Find(s, x);
  159. //    //}
  160. //
  161. //    int count = 0;
  162. //    int i = 0;
  163. //    assert(s);
  164. //
  165. //    for (; i < s->size; ++i)
  166. //    {
  167. //        if (s->array[i] == x)
  168. //        {
  169. //            int j = i;
  170. //            for (; j < s->size - 1; ++j)
  171. //            {
  172. //                s->array[j] = s->array[j + 1];
  173. //            }
  174. //            ++count;
  175. //            --i;
  176. //        }
  177. //    }
  178. //}

  179. void RemoveAll(SeqList* pSeq, DataType x)
  180. {
  181.     int count = 0;
  182.     int firstIndex = 0, secondIndex = 0;
  183.     assert(pSeq);

  184.     while (secondIndex < pSeq->size)
  185.     {
  186.         if (pSeq->array[secondIndex] != x)
  187.         {
  188.             pSeq->array[firstIndex] = pSeq->array[secondIndex];
  189.             ++firstIndex;
  190.         }
  191.         else
  192.         {
  193.             ++count;
  194.         }

  195.         ++secondIndex;
  196.     }

  197.     pSeq->size -= count;
  198. }

  199. // 冒泡排序
  200. void BubbleSort(SeqList* pSeq)
  201. {
  202.     int begin = 1;
  203.     int end = pSeq->size;
  204.     assert(pSeq);

  205.     for(; end > 0; --end)
  206.     {
  207.         int exchange = 0;
  208.         for (; begin < end; ++begin)
  209.         {
  210.             if (pSeq->array[begin - 1] > pSeq->array[begin])
  211.             {
  212.                 DataType tmp = pSeq->array[begin - 1];
  213.                 pSeq->array[begin - 1] = pSeq->array[begin];
  214.                 pSeq->array[begin] = tmp;
  215.                 exchange = 1;
  216.             }
  217.         }

  218.         if (exchange == 0)
  219.         {
  220.             return;
  221.         }
  222.     }
  223. }

  224. void SeclectSort(SeqList* pSeq)
  225. {
  226.     int begin = 0;
  227.     int minIndex = 0;
  228.     int maxIndex = 0;

  229.     int curIndex = minIndex + 1;
  230.     assert(pSeq);

  231.     for (begin = 0; begin < pSeq->size - 1; ++begin)
  232.     {
  233.         DataType tmp;
  234.         minIndex = begin;
  235.         for (curIndex = begin + 1; curIndex < pSeq->size; ++curIndex)
  236.         {
  237.             if (pSeq->array[curIndex] < pSeq->array[minIndex])
  238.             {
  239.                 minIndex = curIndex;
  240.             }
  241.         }
  242.         tmp = pSeq->array[begin];
  243.         pSeq->array[begin] = pSeq->array[minIndex];
  244.         pSeq->array[minIndex] = tmp;
  245.     }
  246. }

  247. void Swap(DataType* left, DataType* right)
  248. {
  249.     DataType tmp = *left;
  250.     *left = *right;
  251.     *right = tmp;
  252. }

  253. void SeclectSort_OP(SeqList* pSeq)
  254. {
  255.     int begin = 0, end = pSeq->size-1, cur = 0;
  256.     int minIndex = 0;
  257.     int maxIndex = 0;

  258.     assert(pSeq);

  259.     while(cur < end)
  260.     {
  261.         DataType max, min;
  262.         for (begin = cur; begin <= end; ++begin)
  263.         {
  264.             if (pSeq->array[begin] < pSeq->array[cur])
  265.             {
  266.                 Swap(pSeq->array + begin, pSeq->array + cur);
  267.             }

  268.             if (pSeq->array[begin] > pSeq->array[end])
  269.             {
  270.                 Swap(pSeq->array + begin, pSeq->array + end);
  271.             }
  272.         }

  273.         ++cur;
  274.         --end;
  275.     }
  276. }


  277. int BinarySearch(SeqList* pSeq, DataType x)
  278. {
  279.     //[]
  280.     //[)
  281.     int left = 0;
  282.     int right = pSeq->size;
  283.     assert(pSeq);

  284.     while (left < right)
  285.     {
  286.         // 1, 3
  287.         //int mid = (left + right)/2;
  288.         //int mid = left/2 + right/2;
  289.         int mid = left + (right - left)/2;
  290.         if (pSeq->array[mid] < x)
  291.         {
  292.             left = mid + 1;
  293.         }
  294.         else if (pSeq->array[mid] > x)
  295.         {
  296.             right = mid;
  297.         }
  298.         else
  299.         {
  300.             return mid;
  301.         }
  302.     }

  303.     return -1;
  304. }

  305. // 递归
  306. //[0, size-1]
  307. //[left, mid -1] | [mid+1, right]

  308. int _BinarySearch_R(SeqList* pSeq, int left, int right, DataType x)
  309. {
  310.     //[) 0, size
  311.     //[] 0, size -1
  312.     assert(pSeq);
  313.     if (left < right)
  314.     {
  315.         int mid = left + (right - left)/2;
  316.         if (pSeq->array[mid] < x)
  317.         {
  318.             return _BinarySearch_R(pSeq, mid + 1, right, x);
  319.         }
  320.         else if(pSeq->array[mid] > x)
  321.         {
  322.             return _BinarySearch_R(pSeq, left, mid, x);
  323.         }
  324.         else
  325.         {
  326.             return mid;
  327.         }
  328.     }

  329.     return -1;
  330. }

  331. int BinarySearch_R(SeqList* pSeq, DataType x)
  332. {
  333.     return _BinarySearch_R(pSeq, 0, pSeq->size, x);
  334. }

阅读(1245) | 评论(0) | 转发(0) |
0

上一篇:常用指令

下一篇:关于单链表的面试题

给主人留下些什么吧!~~