栈和队列---行编辑程序

来源:互联网 发布:yum 安装mysql 5.6 编辑:程序博客网 时间:2024/06/16 03:29

利用栈的链表,实现行编辑。每输入一行数据,按回车后,将栈中数据放入链表,置空栈,从而实现换行。

Define.h内为基本定义

#include<stdio.h>#include<stdlib.h>#include<Define.h>#include<string.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct LNode{char data;struct LNode *next;}LNode, *LinkList;typedef struct{char *base;char *top;int stacksize;}SqStack;void InitList_L(LinkList *L, LinkList *r);//链表初始化void InsertList_L(LinkList *L, LinkList *r, char e);//在链表尾插入数据void PrintLinkList(LinkList L);//输出链表void DestroyLinkList(LinkList *L, LinkList *r);//销毁链表Status InitStack(SqStack *S);//构造一个空栈Status DestroyStack(SqStack *S);//销毁一个栈Status GetTop(SqStack S, char *e);//用e返回栈顶的元素Status Push(SqStack *S, char e);//插入元素e为新的栈顶元素Status Pop(SqStack *S, char *e);//删除栈顶的元素,用e返回void LineEdit();//从终端接收一行并传送到数据区void InitList_L(LinkList *L, LinkList *r){*L = (LinkList)malloc(sizeof(LNode));if ((*L) == NULL){exit(ERROR);}(*L)->next = NULL;(*r) = (*L);printf("\n");}void InsertList_L(LinkList *L, LinkList *r, char e){LinkList p, head;head = (*L);p = (LinkList)malloc(sizeof(LNode));p->data = e;p->next = NULL;(*r)->next = p;(*r) = (*r)->next;}void PrintLinkList(LinkList L){LinkList q = L->next;for(; q != NULL; q = q->next){printf("%c", q->data);}printf("\n");}void DestroyLinkList(LinkList *L, LinkList *r){LinkList q = (*L)->next;for (; q != NULL; q = q->next){free(*L);(*L) = q;}free(*r);}Status InitStack(SqStack *S)//构造一个空栈{S->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));if (!S->base){exit(OVERFLOW);}S->top = S->base;S->stacksize = STACK_INIT_SIZE;printf("初始化成功!\n");return OK;}Status GetTop(SqStack S, char *e)//用e返回栈顶的元素{if (S.top == S.base){return ERROR;}(*e) = *(--S.top);return OK;}Status Push(SqStack *S, char e)//插入元素e为新的栈顶元素{if (S->top - S->base >= S->stacksize){S->base = (char *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(char));if (! S->base){exit(OVERFLOW);}S->top = S->base + S->stacksize;S->stacksize += STACKINCREMENT;}*S->top ++ = e;return OK;}Status Pop(SqStack *S, char *e){if (S->top == S->base){return ERROR;}else{*e = * --S->top;}return OK;}Status DestroyStack(SqStack *S)//销毁栈{if (S->top == S->base){return ERROR;}S->top = S->base;return OK;}void LineEdit()//从终端接收一行并传送到数据区{char ch, c;char *q;LinkList L, r = NULL;SqStack S;InitStack(&S);InitList_L(&L, &r);//链表初始化printf("请输入字符:\n");ch = getchar();while (ch != EOF){while (ch != EOF && ch != '\n'){switch(ch){case '#':Pop(&S, &c);break;case '@':S.top = S.base;break;default:Push(&S, ch);break;}ch = getchar();}for (q = S.base; q < S.top; q++){InsertList_L(&L, &r, *q);}InsertList_L(&L, &r, '\n');S.top = S.base;if (ch != EOF){ch = getchar();}}DestroyStack(&S);/*q = S->base;while (q < S->top){printf("%c", *q);q ++;}printf("\n");S->top = S->base;if (ch != EOF){ch = getchar();}}S->top = S->base;*/PrintLinkList(L);DestroyLinkList(&L, &r);}int main(void){LineEdit();return 0;}

原创粉丝点击