C语言实现行编辑程序(严蔚敏老师数据结构3.2)

————————————————————————————————————————————

/**************************************************/
/* 行编辑程序 */
/* 输入的数据存入缓冲区用来接收用户输入的一行字符 */
/* 之后逐行存入用户数据区 */
/* 当用户输入出错时可以输入退格符 # 来表示前一个字符无效 */
/* 输入@ 表示当前行中之前输入的字符无效 */
/**************************************************/

————————————————————————————————————————————

v1:读取一行直接打印,不存入数据区

代码实现:

  1 /**************************************************/
  2 /* v1:读取一行直接打印,不存入数据区 */
  3 /**************************************************/
  4 #include <stdio.h>
  5 #include <string.h>
  6 #include <stdlib.h>
  7 #define STACK_INIT_SIZE 100
  8 #define STACKINCREAMENT 10
  9 #define OK 1
 10 #define ERROR 0
 11 #define OVERFLOW -2
 12 typedef char SElemtype;
 13 typedef int Status;
 14 typedef struct
 15 {
 16     SElemtype *top;
 17     SElemtype *base;
 18     int stacksize;
 19 } SqStack;
 20 Status InitStack(SqStack *s)
 21 {
 22     s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));
 23     if (!s->base)
 24         exit(OVERFLOW);
 25     s->top = s->base;
 26     s->stacksize = STACK_INIT_SIZE;
 27     return OK;
 28 }
 29 Status Push(SqStack *s, SElemtype c)
 30 {
 31     if (s->top - s->base == s->stacksize)
 32     {
 33         s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype));
 34         if (!s->base)
 35             exit(OVERFLOW);
 36         s->top = s->base + s->stacksize;
 37         s->stacksize += STACKINCREAMENT;
 38     }
 39     s->top++;
 40     *(s->top) = c;
 41     return OK;
 42 }
 43 Status Pop(SqStack *s)
 44 {
 45     if (s->top == s->base)
 46         return ERROR;
 47     --s->top; //此处弹栈不需要返回栈顶元素,直接删除即可
 48 }
 49 Status PrintStack(SqStack *s)
 50 {
 51     int i = 0;
 52     while((s->base + i) != (s->top))//遍历栈,从栈底+1开始直到栈顶为止
 53     {
 54         i++;
 55         printf("%c", *(s->base + i));
 56     }
 57     return OK;
 58 }
 59 Status ClearStack(SqStack *s)
 60 {
 61     s->top = s->base;
 62     return OK;
 63 }
 64 /**************************************************/
 65 /* 通过getchar()接收当前输入的一个字符 */
 66 /* 输入为 非#@ 时压栈 */
 67 /* 输入为 # 时弹栈删除上一个字符 */
 68 /* 输入为 @ 时清空栈中元素 */
 69 /* 输入为 \n 时清栈 */
 70 /* 输入为 EOF 时结束输入 */
 71 /**************************************************/
 72 void LineEdit(SqStack *s, SElemtype c)
 73 {
 74     switch(c)
 75     {
 76     case ‘#‘:
 77         Pop(s);
 78         break;
 79     case ‘@‘:
 80         ClearStack(s);
 81         break;
 82     default:
 83         Push(s, c);
 84         break;
 85     }
 86 }
 87 int main(void)
 88 {
 89     SqStack s;
 90     SElemtype c, *temp;
 91     InitStack(&s);
 92     c = getchar();
 93     while(c != EOF)
 94     {
 95         while(c != EOF && c != ‘\n‘)
 96         {
 97             LineEdit(&s, c);
 98             c = getchar();
 99         }
100         PrintStack(&s);
101         ClearStack(&s);
102         printf("\n");
103         // if(c != EOF)
104         c = getchar(); // 读取下一行的第一个字符
105     }
106     return 0;
107 }

————————————————————————————————————————————

v2:将读取到的行存入数据区(字符串数组),最终统一打印

代码实现:

  1 /**************************************************/
  2 /* v2:将读取到的行存入数据区(字符串数组),最终统一打印 */
  3 /**************************************************/
  4 #include <stdio.h>
  5 #include <string.h>
  6 #include <stdlib.h>
  7 #define STACK_INIT_SIZE 100
  8 #define STACKINCREAMENT 10
  9 #define OK 1
 10 #define ERROR 0
 11 #define OVERFLOW -2
 12 typedef char SElemtype;
 13 typedef int Status;
 14 typedef struct
 15 {
 16     SElemtype *top;
 17     SElemtype *base;
 18     int stacksize;
 19 } SqStack;
 20     Status InitStack(SqStack *s)
 21 {
 22     s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));
 23     if (!s->base)
 24         exit(OVERFLOW);
 25     s->top = s->base;
 26     s->stacksize = STACK_INIT_SIZE;
 27     return OK;
 28 }
 29 Status Push(SqStack *s, SElemtype c)
 30 {
 31     if (s->top - s->base == s->stacksize)
 32     {
 33         s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype));
 34         if (!s->base)
 35             exit(OVERFLOW);
 36         s->top = s->base + s->stacksize;
 37         s->stacksize += STACKINCREAMENT;
 38     }
 39     s->top++;
 40     *(s->top) = c;
 41     return OK;
 42 }
 43 Status Pop(SqStack *s)
 44 {
 45     if (s->top == s->base)
 46         return ERROR;
 47     --s->top;
 48 }
 49 Status ClearStack(SqStack *s)
 50 {
 51     s->top = s->base;
 52     return OK;
 53 }
 54 /**************************************************/
 55 /* 通过getchar()接收当前输入的一个字符 */
 56 /* 输入为 非#@ 时压栈 */
 57 /* 输入为 # 时弹栈删除上一个字符 */
 58 /* 输入为 @ 时清空栈中元素 */
 59 /* 输入为 \n 时清栈 */
 60 /* 输入为 EOF 时结束输入 */
 61 /**************************************************/
 62 void LineEdit(SqStack *s, SElemtype c)
 63 {
 64     switch(c)
 65     {
 66     case ‘#‘:
 67         Pop(s);
 68         break;
 69     case ‘@‘:
 70         ClearStack(s);
 71         break;
 72     default:
 73         Push(s, c);
 74         break;
 75     }
 76 }
 77 /**************************************************/
 78 /* 读取栈中的元素存入字符串数组str中 */
 79 /* 需要传入已有的数据长度,避免覆盖之前行的数据 */
 80 /**************************************************/
 81 Status SaveStack(SqStack *s, char *str, int lenData)
 82 {
 83     char temp;
 84     int i, j;
 85     for (i = 0; i < s->top - s->base; ++i)
 86         *(str + i + lenData) = *(s->base + i + 1);
 87     return OK;
 88 }
 89 /**************************************************/
 90 /* 打印数据区元素 */
 91 /**************************************************/
 92 Status PrintDataField(char *str, int lenData)
 93 {
 94     int i;
 95     for(i = 0; i < lenData; i++)
 96         printf("%c", *(str + i));
 97     printf("\n");
 98 }
 99 int main(void)
100 {
101     SqStack s;
102     SElemtype c;
103     char str[]; //数据区通过字符串数组str存放
104     int lenData = 0; //定义数据区长度
105     InitStack(&s);
106     c = getchar();
107     while(c != EOF)
108     {
109         while(c != EOF && c != ‘\n‘)
110         {
111             LineEdit(&s, c);
112             c = getchar();
113         }
114         Push(&s, ‘\n‘); //本行结束,将换行符压入栈中
115         SaveStack(&s, str, lenData); //保存到数据区
116         lenData += s.top - s.base;
117               ClearStack(&s); //清空栈
118         c = getchar(); //读取下一行的第一个字符
119     }
120     printf("- - - - - - data field - - - - - - \n");
121     PrintDataField(str, lenData); //打印数据区
122     return 0;
123 }

————————————————————————————————————————————

v3:将读取到的行存入数据区(结构体),最终统一打印

