总觉得缺点什么?哪位大神可以帮个忙呀
编程实现一个简单的行编辑功能:用户可以输入一行内容,并可进行简易编辑。要求:(1)遇到输入部分内容有误时操作退格符“#”表示前一位无效;
(2)“@”表示之前的内容均无效。
不知道是在主函数中,还是LinkEdit这个函数中
终端这个怎么解释呢?这个会不会生成文件,怎么显示我输入的数据?有点混乱啊
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//线性表的动态分配顺序存储结构
#define STACK_ININT_SIZE 100
#define STACKINCREMENT 10
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;
typedef struct SqStack
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *S); //构造一个空的栈表
Status LinkEdit(SqStack S);//利用字符栈S从终端接收一行并送至调用过程的数据区
Status Pop(SqStack *S,SElemType e);//删除栈顶元素
Status Push(SqStack *S,SElemType e);//压栈
Status GetTop(SqStack S,SElemType e); //取出栈顶元素
Status DestoryStack(SqStack *S);//销毁栈
Status ClearStack(SqStack *S);//设置为空栈
Status StackTraverse(SqStack S,Status(*visit)(SElemType));//访问
Status copy(SElemType c);
int main()
{
SqStack S;
InitStack(&S);
LinkEdit(S);
return 0;
}
Status InitStack(SqStack *S)
{//构造一个空的栈
(*S).base=(SElemType *)malloc(STACK_ININT_SIZE*sizeof(SElemType));//分配空间
if(!(*S).base)
{//空间分配失败
exit(OVERFLOW);
}
(*S).top=(*S).base;
(*S).stacksize=STACK_ININT_SIZE;
return OK;
}
Status LinkEdit(SqStack S)
{//利用字符栈S从终端接收一行并送至调用过程的数据区
FILE * fp;
char ch;
char c;
InitStack(&S);
printf("请输入一个文本文件,^Z结束输入:\n");
ch=getchar();
while(ch!=EOF && ch!='\n')
{//EOF为^Z键,全文结束符
switch(ch)
{
case '#':
Pop(&S,c);//出栈
break;
case '@':
ClearStack(&S);//重置S为空栈
break;
default:Push(&S,ch);//压栈
}
ch=getchar();
}
StackTraverse(S,copy);//将从栈底到栈顶的站内字符传送至文件
ClearStack(&S);//重置S为空栈
fputc('\n',fp);
if(ch!=EOF)
{
ch=getchar();
}
DestoryStack(&S);
}
Status Pop(SqStack *S,SElemType e)
{//删除栈顶元素 ,并用e返回该值
if((*S).top==(*S).base)
{//空栈
return ERROR;
}
e=*--(*S).top;
return OK;
}
Status Push(SqStack *S,SElemType e)//压栈
{
if((*S).top-(*S).base>=(*S).stacksize)
{//栈满
(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));// base的新地址
if(!(*S).base)//分配失败
exit(OVERFLOW);
(*S).top=(*S).base+(*S).stacksize;//top的新地址
(*S).stacksize+=STACKINCREMENT;
}
*((*S)).top++=e;
}
Status GetTop(SqStack S,SElemType e) //取出栈顶元素
{
if(S.top==S.base)
{//空栈
return ERROR;
}
e=*(S.top-1);
return OK;
}
Status DestoryStack(SqStack *S)//销毁栈
{
free((*S).base);
(*S).base=NULL;
(*S).top=NULL;
(*S).stacksize=0;
return OK;
}
Status ClearStack(SqStack *S)//设置为空栈
{
(*S).top=(*S).base;
return OK;
}
Status StackTraverse(SqStack S,Status(*visit)(SElemType))//访问
{
while(S.top>S.base)
{
visit(*S.base++);
}
printf("\n");
return OK;
}
Status copy(SElemType c)
{//将字符e送至fp所指的文件中
FILE *fp;
fputc(c,fp);
return OK;
}