데이터 구조 - 줄 편집 프로그램

14193 단어 데이터 구조
간단 한 줄 편집 프로그램의 기능 은 사용자 가 터미널 에서 입력 한 프로그램 이나 데 이 터 를 받 아들 이 고 사용자 의 데이터 영역 에 저장 하 는 것 입 니 다.사용자 가 터미널 에 입력 할 때 오류 가 발생 하지 않 을 것 이 라 고 보장 할 수 없 기 때문에 행 편집 프로그램 에서 '한 문 자 를 받 아들 일 때마다 사용자 구역 에 저장 합 니 다' 는 방법 은 적절 하지 않 습 니 다.사용자 가 입력 한 줄 의 문 자 를 받 아들 이 고 한 줄 씩 사용자 데이터 영역 에 저장 하 는 것 이 좋 습 니 다.사용자 가 오 류 를 입력 할 수 있 도록 하고 오류 가 발견 되 었 을 때 바로 고 칠 수 있 도록 합 니 다.예 를 들 어 사용자 가 방금 만 든 문자 가 틀 렸 다 는 것 을 발 견 했 을 때 이전 문자 가 잘못 되 었 음 을 나타 내 는 체크 문자 '\ #' 을 추가 할 수 있 습 니 다.현재 입력 한 줄 에 오류 가 많 거나 고치 기 어 려 운 것 을 발견 하면 현재 줄 에 있 는 문자 가 모두 잘못 되 었 음 을 표시 하기 위해 체크 문자 '@' 을 입력 할 수 있 습 니 다.예 를 들 어 터미널 에서 이 두 줄 의 문 자 를 받 아 들 였 다 고 가정 합 니 다: whil \ # lr \ # 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
",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!='
') { 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 }

좋은 웹페이지 즐겨찾기