代码实现:

  1     /**************************************************/
  2 /* v3:将读取到的行存入数据区(结构体),最终统一打印 */
  3 /**************************************************/
  4 #include <stdio.h>
  5 #include <string.h>
  6 #include <stdlib.h>
  7 #define STACK_INIT_SIZE 100
  8 #define STACKINCREAMENT 10
  9 #define OK 1
 10 #define ERROR 0
 11 #define OVERFLOW -2
 12 typedef char SElemtype;
 13 typedef int Status;
 14 typedef struct
 15 {
 16     SElemtype *top;
 17     SElemtype *base;
 18     int stacksize;
 19 } SqStack;
 20 /**************************************************/
 21 /* 定义结构体SqDataField,使用字符数组存放数据 */
 22 /**************************************************/
 23 typedef struct
 24 {
 25     char str[100];
 26 } SqDataField;
 27 Status InitStack(SqStack *s)
 28 {
 29     s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));
 30     if (!s->base)
 31         exit(OVERFLOW);
 32     s->top = s->base;
 33     s->stacksize = STACK_INIT_SIZE;
 34     return OK;
 35 }
 36 Status Push(SqStack *s, SElemtype c)
 37 {
 38     if (s->top - s->base == s->stacksize)
 39     {
 40         s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype));
 41         if (!s->base)
 42             exit(OVERFLOW);
 43         s->top = s->base + s->stacksize;
 44         s->stacksize += STACKINCREAMENT;
 45     }
 46     s->top++;
 47     *(s->top) = c;
 48     return OK;
 49 }
 50 Status Pop(SqStack *s)
 51 {
 52     if (s->top == s->base)
 53         return ERROR;
 54     --s->top;
 55 }
 56 Status ClearStack(SqStack *s)
 57 {
 58     s->top = s->base;
 59     return OK;
 60 }
 61 void LineEdit(SqStack *s, SElemtype c)
 62 {
 63     switch(c)
 64     {
 65     case ‘#‘:
 66         Pop(s);
 67         break;
 68     case ‘@‘:
 69         ClearStack(s);
 70         break;
 71     default:
 72         Push(s, c);
 73         break;
 74     }
 75 }
 76 Status SaveStack(SqStack *s, SqDataField *data, int lenData) //形参接收指向结构体data的地址
 77 {
 78     char temp;
 79     int i, j;
 80     for (i = 0; i < s->top - s->base; ++i)
 81         data->str[i + lenData] = *(s->base + i + 1);
 82     return OK;
 83 }
 84 Status PrintDataField(SqDataField *data, int lenData)
 85 {
 86     int i;
 87     for(i = 0; i < lenData; i++)
 88         printf("%c", data->str[i]);
 89     printf("\n");
 90 }
 91 int main(void)
 92 {
 93     SqDataField data;
 94     SqStack s;
 95     SElemtype c;
 96     int lenData = 0;
 97     InitStack(&s);
 98     c = getchar();
 99     while(c != EOF)
100     {
101         while(c != EOF && c != ‘\n‘)
102         {
103             LineEdit(&s, c);
104             c = getchar();
105         }
106         Push(&s, ‘\n‘);
107         SaveStack(&s, &data, lenData);  //传入结构体data的地址
108         lenData += s.top - s.base;
109         ClearStack(&s);
110         c = getchar();
111     }
112     printf("- - - - - - data field - - - - - - \n");
113     PrintDataField(&data, lenData);
114     return 0;
115 }

————————————————————————————————————————————

v4:定义结构体数组为数据区

