数据结构-行编辑程序

一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,
不能保证不出差错,因此,若在行编辑程序中“每接受一个字符即存入用户区”的做法显然是不恰当的。
较好的做法是,设立一个输入缓冲区,用以接收用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,
并在发现有误时及时改正。
例如:当用户发现刚刚建入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内
差错较多或难以补救,则可以输入一个退格符“@”,以表示当前行中的字符均无效。
例如,假设从终端接受了这两行字符:
whil##ilr#e(s#*s)
    outcha@putchar(*s=#++)
则实际有效的是下列两行:
while(*s)
    putchar(*s++)

 

程序代码如下:

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3 

  4 #define STACK_INIT_SIZE 100

  5 #define STACKINCREMENT 10

  6 #define OVERFLOW -2

  7 #define OK 1

  8 #define ERROR 0

  9 

 10 typedef char SElemType;

 11 

 12 //栈结构体

 13 typedef struct {

 14     SElemType *base;

 15     SElemType *top;

 16     int stacksize;

 17 }SqStack;

 18 

 19 int InitStack(SqStack *S);//初始化栈

 20 int Push(SqStack *S,SElemType e);//入栈

 21 int Pop(SqStack *S,SElemType *e);//删除栈中的元素

 22 int DestoryStack(SqStack *S);//销毁栈

 23 void LineEdit(SqStack *S);//行编辑程序

 24 int ClearStack(SqStack *S);//清空栈中的元素

 25 

 26 //初始化栈

 27 int InitStack(SqStack *S) {

 28     S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

 29     if(!S->base) {

 30         exit(OVERFLOW);

 31     }

 32     S->top = S->base;

 33     S->stacksize = STACK_INIT_SIZE;

 34 

 35     return OK;

 36 }

 37 

 38 //入栈

 39 int Push(SqStack *S,SElemType e) {

 40     if((S->top-S->base)>=S->stacksize) {

 41         S->base = (SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));

 42         if(!S->base) {

 43             exit(OVERFLOW);

 44         }

 45         S->top = S->base + S->stacksize;

 46         S->stacksize += STACKINCREMENT;

 47     }

 48     *S->top++ = e;

 49     //printf("%c\n",e);

 50     return OK;

 51 }

 52 

 53 //删除栈中的元素

 54 int Pop(SqStack *S,SElemType *e) {

 55     if(S->top  == S->base) return ERROR;

 56     *e = *--S->top;

 57     return OK;

 58 }

 59 

 60 

 61 //清空栈中的元素

 62 int ClearStack(SqStack *S) {

 63     S->top = S->base;

 64     return OK;

 65 }

 66 

 67 //销毁栈

 68 int DestoryStack(SqStack *S) {

 69     S->top = S->base;

 70     free(S->base);

 71     S->top = NULL;

 72     S->base = NULL;

 73     return OK;

 74 }

 75 

 76 //行编辑程序

 77 void LineEdit(SqStack *S) {

 78     SElemType *p,ch,c;

 79     InitStack(S);

 80     ch = getchar();

 81     while(ch != EOF) {

 82         while(ch!=EOF&&ch!='\n') {

 83             switch(ch) {

 84                 case '#':Pop(S,&c);break;

 85                 case '@':ClearStack(S);break;

 86                 default:Push(S,ch);break;

 87             }

 88             ch = getchar();

 89         }

 90         p = S->base;

 91         while(p!=S->top) {

 92             printf("%c",*p);

 93             ++p;

 94         }

 95         ClearStack(S);

 96         if(ch!=EOF) ch = getchar();

 97     }

 98 }

 99 

100 int main()

101 {

102     SqStack sq;

103     int f;

104     LineEdit(&sq);//进行括行编辑

105     DestoryStack(&sq);//将栈销毁

106     return 0;

107 }

 

你可能感兴趣的:(数据结构)