鱼C论坛

 找回密码
 立即注册
查看: 3134|回复: 3

本人初学数据结构,遇见free()函数问题,求解惑

[复制链接]
发表于 2014-11-8 14:11:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、头文件:
  1. /* Project_3_1.h */

  2. /* 用链表结构和堆栈实现二进制转换 */
  3. #include<stdio.h>
  4. #include<stdlib.h>

  5. /* 声明链表结构 */
  6. typedef struct stack *stackPointer;
  7. typedef struct stack {
  8.         int num;
  9.         stackPointer link;
  10. };

  11. /* 建立一个空链表 */
  12. void Create(stackPointer *top){
  13.         *top = NULL;
  14. }

  15. /* 判断是否为满 */
  16. int IsFull();

  17. /* 入栈 */
  18. void Push(stackPointer *top, int x){
  19.         stackPointer temp = (stackPointer)malloc(sizeof(stackPointer*));
  20.         temp->num = x;
  21.         temp->link = *top;
  22.         *top = temp;
  23. }

  24. /* 判断是否为空 */
  25. int IsEmpty(){
  26.         fprintf(stderr, "\n");
  27.         exit(EXIT_FAILURE);
  28. }

  29. /* 出栈 */
  30. int Pop(stackPointer *top){
  31.         stackPointer temp;
  32.         if((*top)){
  33.                 int x = (*top)->num;
  34.                 temp = *top;
  35.                 *top = (*top)->link;
  36.                 free(temp);                        /* 调试后卡住的断点 */
  37.                 return x;
  38.         }
  39.         else
  40.                 return IsEmpty();
  41. }

  42. /* 二进制转换函数 */
  43. void Conversion(stackPointer *top, int *n){
  44.         printf("Please input the decimal number: ");
  45.         scanf("%d", n);
  46.         Create(top);
  47.         while(*n){
  48.                 int x = (*n) % 2;
  49.                 Push(top, x);
  50.                 (*n) /= 2;
  51.         }
  52.         printf("The corresponding binary version is: ");
  53.         while(*top){
  54.                 int x = Pop(top);
  55.                 printf("%d", x);
  56.         }
  57. }
复制代码

2、main函数:
  1. /* Project_3_1 main */
  2. #include"Project_3_1.h"
  3. int main(void){
  4.         stackPointer top;
  5.         int n;
  6.         Conversion(&top, &n);
  7.         printf("\n");
  8.         return 0;
  9. }
复制代码

:dizzy:求大神解惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-8 14:35:26 | 显示全部楼层
free()释放的是指针指向的内存!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-11-8 15:31:54 | 显示全部楼层
小甲鱼的二师兄 发表于 2014-11-8 14:35
free()释放的是指针指向的内存!

嗯嗯,那该怎么改,我改了很多次,就是不知道temp应该赋值什么,指针这块有点乱:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-10 21:06:31 | 显示全部楼层
已解决~
最终的代码改成这样了:
  1. /* Project_3_1.c */

  2. /* 用链表结构和堆栈实现二进制转换 */

  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #define MALLOC(p, s) (p) = malloc(s)

  6. /* 声明链表结构 */
  7. typedef struct stack *stackPointer;
  8. typedef struct stack {
  9.         int num;
  10.         stackPointer link;
  11. };
  12. void Create(stackPointer *top);
  13. void Push(stackPointer *top, int x);
  14. int Pop(stackPointer *top);
  15. void Conversion(stackPointer *top, int *n);
  16. int IsEmpty();
  17. int IsFull();

  18. int main(void){
  19.         stackPointer top;
  20.         int n;
  21.         int t = 0;
  22.         while (++t)
  23.                 Conversion(&top, &n);
  24.         printf("\n");
  25.         return 0;
  26. }

  27. /* 建立一个空链表 */
  28. void Create(stackPointer *top){
  29.         *top = NULL;
  30. }

  31. /* 判断是否为满 */
  32. int IsFull();

  33. /* 入栈 */
  34. void Push(stackPointer *top, int x){
  35.         stackPointer temp;
  36.         MALLOC(temp, sizeof(*temp));
  37.         temp->num = x;
  38.         temp->link = *top;
  39.         *top = temp;
  40. }

  41. /* 判断是否为空 */
  42. int IsEmpty(){
  43.         fprintf(stderr, "\n");
  44.         exit(EXIT_FAILURE);
  45. }

  46. /* 出栈 */
  47. int Pop(stackPointer *top){
  48.         stackPointer temp = *top;
  49.         if ((*top)){
  50.                 int x = (*top)->num;
  51.                 (*top) = (*top)->link;
  52.                 free(temp);                        /* 调试后卡住的断点 */
  53.                 return x;
  54.         }
  55.         else
  56.                 return IsEmpty();
  57. }

  58. /* 二进制转换函数 */
  59. void Conversion(stackPointer *top, int *n){
  60.         printf("Please input the decimal number: ");
  61.         scanf("%d", n);
  62.         Create(top);
  63.         while (*n){
  64.                 int x = (*n) % 2;
  65.                 Push(top, x);
  66.                 (*n) /= 2;
  67.         }
  68.         printf("The corresponding binary version is: ");
  69.         while (*top){
  70.                 int x = Pop(top);
  71.                 printf("%d", x);
  72.         }
  73.         printf("\n\n");
  74. }
复制代码

thanks!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-3 23:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表