代码实现:

  1     /**************************************************/
  2 /* v4:定义结构体数组为数据区 */
  3 /**************************************************/
  4 #include <stdio.h>
  5 #include <string.h>
  6 #include <stdlib.h>
  7 #define STACK_INIT_SIZE 100
  8 #define STACKINCREAMENT 10
  9 #define OK 1
 10 #define ERROR 0
 11 #define OVERFLOW -2
 12 typedef char SElemtype;
 13 typedef int Status;
 14 typedef struct
 15 {
 16     SElemtype *top;
 17     SElemtype *base;
 18     int stacksize;
 19 } SqStack;
 20 /**************************************************/
 21 /* 定义结构体数组来存放数据 */
 22 /**************************************************/
 23 typedef struct SqDataField
 24 {
 25     char c;
 26 } SqStr;
 27     Status InitStack(SqStack *s)
 28 {
 29     s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));
 30     if (!s->base)
 31         exit(OVERFLOW);
 32     s->top = s->base;
 33     s->stacksize = STACK_INIT_SIZE;
 34     return OK;
 35 }
 36 Status Push(SqStack *s, SElemtype c)
 37 {
 38     if (s->top - s->base == s->stacksize)
 39     {
 40         s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype));
 41         if (!s->base)
 42             exit(OVERFLOW);
 43         s->top = s->base + s->stacksize;
 44         s->stacksize += STACKINCREAMENT;
 45     }
 46     s->top++;
 47     *(s->top) = c;
 48     return OK;
 49 }
 50 Status Pop(SqStack *s)
 51 {
 52     if (s->top == s->base)
 53         return ERROR;
 54     --s->top;
 55 }
 56 Status ClearStack(SqStack *s)
 57 {
 58     s->top = s->base;
 59     return OK;
 60 }
 61 void LineEdit(SqStack *s, SElemtype c)
 62 {
 63     switch(c)
 64     {
 65     case ‘#‘:
 66         Pop(s);
 67         break;
 68     case ‘@‘:
 69         ClearStack(s);
 70         break;
 71     default:
 72         Push(s, c);
 73         break;
 74     }
 75 }
 76 Status SaveStack(SqStack *s, struct SqDataField *SqStr, int lenData)//形参为指向结构体数组的指针
 77 {
 78     char temp;
 79     int i, j;
 80     for (i = 0; i < s->top - s->base; ++i)
 81         SqStr[i + lenData].c = *(s->base + i + 1);
 82     return OK;
 83 }
 84 Status PrintDataField(struct SqDataField *SqStr, int lenData)
 85 {
 86     int i;
 87     for(i = 0; i < lenData; i++)
 88         printf("%c", SqStr[i].c);
 89     printf("\n");
 90 }
 91 int main(void)
 92 {
 93     struct SqDataField SqStr[STACK_INIT_SIZE]; //声明结构体数组
 94     SqStack s;
 95     SElemtype c;
 96     int lenData = 0;
 97     InitStack(&s);
 98     c = getchar();
 99     while(c != EOF)
100     {
101         while(c != EOF && c != ‘\n‘)
102         {
103             LineEdit(&s, c);
104             c = getchar();
105         }
106         Push(&s, ‘\n‘);
107         SaveStack(&s, SqStr, lenData);  //传入结构体数组的首地址
108         lenData += s.top - s.base;
109         ClearStack(&s);
110         c = getchar();
111     }
112     printf("- - - - - - data field - - - - - - \n");
113     PrintDataField(SqStr, lenData);
114         return 0;
115 }
时间: 2024-08-09 08:35:53

C语言实现行编辑程序(严蔚敏老师数据结构3.2)的相关文章

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习

严蔚敏《数据结构(C语言版)》——第1章 绪论

数据是对客观事物的符号表示.在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象是性质相同的数据元素的集合,是数据的一个子集. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合. 存储结构是数据结构在计算机中的表示. 数据类型是一个值的集合和定义在这个值集上的一组操作的总称. 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作,是对一般数据类型的扩展. 试描述数据结构和抽象数据类型

数据结构之线性表(严蔚敏《数据结构》要求)

1.每个代码都是博主一个字一个敲出来的(有参考,但是我很认真的去分析了每个函数逻辑结构,并做了一定的修改)2.函数都已经通过测试,没有bug,符合要求3.这里只贴出代码,代码里有些本人的理解和注释,但是没有那么详细 代码分为 main.c 1 #include <stdio.h> 2 #include "fuction.h" 3 4 int main(void){ 5 Sqlist La; 6 Sqlist Lb; 7 Sqlist Lc; 8 int i=0; 9 int

3-3-行编辑程序-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 行编辑程序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载  链接? 无数据

数组和广义表-第5章-《数据结构题集》答案解析-严蔚敏吴伟民版

习题集解析部分 第5章 数组和广义表 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       本习题文档的存放目录:数据结构\▼配套习题解析\▼05 数组和广义表       文档中源码的存放目录:数据结构\▼配

5-3-行逻辑链接的顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 行逻辑链接的顺序表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试

5-2-三元组顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 三元组顺序表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下

查找-第9章-《数据结构题集》习题解析-严蔚敏吴伟民版

习题集解析部分 第9章 查找 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       相关测试数据下载  链接? 数据包       本习题文档的存放目录:数据结构\▼配套习题解析\▼09 查找       文档

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c