标题:为什么我的case 1:中非法输入会陷入死循环
只看楼主
hellohe
Rank: 1
等 级:新手上路
帖 子:37
专家分:7
注 册:2018-3-12
结帖率:40%
已结贴  问题点数:20 回复次数:3 
为什么我的case 1:中非法输入会陷入死循环
搜索更多相关主题的帖子: case 非法 输入 死循环 
2018-03-13 22:48
hellohe
Rank: 1
等 级:新手上路
帖 子:37
专家分:7
注 册:2018-3-12
得分:0 
这是我的完整代码
#include <stdio.h>
#include <stdlib.h>

typedef struct LinkStack
{
    int data;
    struct LinkStack *next;
}link;

//置空栈算法
link *SetNull(link *Top)
{
    Top=NULL;
    return Top;
}
//判栈空算法
int Empty(link *Top)
{
    if(Top==NULL)
        return 1;
    else return 0;
}
//初始化算法
link *LinkStackInit(link *Top)
{
    //link *Top; //构造一个空栈
    Top=(link *)malloc(sizeof(link));
    Top->next = NULL;
    return Top;
}
//进栈算法
void Push(link **Top,int x)
{
    link *p;


    p=(link *)malloc(sizeof(link));
    p->data=x;
    p->next = *Top;
    *Top = p;
    //return Top;
}
//出栈算法
int Pop(link **Top)
{
    link *p;
    int x;
    if(Top==NULL)
        return NULL;
    else
    {
        p = *Top;
        x = (*Top)->data;
        (*Top) = (*Top)->next;
        free(p);
        p = NULL;
        return x;
    }
}
//读栈顶元素算法
int GetTop(link *Top)
{
    if(Top==NULL)
        return NULL;
    else return Top->data;

}

int main()
{
    link *Top=NULL;
    //Top=(link *)malloc(sizeof(link));
    int x,i;
    Top=LinkStackInit(Top);
    //Top=SetNull(Top);
    for(i=0;i<4;i++)
    {
        printf("输入栈元素:");
        scanf("%d",&x);
        //getchar();
        Push(&Top,x);
    }
    for(i=0;i<4;i++)
    {
        printf("输出栈元素:");
        printf("%d",Pop(&Top));
        printf("\n");
    }
    return 0;
}

2018-03-13 22:50
hellohe
Rank: 1
等 级:新手上路
帖 子:37
专家分:7
注 册:2018-3-12
得分:0 
上面错了是这个
#include <stdio.h>
#define MaxSize 100
#define TRUE 1
#define FLASE 0
typedef struct Node
{
    int data[MaxSize];
    int last;
}sequence;
int Ins(sequence *L,int i,int x)
{
    int k;
    if(L->last==MaxSize)
        printf("表已满!");
    if(i<1||i>L->last)
        return FLASE;
    else
        for(k=L->last;k>=i-1;k--)
            L->data[k+1]=L->data[k];
        L->data[i-1]=x;
        L->last++;
        return TRUE;
}
int Del(sequence *L,int i)
{
    int k;
    if(i<1||i>L->last+1)
        return FLASE;
    else
    for(k=i;k<=L->last;k++)
        L->data[k-1]=L->data[k];
    L->last--;
    return -1;
}
int search(sequence *L,int e)
{
    int i=0;
    while(i<=L->last)
    {
        if(L->data[i]==e)
            return i;
        i++;
    }
    return FLASE;
}
void Input(sequence *L)
{
    int i=0;
    while(i<=L->last)
        printf("%d\t",L->data[i++]);
    printf("\n");
}
/*sequence *Add(sequence *A,sequence *B)
{
    int i,j,k;
    sequence *C;
    i=0;j=0;k=0;
    while((i<=A->last)&&j<=B->last)
        if(A->data[i]>=B->data[j]){
            C->data[k]=A->data[i];
            k++;i++}
            else
            {
                C->data[k]=B->data[j];
                k++;j++;
            }
            while(i<=A->last)
            C->data[k++]=A->data[i++];
            while(j<=B->last)
            C->data[k++]=B->data[j++];
            C->last=A->last+B->last+1;
            return C;

    }
}*/
int main()
{
    int x,i,n,meun,flag=1;
    sequence L;
    printf("请输入元素的个数:");
    scanf("%d",&n);
    L.last=n-1;
    for(i=0;i<=L.last;i++)
    {
        scanf("%d",&L.data[i]);
    }
    printf("\n****************************\n");
    printf("\t1.插入\t2.删除\t\n");
    printf("\t3.查找\t4.顺序表合并\t\n");
    printf("\t5.显示顺序表\t6.退出");
    printf("\n****************************\n");
    while(flag)
    {
        printf("输入菜单选项:");
    scanf("%d",&meun);
    switch (meun)
    {
    case 1:
    {
        printf("请输入要插入的位置和元素:");
            if(scanf("%d %d",&i,&x)==EOF){
            printf("输入错误!\n");break;}
        if(Ins(&L,i,x))
            printf("插入成功!");
        else
            printf("插入失败!");
        Input(&L);
        break;


    }
    case 2:
    {
        printf("请输入要删除的下标:");
        scanf("%d",&i);

        if(Del(&L,i))
            printf("删除成功!");
        else
            printf("删除失败!");
            Input(&L);break;

    }
    case 3:
    {
        printf("输入你要查找的元素:");
        scanf("%d",&x);
        if(search(&L,x)==-1)
            printf("查找失败或不存在这个元素!");
            printf("你查找元素的下标为%d\t",search(&L,x));
                Input(&L);break;
    }
    case 4:
        {
            printf("此功能暂时不能使用!\n");break;

        }
    case 5:Input(&L);break;
    case 6:
    {flag=0;break;}
    default :fflush(stdin);printf("错误!请重新输入:\n"); break;
    }
    }
    return 0;

}
2018-03-13 22:52
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:20 
因为你输入的字符不符合要求,scanf返回了错误,但没有清除这个字符,所以后面的scanf会一直收到这个字符。用rewind(stdin);可以清除缓冲区的字符。
2018-03-14 10:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-485243-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024861 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved