利用栈的链表,实现行编辑。每输入一行数据,按回车后,将栈中数据放入链表,置空栈,从而实现换行。
Define.h内为基本定义
#include<stdio.h>
#include<stdlib.h>
#include<Define.h>
#include<string.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef 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;
}