编写完成重点数据结构和算法: 0.链表 1.栈 2.队列 3.二叉树数据结构和构建 4.前序中序后序遍历二叉树 5.构建哈夫曼树(最优二叉树) 6.图数据结构,图的深度优先遍历和广度优先遍历 7.拓扑排序 8.直接插入排序 9.希尔排序 10.希尔排序 11.冒泡排序 12.快速排序 13.直接选择排序 14.堆排序 15.归并排序 16.箱排序和基数排序 17.顺序查找,二分查找,索引顺序查找 

 

  1 // ExamTest.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "stdlib.h"
  6 #include <string>
  7 /************************************************************************/
  8 /*                栈数据结构                                              */
  9 /************************************************************************/
 10 #define StackSize 1024    //栈大小
 11 typedef char DataType;
 12 typedef struct  
 13 {
 14     DataType data[StackSize];    //栈数组
 15     int top;    //栈顶索引
 16 }Stack;
 17 
 18 //清空栈
 19 void InitStack(Stack * s)
 20 {
 21     if(s == NULL)
 22         return;
 23     s->top = -1;
 24 }
 25 //判断是否满栈
 26 bool StatckEmpty(Stack* s)
 27 {
 28     if(s == NULL)
 29         return false;
 30     return s->top == StackSize-1;
 31 }
 32 //进栈
 33 void PushStack(Stack* s,DataType x)
 34 {
 35     if(s == NULL)
 36         return;
 37     if(StatckEmpty(s))
 38         return;
 39     else
 40     {
 41         //规定当前入栈完成后指向当前的数据
 42         s->top = s->top +1;
 43         s->data[s->top] = x;
 44     }
 45 }
 46 //出栈
 47 DataType PopStack(Stack* s)
 48 {
 49     if(s == NULL)
 50     {
 51         exit(0);
 52     }
 53     if(StatckEmpty(s))
 54     {
 55         printf("Stack is empty .\n");
 56         exit(0);
 57     }
 58     else
 59     {
 60         return s->data[s->top--]; //先用后减
 61     }
 62 }
 63 
 64 //获取栈顶元素
 65 DataType GetTop(Stack* s)
 66 {
 67     if(s == NULL)
 68     {
 69         exit(0);
 70     }
 71     if(StatckEmpty(s))
 72     {
 73         printf("Stack empty . \n");
 74         exit(0);
 75     }
 76     else
 77     {
 78         return s->data[s->top];
 79     }
 80 }
 81 
 82 /************************************************************************/
 83 /*                队列数据结构(循环队列)                              */
 84 /************************************************************************/
 85 #define QUEUESIZE 1024
 86 typedef struct
 87 {
 88     DataType data[QUEUESIZE];    //队列数组
 89     int front;    //队列头
 90     int rear;    //队列尾部
 91 }Queue; 
 92 
 93 //初始化队列
 94 void InitQueue(Queue* q)
 95 {
 96     if(q == NULL)
 97         return;
 98     q->front = 0;
 99     q->rear = 0;
100 }
101 
102 //判断栈是否为空
103 bool QueueEmpty(Queue* q)
104 {
105     if(q == NULL)
106         return false;
107     else
108         return q->front == q->rear;
109 }
110 
111 //判断队列是否满
112 bool QueueFull(Queue* q)
113 {
114     if(q == NULL)
115         return false;
116     return (q->rear + 1) % QUEUESIZE == q->front; 
117 }
118 
119 //入队列
120 void InsertQueue(Queue* q,DataType x)
121 {
122     if(q == NULL)
123         return;
124     if(QueueFull(q))
125     {
126         printf("Queue Full !\n");
127     }
128     else
129     {
130         //队尾添加,队尾指向后面一个为空的
131         q->data[q->rear] = x;
132         q->rear = (q->rear + 1) % QUEUESIZE;
133     }
134 }
135 
136 //出队列
137 DataType DelQueue(Queue* q)
138 {
139     DataType x;
140     if(QueueEmpty(q))
141     {
142         printf("Queue is Empty \n");
143         exit(0);
144     }
145     else
146     {
147         x = q->data[q->front];
148         q->front = (q->front + 1) % QUEUESIZE;
149         return x;
150     }
151 }
152 
153 //取队头元素
154 DataType GetFrontData(Queue* q)
155 {
156     if(QueueEmpty(q))
157     {
158         printf("queue is empty!\n");
159         exit(0);
160     }
161     else
162     {
163         return q->data[q->front];
164     }
165 }
166 
167 //取队尾元素
168 DataType GetRearData(Queue* q)
169 {
170     if(QueueEmpty(q))
171     {
172         printf("queue is empty !");
173         exit(0);
174     }
175     else
176     {
177         return q->data[q->rear];
178     }
179 }
180 /* 字符串匹配(判断一个子串是否是另一个字符串的子串)*/
181 bool IsSubString()
182 {
183     char parentString[1024];
184     char subString[1024];
185     printf("please input parent string!\n");
186     scanf("%s",parentString);
187     printf("please input sub string!\n");
188     scanf("%s",subString);
189 
190     int nParent = strlen(parentString);
191     int nSub = strlen(subString);
192     /*
193         1. 如果子串的字符数量大于父串的数量则匹配失败
194         2. 子串的数量大于父串的数量,匹配比较。
195     */
196     if(nSub > nParent)
197         return false;
198     for(int i = 0; i <= nParent; i++)
199     {
200         int k = i;
201         if((nParent - k) < nSub)
202             return false;
203         for(int j = 0; j <= nSub; j++)
204         {
205             if(subString[j] == parentString[k])
206             {
207                 if(j == nSub -1)
208                     return true;
209                 k++;
210             }
211             else
212             {
213                 break;
214             }
215         }
216     }
217     return false;
218 }
219 typedef struct BinNode
220 {
221     DataType data;
222     BinNode* lChild;
223     BinNode* rChild;
224 }BinNTree;
225 
226 typedef BinNode* BinTree;
227 char* str = "ABDH#K###E##CFI###G#J##";
228 //构造一个二叉树,使用前序创建,#表示对应的节点为NULL
229 int index = 0;
230 void creatBinTree(BinNTree** t)
231 {
232     if( (*t) = (BinNTree*) malloc(sizeof(BinNTree)))
233     {
234         char ch = str[index++];
235         if(ch == '#')
236         {
237             (*t) = NULL;
238             return;
239         }
240         (*t)->data = ch;
241         creatBinTree(&(*t)->lChild);
242         creatBinTree(&(*t)->rChild);
243     }
244 };
245 
246 //清空二叉树
247 void clearBinTree(BinNTree* t)
248 {
249     if(t == NULL)
250         return;
251 
252     if(t->lChild)
253         clearBinTree(t->lChild);
254     if(t->rChild)
255         clearBinTree(t->rChild);
256     free(t);
257 }
258 //求二叉树深度
259 int getBinTreeDeep(BinNTree* & t)
260 {
261     int i = 0;
262     int j = 0;
263     if(!t)
264         return 0;
265     if(t->lChild)
266         i = getBinTreeDeep(t->lChild);
267     if(t->rChild)
268         j = getBinTreeDeep(t->rChild);
269     return i > j? i+1:j+1;
270 }
271 
272 //前序遍历
273 void preOrder(BinNTree* t)
274 {
275     if(t == NULL)
276         return;
277     printf("%c ",t->data);
278     preOrder(t->lChild);
279     preOrder(t->rChild);
280 }
281 
282 //中序遍历
283 void inOrder(BinNTree* t)
284 {
285     if(t == NULL)
286         return;
287     inOrder(t->lChild);
288     printf("%c ",t->data);
289     inOrder(t->rChild);
290 }
291 
292 //后序遍历
293 void postOrder(BinNTree* t)
294 {
295     if(t == NULL)
296         return;
297     postOrder(t->lChild);
298     postOrder(t->rChild);
299     printf("%c ",t->data);
300 }
301 
302 //查找二叉树中是否存在某值
303 bool find(BinNTree* t,DataType data)
304 {
305     if(t == NULL)
306         return false;
307     if(t->data == data)
308         return true;
309     if(find(t->lChild,data))
310         return true;
311     return find(t->rChild,data);
312 
313 }
314 
315 int _tmain(int argc, _TCHAR* argv[])
316 {
317     /*    // 字符串匹配函数测试
318     while (1)
319     {
320         if(IsSubString())
321         {
322             printf("this is subString for parentString!\n");
323         }
324         else
325         {
326             printf("sorry,this is not subString for parentString\n");
327         }
328     }
329     */
330 
331     /************************************************************************/
332     /*            二叉树测试                                                  */
333     /************************************************************************/
334     BinTree t = NULL;
335     creatBinTree(&t);
336     int nDept = getBinTreeDeep(t);
337     printf("this BinTree Depth is: %d\n",nDept);
338     printf("前序遍历结果:");
339     preOrder(t);
340     printf("\n后序遍历结果:");
341     postOrder(t);
342     printf("\n中序遍历结果:");
343     inOrder(t);
344     getchar();
345 }

 

 

posted on 2015-01-07 01:03  RedLight  阅读(832)  评论(0编辑  收藏  举报