鱼C论坛

 找回密码
 立即注册
查看: 4881|回复: 11

我的程序老师陷入死循环,请鱼友帮忙

[复制链接]
发表于 2012-11-25 22:36:34 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
#include<stdlib.h>

#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10
typedef struct
{        
char *base;                    
char *top;               //栈顶指针        
int stacksize;           //当前已分配存储空间,元素为单位
}SqStack;
SqStack *s;


void InitStack(SqStack *s)   //初始化栈
{        
    s->base = (char*)malloc(STACK_INIT_SIZE*sizeof(char));
    if(!(s->base))
        printf("内存分配失败!!");    //分配失败程序结束        
        s->top = s->base;        
        s->stacksize = STACK_INIT_SIZE;
        printf("初始化成功!!");
}
       
char GetTop(SqStack *s)       //取得栈顶元素
        {   
        if(s->top == s->base)
                printf("出错!!");
                return 0;   
        return *(s->top-1);
        }
       
void Push(SqStack *s) //入栈
{  
  char e;
  if(s->top - s->base >= s->stacksize) //栈满追加存储空间  
  {      
  s->base = (char*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(char));   
  if(!s->base)
  printf("内存分配失败!!");//分配失败      
  s->top = s->base + s->stacksize; //指向刚刚为满时        
  s->stacksize += STACKINCREMENT;   
  }
printf("请输入入站的字符以空格结束:");
scanf("%c",&e);   
while(e!=' ')
{
*(s->top++) = e;
scanf("%c",&e);
}
}

void Pop(SqStack *s)         //出栈
{
        char *e;
    if(s->top == s->base)
    printf("次栈为空!!!");//为空时退出   
    else
        {
                e=--(s->top);
            printf("%c",e);
        }//返回top前一个指针
}

void Display(SqStack *s)               //显示栈元素
{        
    char *q;      
        q = s->top-1;        
        while(q>=s->base)        
        {               
        printf("|%c|       ",*q);
        q--;  
        }      
        printf("\n");
        }
       
void DestroyStack(SqStack *s) //销毁栈
{                        
free(s->base);               
printf("Destroy ok!\n");
}

void main()
{  
     int a,f=1;
         char g,h;
         SqStack *S;
         while(f)
        {
         printf("请输入你要的操作:\n");
         printf("No1初始化栈      No2入栈      No3出栈    No4删除栈    No5获得栈顶元素  No0退出");
         switch(a)
         {
              case 1:   InitStack(S);
                                break;
          case 2:   Push(S);                       
                                break;
                  case 3:   Pop(S);
                                break;
                  case 4:   DestroyStack(S);
                                break;
                  case 5:   GetTop(S);
                                break;
          case 0:   break;
         }
         printf("是否继续操作?\No1:继续No0:终止\n");
         scanf("%d",f);
        }
}
         
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-25 22:53:52 | 显示全部楼层
scanf("%c",&e);   
while(e!=' ')
{
  *(s->top++) = e;
   scanf("%c",&e);
}
需要清空缓冲。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-26 01:05:27 | 显示全部楼层
路过??????????????????
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-26 10:57:44 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-26 13:04:57 | 显示全部楼层
伪装不出的笑 发表于 2012-11-26 10:57
谢谢回复
但还是死循环
我也不知道怎么整

算了,有空帮你把这段代码改下。晚上吧。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-26 13:40:44 | 显示全部楼层
主函数就有大问题了,错误太多,先说几个,a没赋值将给switch判断了,f用scanf的时候没加地址符,还有提示用户操作的时候没检查栈的情况,如已经建立了栈,或者栈已删除等。建议还是重写吧。本来想改的,但需添加的地方太多,还不如重写。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-27 00:18:18 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. #define STACK_INIT_SIZE 100 //存储空间初始分配量
  4. #define STACKINCREMENT 10

  5. typedef struct
  6. {        
  7.         char *base;                    
  8.         char *top;               //栈顶指针        
  9.         int stacksize;           //当前已分配存储空间,元素为单位
  10. }SqStack;

  11. SqStack *s;


  12. void InitStack(SqStack *s)   //初始化栈
  13. {              
  14.         s->base = (char*)malloc(STACK_INIT_SIZE*sizeof(char));
  15.        
  16.         if(!(s->base))
  17.         {
  18.                 printf("内存分配失败!!");    //分配失败程序结束
  19.                 return;
  20.         }
  21.                
  22.           s->top = s->base;        
  23.            s->stacksize = STACK_INIT_SIZE;
  24.     printf("初始化成功!!");
  25. }
  26.          
  27. char GetTop(SqStack *s)       //取得栈顶元素
  28. {   
  29.         if(s->top == s->base)
  30.           {
  31.                   printf("出错!!");
  32.             return 0;       
  33.           }
  34.              
  35.     return *(s->top-1);
  36. }
  37.          
  38. void Push(SqStack *s) //入栈
  39. {  
  40.         char e;
  41.         int  rec = 0;
  42.        
  43.            if(s->top - s->base >= s->stacksize) //栈满追加存储空间  
  44.            {      
  45.                    s->base = (char*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(char));   
  46.                    if(!s->base)
  47.                    {
  48.                            printf("内存分配失败!!");//分配失败   
  49.                            return;
  50.                    }
  51.                                
  52.                    s->top = s->base + s->stacksize; //指向刚刚为满时        
  53.                    s->stacksize += STACKINCREMENT;   
  54.            }
  55.         printf("请输入入站的字符以空格结束:");
  56.          
  57.         do
  58.         {
  59.                 //rewind( stdin ); flush the buffer
  60.                 rec++;        //rec for recording the current stack top(if the stacksize is full)
  61.                 scanf( "%c", &e );
  62.                 *s->top++ = e;
  63.                           
  64.         }while( rec < s->stacksize && e != ' ' );
  65. }

  66. void Pop(SqStack *s)         //出栈
  67. {
  68.         char *e;
  69.         if(s->top == s->base)
  70.              printf("次栈为空!!!");//为空时退出   
  71.           else
  72.            {
  73.             e=--(s->top);
  74.              printf("%c\n",*e);
  75.     }//返回top前一个指针
  76. }

  77. void Display(SqStack *s)               //显示栈元素
  78. {        
  79.         char *q;      
  80.          
  81.         q = s->top-1;        
  82.           while(q>=s->base)        
  83.            {               
  84.             printf("|%c|       ",*q);
  85.              q--;  
  86.            }      
  87.     printf("\n");
  88. }
  89.          
  90. void DestroyStack(SqStack *s) //销毁栈
  91. {      
  92.         if( !s->base )
  93.         {
  94.                 free( s->base );
  95.                 printf( "Destroy ok!\n" );
  96.         }                 
  97. }

  98. int main()
  99. {  
  100.         int choice, flag;
  101.         char top_ele;
  102.           SqStack *S = NULL;
  103.          
  104.         S = (SqStack *)malloc( sizeof(SqStack) );
  105.         if( !S )
  106.         {
  107.                 printf( "no space for stack!\n" );
  108.                 return -1;
  109.         }      
  110.        
  111.           while(1)
  112.            {
  113.                    printf("No1初始化栈      No2入栈      No3出栈    No4删除栈    No5获得栈顶元素  No0退出");
  114.             printf( "请输入你要的操作:\n" );
  115.             scanf( "%d", &choice );
  116.               switch( choice )
  117.                {
  118.                 case 1:   
  119.                            InitStack(S);
  120.                  break;
  121.            
  122.                            case 2:   
  123.                            Push(S);                        
  124.                     break;
  125.                   
  126.                            case 3:   
  127.                            Pop(S);
  128.                     break;
  129.                   
  130.                            case 4:   
  131.                            DestroyStack(S);
  132.                            break;
  133.                   
  134.                            case 5:   
  135.                            {
  136.                                    top_ele = GetTop(S);
  137.                                    printf( "%c\n", top_ele );       
  138.                            }          
  139.                       break;
  140.                   
  141.                            default:
  142.                            break;
  143.               }
  144.                printf("是否继续操作?\nNo1:继续                |                No0:终止\n");
  145.                scanf( "%d", &flag );
  146.                if( flag == 0 )
  147.                    {
  148.                            break;       
  149.                    }
  150.     }
  151.     free( S );
  152. }
复制代码
lz代码逻辑还是有问题的,不严谨。。但是根据lz的意思,稍微这么改下了。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-27 01:24:45 | 显示全部楼层
写的真长,要慢慢看
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-27 23:04:35 | 显示全部楼层
suiyan 发表于 2012-11-26 13:04
算了,有空帮你把这段代码改下。晚上吧。

没事  还是得谢谢
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-27 23:05:22 | 显示全部楼层
nbceshi 发表于 2012-11-26 13:40
主函数就有大问题了,错误太多,先说几个,a没赋值将给switch判断了,f用scanf的时候没加地址符,还有提示用户 ...

那我再试试吧
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-27 23:08:54 | 显示全部楼层
谢谢  我先看看
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-27 23:25:06 | 显示全部楼层
suiyan 发表于 2012-11-27 00:18
lz代码逻辑还是有问题的,不严谨。。但是根据lz的意思,稍微这么改下了。

谢谢 写改的已经很好了  我的思绪本来就很乱
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-16 13:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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