• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++学习(三十七)(C语言部分)之链式栈(推箱子实现)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

用链表实现栈
一开始在表头插入,就要一直在表头插入
一开始在表尾插入,就要一直在表头插尾
表头当栈底 也可以把表尾当栈底

实现的测试代码笔记如下:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 
  5 //节点的结构体
  6 typedef struct Node
  7 {
  8     char *name;
  9     struct Node *pNext;
 10 }LIST, *PLIST;
 11 
 12 //1.创建“火车头”  创建一个表头
 13 void CreateListHead(PLIST *p_list)  //传入头结点指针 给他分配内存
 14 {
 15     //一级指针 形参和实参结合时
 16     //PLIST p_list = p_head;  形参和实参结合时候的赋值
 17     //p_list 改变 是不影响到p_head  就好像是A给B发送了一个文件 B对文件进行了修改,是不会影响A手中的文件
 18 
 19     //要改变一级指针的实参 函数要传入一级指针的地址 保存一级指针的地址 要使用二级指针
 20     *p_list = (PLIST)malloc(sizeof(LIST));
 21     (*p_list)->pNext = NULL;
 22 
 23 }
 24 
 25 //实现一个栈 
 26 //2.写入栈函数
 27 void Push_Stack(PLIST p_list, char *name)
 28 {
 29     //头插法
 30     PLIST node = (PLIST)malloc(sizeof(LIST));
 31     //node->name - name;  可以这么写 但是如果存入得扇区内存,会被释放掉 就会出错
 32     node->name = (char *)malloc(sizeof(char)*strlen(name) + 1);
 33     strcpy(node->name, name);
 34     node->pNext = p_list->pNext;
 35     p_list->pNext = node;
 36 }
 37 
 38 //3.获取栈顶元素
 39 char * GetStackTop(PLIST p_list)
 40 {
 41     //如果不是空 就返回头结点的下一个节点的name
 42     PLIST p_Temp = p_list->pNext;
 43     if (p_Temp != NULL)
 44     {
 45         return p_Temp->name;
 46     }
 47     return NULL;  //说明栈是空
 48 }
 49 
 50 //4.出栈
 51 void Pop_Stack(PLIST p_list)
 52 {
 53     //相当于删除结点  之前是头插法  那么最后一个在最前面
 54     PLIST p_Temp = p_list->pNext;
 55     if (p_Temp != NULL)
 56     {
 57         //p_remp保存第一个节点的地址
 58         p_Temp = p_list->pNext;
 59         //让头结点的pnext连接到第二个节点
 60         p_list->pNext = p_Temp->pNext;
 61     }
 62     free(p_Temp);  //释放内存  释放掉第一个节点 是释放p_temp里面所保存的内存 而不是释放指针变量
 63 }
 64 
 65 //5.判断栈是否为空
 66 int isEmpty(PLIST p_list)
 67 {
 68     //如果栈为空 返回1
 69     return p_list->pNext == NULL;
 70 }
 71 
 72 int main()
 73 {
 74     PLIST p_head = NULL;  //作为链表的标记
 75     CreateListHead(&p_head);
 76     /*if (NULL == p_head)
 77     {
 78         printf("内存分配失败!\n");
 79     }
 80     else
 81     {
 82         printf("内存分配成功!\n");
 83     }*/
 84 
 85     Push_Stack(p_head, "");
 86     Push_Stack(p_head, "");
 87     Push_Stack(p_head, "");
 88     Push_Stack(p_head, "");
 89     Push_Stack(p_head, "");
 90     Push_Stack(p_head, "");
 91     Push_Stack(p_head, "");
 92     Push_Stack(p_head, "");
 93     Push_Stack(p_head, "");
 94     Push_Stack(p_head, "");
 95     Push_Stack(p_head, "");
 96     Push_Stack(p_head, "");
 97     while (!isEmpty(p_head))
 98     {
 99         printf("%s", GetStackTop(p_head));
100         Pop_Stack(p_head);
101     }
102 
103     getchar();
104     return 0;
105 }

附:

 

 

推箱子实现,代码笔记如下所示:

 

  1 1、main.cpp文件
  2 
  3 //推箱子
  4 //操作说明 WASD表示上下左右移动 空格键可以退回到上一步
  5 #if 1
  6 #include<graphics.h>
  7 #include<stdio.h>
  8 #include <conio.h>
  9 
 10 #include "Stack.h"
 11 //地图
 12 int Map[9][8] = {
 13     0, 0, 1, 1, 1, 1, 1, 0,
 14     1, 1, 1, 0, 0, 0, 1, 0,
 15     1, 3, 5, 4, 0, 0, 1, 0,
 16     1, 1, 1, 0, 4, 3, 1, 0,
 17     1, 3, 1, 1, 4, 0, 1, 0,
 18     1, 0, 1, 0, 3, 0, 1, 1,
 19     1, 4, 0, 7, 4, 4, 3, 1,
 20     1, 0, 0, 0, 3, 0, 0, 1,
 21     1, 1, 1, 1, 1, 1, 1, 1
 22 };
 23 
 24 //实现退回操作
 25 void Retrogress(PLIST p_list)
 26 {
 27     //1.获取栈顶数据
 28     PLIST p_Temp = GetStackTop(p_list);
 29     if (NULL == p_Temp)
 30     {
 31         return;
 32     }
 33     for (int i = 0; i < 9; i++)
 34     {
 35         for (int j = 0; j < 8; j++)
 36         {
 37             Map[i][j] = p_Temp->p[i][j];
 38         }
 39     }
 40     Pop_Stack(p_list);  //出栈
 41 }
 42 
 43 //对于一个游戏1.初始化  加载图片
 44 IMAGE g_box, g_dbox, g_people, g_point, g_wall, g_blank;
 45 void Init_Game()
 46 {
 47     loadimage(&g_box, L"./source/box.jpg");  //相对路径
 48     loadimage(&g_dbox, L"./source/dbox.jpg");
 49     loadimage(&g_people, L"./source/people.jpg");
 50     loadimage(&g_point, L"./source/point.jpg");
 51     loadimage(&g_wall, L"./source/wall.jpg");
 52     loadimage(&g_blank, L"./source/blank.jpg");
 53 }
 54 
 55 //2.加载图片
 56 void Paint_Game()
 57 {
 58     for (int i = 0; i < 9; i++)
 59     {
 60         for (int j = 0; j < 8; j++)
 61         {
 62             switch (Map[i][j])
 63             {
 64             case 0: //0表示空地
 65                 putimage(j * 45, i * 45, &g_blank);
 66                 break;
 67             case 1: // 1表示墙壁
 68                 putimage(j * 45, i * 45, &g_wall);
 69                 break;
 70             case 3: // 3表示目的地
 71                 putimage(j * 45, i * 45, &g_point);
 72                 break;
 73             case 4: // 4表示箱子
 74                 putimage(j * 45, i * 45, &g_box);
 75                 break;
 76             case 5: // 5表示人
 77                 putimage(j * 45, i * 45, &g_people);
 78                 break;
 79             case 7: // 7表示箱子在目的地   4+3
 80                 putimage(j * 45, i * 45, &g_dbox);
 81                 break;
 82             case 8: // 8表示人在目的地   5+3
 83                 putimage(j * 45, i * 45, &g_people);
 84                 break;
 85             }
 86         }
 87     }
 88 }
 89 
 90 //3.实现人物移动
 91 void MovePeople(PLIST p_list)
 92 {
 93     int i, j;
 94     for (i = 0; i < 9; i++)
 95     {
 96         for (j = 0; j < 8; j++)
 97         {
 98             //找到人的位置
 99             if (Map[i][j] == 5 || Map[i][j] == 8)
100             {
101                 //if成立说明找到人
102                 break;
103             }
104         }
105         if (Map[i][j] == 5 || Map[i][j] == 8)
106         {
107             //if成立说明找到人
108             break;
109         }
110     }
111     switch (getch())
112     {
113 //表示往左边移动
114     case 'a':  
115         //人的左边是空地 或者 是目的
116         if (Map[i][j - 1] == 0 || Map[i][j - 1] == 3)
117         {
118             Map[i][j - 1] += 5;  //人往左边移动
119             Map[i][j] -= 5;  //人离开了当前位置
120         }//人的左边是箱子或者是箱子在目的
121         else if (Map[i][j - 1] == 4 || Map[i][j - 1] == 7)
122         {
123             if (Map[i][j - 2] == 0 || Map[i][j - 2] == 3)
124             {
125                 Map[i][j - 2] += 4;
126                 Map[i][j - 1] += 1;
127                 Map[i][j] -= 5;
128             }
129         }
130         //每次移动都要入栈
131         Push_Stack(p_list, Map);
132         break;
133 
134 //表示往右边
135     case 'd': 
136         //人的右边是空地 或者 是目的
137         if (Map[i][j + 1] == 0 || Map[i][j + 1] == 3)
138         {
139             Map[i][j + 1] += 5;  //人往左边移动
140             Map[i][j] -= 5;  //人离开了当前位置
141         }//人的右边是箱子或者是箱子在目的
142         else if (Map[i][j + 1] == 4 || Map[i][j + 1] == 7)
143         {
144             if (Map[i][j + 2] == 0 || Map[i][j + 2] == 3)
145             {
146                 Map[i][j + 2] += 4;
147                 Map[i][j + 1] += 1;
148                 Map[i][j] -= 5;
149             }
150         }
151         //每次移动都要入栈
152         Push_Stack(p_list, Map);
153         break;
154 
155 //表示往上边移动
156     case 'w':  
157         //人的上边是空地 或者 是目的
158         if (Map[i - 1][j] == 0 || Map[i - 1][j] == 3)
159         {
160             Map[i - 1][j] += 5;  //人往上边移动
161             Map[i][j] -= 5;  //人离开了当前位置
162         }//人的上边是箱子或者是箱子在目的
163         else if (Map[i - 1][j] == 4 || Map[i - 1][j] == 7)
164         {
165             if (Map[i - 2][j] == 0 || Map[i - 2][j] == 3)
166             {
167                 Map[i - 2][j] += 4;
168                 Map[i - 1][j] += 1;
169                 Map[i][j] -= 5;
170             }
171         }
172         //每次移动都要入栈
173         Push_Stack(p_list, Map);
174         break;
175 
176 //表示什么往下边移动
177     case 's':  
178         //人的下边是空地 或者 是目的
179         if (Map[i + 1][j] == 0 || Map[i + 1][j] == 3)
180         {
181             Map[i + 1][j] += 5;  //人往左边移动
182             Map[i][j] -= 5;  //人离开了当前位置
183         }//人的下边是箱子或者是箱子在目的
184         else if (Map[i + 1][j] == 4 || Map[i + 1][j] == 7)
185         {
186             if (Map[i + 2][j] == 0 || Map[i + 2][j] == 3)
187             {
188                 Map[i + 2][j] += 4;
189                 Map[i + 1][j] += 1;
190                 Map[i][j] -= 5;
191             }
192         }
193         //每次移动都要入栈
194         Push_Stack(p_list, Map);
195         break;
196     case VK_SPACE: //空格
197         if (!isEmpty(p_list))
198         {
199             Retrogress(p_list);
200             Paint_Game();
201         }
202     }
203 }
204 
205 //4.判断游戏是否结束
206 int  isWin()
207 {
208     for (int i = 0; i < 9; i++)
209     {
210         for (int j = 0; j < 8; j++)
211         {
212             if (Map[i][j] == 4)
213             {
214                 return 0;
215             }
216         }
217     }
218     return 1;
219 }
220 
221 int main()
222 {
223     initgraph(360, 405);  //初始化图形界面
224     Init_Game();
225     PLIST p_head = NULL;
226     CreateListHead(&p_head);
227     Paint_Game();
228     while (!isWin())
229     {
230         Paint_Game();
231         MovePeople(p_head);
232     }
233     Paint_Game();
234     getchar();//防止运行到closegraph() 直接退出 看不到效果
235     closegraph(); //关闭图形界面
236 
237     return 0;
238 }
239 
240 
241 *********************分割线************************
242 
243 
244 2、Stack.h文件
245 #include <stdlib.h>
246 #include <stdio.h>
247 /*
248 以后  头文件是用来声明函数 或者类
249 */
250 typedef struct Node
251 {
252     //char *name;   //前面是不是讲过动 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
在C#中实现打印功能(C#中PrintDialog,PrintDocument的使用)(转)发布时间:2022-07-14
下一篇:
C#导入文件日期格式(dd/MM/yyyy)发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap