鱼C论坛

 找回密码
 立即注册
查看: 3625|回复: 14

栈链不能释放

[复制链接]
发表于 2013-8-24 16:54:04 | 显示全部楼层 |阅读模式
1鱼币


  1. //预定义常量和类型
  2. //函数结果状态代码
  3. #include <stdio.h>
  4. #include<stdlib.h>
  5. #include <time.h>  
  6. #include<windows.h>
  7. #include<math.h>
  8. //#include<unistd.h>
  9. #define TRUE  1
  10. #define FALSE 0
  11. #define OK  1
  12. #define ERROR 0
  13. #define INFEASIBLE -1
  14. #define OVERFLOW -2
  15. typedef  int ElemType;
  16. //Status是函数的类型,其值是函数结果状态代码
  17. typedef int Status;

  18. #include "header.h"
  19. #define STACK_INIT_SIZE 10  //储空间的初始分配量
  20. #define STACK_INCREMENT 2  //存储空间的分配增量
  21. #define MAXSIZE 10
  22. typedef  char SElemType;    //多型数据类型
  23. typedef  int ElemType;

  24. typedef struct StackNode
  25. {
  26.    
  27. ElemType data;     
  28. struct StackNode *next;     

  29. }StackNode,*LinkStackPtr;
  30. typedef struct LinkStack
  31. {
  32.    
  33. LinkStackPtr top;     
  34. int count;     

  35. }Stack;
  36. //=================================栈链初始化
  37. void InitStack(LinkStackPtr *base)
  38. {
  39.   LinkStackPtr p=NULL;
  40.   *base=(LinkStackPtr)malloc(sizeof(ElemType));
  41.   (*base)->data=0;
  42.   (*base)->next=NULL;
  43. }
  44. //=======================================进栈操作
  45. void Push(Stack *S,ElemType e)
  46. {
  47.   LinkStackPtr p;
  48.   p=(LinkStackPtr)malloc(sizeof(ElemType));
  49.   p->data=e;
  50.   p->next=S->top;
  51.    S->top=p;
  52.   S->count++;


  53. }
  54. //=======================================出栈操作
  55. void Pop(LinkStackPtr top,LinkStackPtr base,Stack *S,ElemType *e)
  56. {
  57.   if(top!=base)
  58.   {
  59.      LinkStackPtr p;
  60.    *e=top->data;
  61.    p=S->top;
  62.    S->top=top->next;
  63.    S->count--;
  64. free(top);=============================================问题代码
  65.   
  66.    

  67.   }
  68.   else
  69.   {
  70.    printf("栈里已经没有元素可以打印了\n");
  71.   }
  72. }
  73. //========================================打印链栈
  74. void print(LinkStackPtr base,LinkStackPtr top)
  75. {
  76.   while(top!=base)
  77.   {
  78.    printf("%d\n",top->data);
  79.    top=top->next;
  80.   }
  81. }
  82. main()
  83. {
  84. LinkStackPtr base;
  85. Stack S;
  86. int i=1;
  87. ElemType e=0;
  88. InitStack(&base);
  89. S.top=base;
  90. S.count=0;
  91. for(i=1;i<=MAXSIZE;i++)
  92. {
  93.   Push(&S,i);
  94. }
  95. printf("栈里有%d个元素\n",S.count);
  96. // free(S.top);                   ======================================问题代码
  97. print(base,S.top);


  98. for(i=1;i<=MAXSIZE;i++)
  99. {
  100.    Pop(S.top,base,&S,&e);
  101.   printf("Pop出来的元素为%d\n",e);
  102.   printf("栈里有%d个元素\n",S.count);
  103. print(base,S.top);
  104.   
  105. }



  106. return 0;


  107. }

复制代码

   问题代码处:
//=======================================出栈操作
void Pop(LinkStackPtr top,LinkStackPtr base,Stack *S,ElemType *e)
{
  if(top!=base)
  {
     LinkStackPtr p;
   *e=top->data;
   p=S->top;
   S->top=top->next;
   S->count--;
free(top);=============================================问题代码
  
   

  }
  else
  {
   printf("栈里已经没有元素可以打印了\n");
  }
}
//========================================

如果把出栈操作中的free(top)代码注释掉,可以显示弹出内容正确,但是加了就报错,为什么不能释放成功啊,

我在主函数里测试,加上free()也是不能释放,这是为什么呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 17:14:38 | 显示全部楼层
void Push(Stack *S,ElemType e)
{
  LinkStackPtr p;
  p=(LinkStackPtr)malloc(sizeof(ElemType));
  free(p);   ============================ //这里可以释放,不报错
  p->data=e;
  p->next=S->top;
   S->top=p;
  S->count++;
  free(p);   =========================   //这里就不可以释放,报错
  }


我在push函数里调试,free()放在上面就不报错,放在最后位置就会报错,不明白怎么回事了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 20:06:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 20:07:40 | 显示全部楼层
p=(LinkStackPtr)malloc(sizeof(ElemType));
这里申请的空间不够ElemType,只是一个整形
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-24 20:46:40 | 显示全部楼层
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 21:06:54 | 显示全部楼层
zZ_小春 发表于 2013-8-24 20:46
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行

好啊,里面有的代码测试用的,没有删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 21:08:47 | 显示全部楼层
zZ_小春 发表于 2013-8-24 20:46
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行
  1. //预定义常量和类型

  2. //函数结果状态代码
  3. #include <stdio.h>
  4. #include<stdlib.h>
  5. #include <time.h>  
  6. #include<windows.h>
  7. #include<math.h>
  8. //#include<unistd.h>
  9. #define TRUE  1
  10. #define FALSE 0
  11. #define OK  1
  12. #define ERROR 0
  13. #define INFEASIBLE -1
  14. #define OVERFLOW -2
  15. typedef  int ElemType;

  16. //Status是函数的类型,其值是函数结果状态代码
  17. typedef int Status;

  18. #define STACK_INIT_SIZE 10  //储空间的初始分配量
  19. #define STACK_INCREMENT 2  //存储空间的分配增量
  20. #define MAXSIZE 10
  21. typedef  char SElemType;    //多型数据类型
  22. typedef  int ElemType;



  23. typedef struct StackNode
  24. {
  25.           
  26.         ElemType data;     
  27.         struct StackNode *next;     
  28.        
  29. }StackNode,*LinkStackPtr;

  30. typedef struct LinkStack
  31. {
  32.           
  33.         LinkStackPtr top;     
  34.         int count;     
  35.        
  36. }Stack;
  37. //=================================栈链初始化
  38. void InitStack(LinkStackPtr *base)
  39. {
  40.          LinkStackPtr p=NULL;
  41.          *base=(LinkStackPtr)malloc(sizeof(ElemType));
  42.          (*base)->data=0;
  43.          (*base)->next=NULL;

  44. }
  45. //=======================================进栈操作

  46. void Push(Stack *S,ElemType e)
  47. {
  48.          LinkStackPtr p,q;

  49.          p=(LinkStackPtr)malloc(sizeof(StackNode));
  50.          //free(p);                                   //这里要吧释放
  51.          q=p;
  52.          p->data=e;
  53.           
  54.          p->next=S->top;
  55.         // free(q);
  56.          S->top=p;
  57.          S->count++;
  58.                                           //这里就不可以释放

  59.          


  60.          




  61. }

  62. //=======================================出栈操作
  63. void Pop(LinkStackPtr top,LinkStackPtr base,Stack *S,ElemType *e)
  64. {
  65.          if(top!=base)
  66.          {
  67.                
  68.                  LinkStackPtr p;
  69.                  *e=top->data;
  70.                  p=S->top;
  71.                  S->top=top->next;
  72.                  S->count--;
  73.                  free(top);
  74.                  


  75.          }
  76.          else
  77.          {
  78.                  printf("栈里已经没有元素可以打印了\n");
  79.          }
  80. }

  81. //========================================打印链栈
  82. void print(LinkStackPtr base,LinkStackPtr top)
  83. {
  84.          while(top!=base)
  85.          {
  86.                  printf("%d\n",top->data);
  87.                  top=top->next;
  88.          }
  89. }

  90. main()
  91. {
  92.         LinkStackPtr base, p;
  93.         Stack S;
  94.         int i=1;
  95.         ElemType e=0;
  96.         InitStack(&base);
  97.         S.top=base;
  98.         S.count=0;
  99.         for(i=1;i<=MAXSIZE;i++)
  100.         {
  101.                 Push(&S,i);

  102.         }
  103.         printf("栈里有%d个元素\n",S.count);
  104.         //free(p);

  105.         print(base,S.top);


  106.        
  107.         for(i=1;i<=MAXSIZE;i++)
  108.         {
  109.                         Pop(S.top,base,&S,&e);
  110.                 printf("Pop出来的元素为%d\n",e);
  111.                 printf("栈里有%d个元素\n",S.count);

  112.         print(base,S.top);
  113.                

  114.         }

  115.        


  116.        

  117.         return 0;
  118.        


  119. }


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 21:09:54 | 显示全部楼层

我自己测试是可以了,你也试试看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 21:17:36 | 显示全部楼层
分享一个经典代码,百度出来的
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef char SElemType ;

  4. typedef struct StackNode
  5. {
  6.         SElemType data;
  7.         struct StackNode *next;
  8. }StackNode,*LinkStackPtr;

  9. typedef struct LinkStack
  10. {
  11.         LinkStackPtr top;
  12.         int count;
  13. }LinkStack;

  14. //栈指针初始化
  15. void InitialStack(LinkStack *L)
  16. {
  17.         L->top=NULL;
  18.         L->count=0;
  19.         return;
  20. }
  21. //栈状态
  22. int StackEmpty(LinkStack *pS)
  23. {
  24.         if(!pS->count)//若为空,则返回1
  25.                 return 1;
  26.         else
  27.                 return 0;//若非空,则返回0;
  28. }
  29. //压栈操作
  30. int Push(LinkStack *pS,SElemType e)
  31. {
  32.         //一般情况下,不存在栈满情况
  33.         LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
  34.         s->data = e;
  35.         s->next = pS->top;

  36.         pS->top=s;
  37.         pS->count++;
  38.         //free(s);
  39.         return 0;
  40. }

  41. //出栈操作
  42. int Pop(LinkStack *pS,SElemType *e)
  43. {
  44.         LinkStackPtr p;
  45.         if(StackEmpty(pS))
  46.                 {
  47.                         printf("栈为空!");
  48.                     return 0;
  49.             }

  50.         *e=pS->top->data;

  51.         p = pS->top;
  52.         pS->top = p->next;
  53.         free(p);
  54.         pS->count--;
  55.         return 0;
  56. }
  57. //打印栈链
  58. void PrintStackLink(LinkStack *pS)
  59. {
  60.         LinkStackPtr L;
  61.         int i;
  62.         //i = pS->count;
  63.         L = pS->top;
  64.         if(pS->count == 0)
  65.         {
  66.                 printf("栈为空!");
  67.                 return;

  68.         }
  69.         for(i=0;i<(pS->count);i++)
  70.         {
  71.                 printf("%c\n",L->data);
  72.             L = L->next;
  73.         }
  74.         return ;
  75. }
  76. void main()
  77. {
  78.         //测试
  79.         char getch;
  80.         char outch;
  81.         LinkStack myStack;
  82.         InitialStack(&myStack);
  83.         //压栈
  84.         printf("请输入压入栈的数据(char型),输入#结束");
  85.         scanf("%c",&getch);
  86.         while(getch!='#')
  87.         {
  88.                 Push(&myStack,getch);
  89.                 scanf("%c",&getch);
  90.         }
  91.         printf("栈链内容为:\n");
  92.         PrintStackLink(&myStack);

  93.         //出栈
  94.         while(!StackEmpty(&myStack))
  95.         {
  96.                 Pop(&myStack,&outch);
  97.                 printf("弹出内容为:%c\n",outch);
  98.         }
  99.         PrintStackLink(&myStack);
  100.         while(1);
  101.         return ;
  102. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-25 02:07:07 | 显示全部楼层
付笑 发表于 2013-8-24 21:09
我自己测试是可以了,你也试试看

:lol:我也修改了一下,把不需要用的变量和参数删除了,下午在我的电脑不行,现在在同学的电脑就可以了。。。
  1. //预定义常量和类型

  2. //函数结果状态代码
  3. #include <stdio.h>
  4. #include<stdlib.h>
  5. #include <time.h>  
  6. #include<windows.h>
  7. #include<math.h>
  8. //#include<unistd.h>
  9. #define TRUE  1
  10. #define FALSE 0
  11. #define OK  1
  12. #define ERROR 0
  13. #define INFEASIBLE -1
  14. #define OVERFLOW -2
  15. typedef  int ElemType;

  16. //Status是函数的类型,其值是函数结果状态代码
  17. typedef int Status;

  18. #define STACK_INIT_SIZE 10  //储空间的初始分配量
  19. #define STACK_INCREMENT 2  //存储空间的分配增量
  20. #define MAXSIZE 10
  21. typedef  char SElemType;    //多型数据类型
  22. typedef  int ElemType;



  23. typedef struct StackNode
  24. {
  25.            
  26.         ElemType data;     
  27.         struct StackNode *next;     
  28.         
  29. }StackNode,*LinkStackPtr;

  30. typedef struct LinkStack
  31. {
  32.            
  33.         LinkStackPtr top;     
  34.         int count;     
  35.         
  36. }Stack;
  37. //=================================栈链初始化
  38. void InitStack(LinkStackPtr *base)
  39. {
  40.          //LinkStackPtr p=NULL;   //这个定义了没用到
  41.          *base=(LinkStackPtr)malloc(sizeof(ElemType));
  42.          (*base)->data=0;
  43.          (*base)->next=NULL;

  44. }
  45. //=======================================进栈操作

  46. void Push(Stack *S,ElemType e)
  47. {
  48.          LinkStackPtr p;//进栈也只需用一个变量作为中间节点

  49.          p=(LinkStackPtr)malloc(sizeof(StackNode));
  50.          //free(p);                                   //这里要吧释放//进桟了肯定不用释放的了,出栈才需要释放
  51.          
  52.          p->data=e;
  53.            
  54.          p->next=S->top;
  55.         // free(q);
  56.          S->top=p;
  57.          S->count++;
  58.                                           //这里就不可以释放

  59.          


  60.          




  61. }

  62. //=======================================出栈操作
  63. void Pop(LinkStackPtr base,Stack *S,ElemType *e)//这里修改了一下下,传入了S所以无需加多了top了,直接S->top就是了
  64. {
  65.          if(S->top!=base)
  66.          {
  67.                
  68.                  LinkStackPtr p;//这个指针指向出栈元素
  69.                  *e=S->top->data;
  70.                  p=S->top;
  71.                  S->top=S->top->next;
  72.                  S->count--;
  73.                  free(p);
  74.                  


  75.          }
  76.          else
  77.          {
  78.                  printf("栈里已经没有元素可以打印了\n");
  79.          }
  80. }

  81. //========================================打印链栈
  82. void print(LinkStackPtr base,LinkStackPtr top)
  83. {
  84.          while(top!=base)
  85.          {
  86.                  printf("%d\n",top->data);
  87.                  top=top->next;
  88.          }
  89. }

  90. main()
  91. {
  92.         LinkStackPtr base, p;
  93.         Stack S;
  94.         int i=1;
  95.         ElemType e=0;
  96.         InitStack(&base);
  97.         S.top=base;
  98.         S.count=0;
  99.         for(i=1;i<=MAXSIZE;i++)
  100.         {
  101.                 Push(&S,i);

  102.         }
  103.         printf("栈里有%d个元素\n",S.count);
  104.         //free(p);

  105.         print(base,S.top);


  106.         
  107.         for(i=1;i<=MAXSIZE;i++)
  108.         {
  109.                         Pop(base,&S,&e);
  110.                 printf("Pop出来的元素为%d\n",e);
  111.                 printf("栈里有%d个元素\n",S.count);

  112.         print(base,S.top);
  113.                

  114.         }   

  115.         return 0;
  116.         
  117. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 12:04:39 | 显示全部楼层
zZ_小春 发表于 2013-8-24 20:46
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行

你开始不行,可能是这个地方,base应该是p才可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-25 10:37:56 | 显示全部楼层
新手,学习中,呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-8 10:43:11 | 显示全部楼层
来学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-14 20:00:09 | 显示全部楼层
学习,继续升级中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 13:03:54 | 显示全部楼层
坐等大神解决{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 19:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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