三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 306|回复: 0
打印 上一主题 下一主题

C语言数据结构-algo4-3.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:35:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo4-3.c 文本行编辑 */
  2. #include"c1.h"
  3. #include"c4-2.h" /* 采用串的堆分配存储结构 */
  4. #include"bo4-2.c" /* 串的堆分配基本操作 */

  5. #define MAX_LEN 25 /* 文件最大行数 */
  6. #define LINE_LEN 75 /* 每行字符数最大值+1 */
  7. #define NAME_LEN 20 /* 文件名最大长度(包括盘符、路径)+1 */

  8. /* 全局变量 */
  9. HString T[MAX_LEN];
  10. char str[LINE_LEN],filename[NAME_LEN]="";
  11. FILE *fp;
  12. int n=0; /* 文件行数 */

  13. void Open()
  14. { /* 打开文件(新或旧) */
  15.    int i;
  16.    if(filename[0]) /* 文件已打开 */
  17.      printf("已存在打开的文件\n");
  18.    else
  19.    {
  20.      printf("请输入文件名(可包括盘符、路径,不超过%d个字符): ",NAME_LEN-1);
  21.      scanf("%s%*c",filename);
  22.      fp=fopen(filename,"r");
  23.      if(fp) /* 已存在此文件 */
  24.      {
  25.        do
  26.        {
  27.          fgets(str,LINE_LEN,fp);
  28.          i=strlen(str);
  29.          str[i-1]=0; /* 将10强制改为0 */
  30.          i--;
  31.          if(i>0)
  32.          {
  33.            StrAssign(&T[n],str);
  34.            n++;
  35.            if(n>MAX_LEN)
  36.            {
  37.              printf("文件太大\n");
  38.              return;
  39.            }
  40.          }
  41.        }while(i>0);
  42.        fclose(fp);
  43.      }
  44.      else
  45.        printf("新文件\n");
  46.    }
  47. }

  48. void List()
  49. { /* 显示文件内容 */
  50.    int i;
  51.    for(i=0;i<n;i++)
  52.    {
  53.      printf("%d: ",i+1);
  54.      StrPrint(T[i]);
  55.    }
  56.    getchar();
  57. }

  58. void Insert()
  59. { /* 插入行 */
  60.    int i,l,m;
  61.    printf("在第l行前插m行,请输入l m: ");
  62.    scanf("%d%d%*c",&l,&m);
  63.    if(n+m>MAX_LEN)
  64.    {
  65.      printf("插入行太多\n");
  66.      return;
  67.    }
  68.    if(n>=l-1&&l>0)
  69.    {
  70.      for(i=n-1;i>=l-1;i--)
  71.        T[i+m]=T[i];
  72.      n+=m;
  73.      printf("请顺序输入待插入内容:\n");
  74.      for(i=l-1;i<l-1+m;i++)
  75.      {
  76.        gets(str);
  77.        InitString(&T[i]);
  78.        StrAssign(&T[i],str);
  79.      }
  80.    }
  81.    else
  82.      printf("行超出范围\n");
  83. }

  84. void Delete()
  85. { /* 删除行 */
  86.    int i,l,m;
  87.    printf("从第l行起删除m行,请输入l m: ");
  88.    scanf("%d%d%*c",&l,&m);
  89.    if(n>=l+m-1&&l>0)
  90.    {
  91.      for(i=l-1+m;i<n;i++)
  92.        T[i-m]=T[i];
  93.      for(i=n-m;i<n;i++)
  94.        InitString(&T[i]);
  95.      n-=m;
  96.    }
  97.    else
  98.      printf("行超出范围\n");
  99. }

  100. void Copy()
  101. { /* 拷贝行 */
  102.    int i,l,m,k;
  103.    printf("把第l行开始的m行插在原k行之前,请输入l m k: ");
  104.    scanf("%d%d%d%*c",&l,&m,&k);
  105.    if(n+m>MAX_LEN)
  106.    {
  107.      printf("拷贝行太多\n");
  108.      return;
  109.    }
  110.    if(n>=k-1&&n>=l-1+m&&(k>=l+m||k<=l))
  111.    {
  112.      for(i=n-1;i>=k-1;i--)
  113.        T[i+m]=T[i];
  114.      n+=m;
  115.      if(k<=l)
  116.        l+=m;
  117.      for(i=l-1;i<l-1+m;i++)
  118.      {
  119.        InitString(&T[i+k-l]);
  120.        StrCopy(&T[i+k-l],T[i]);
  121.      }
  122.    }
  123.    else
  124.      printf("行超出范围\n");
  125. }

  126. void Modify()
  127. { /* 修改行 */
  128.    int i;
  129.    printf("请输入待修改的行号: ");
  130.    scanf("%d%*c",&i);
  131.    if(i>0&&i<=n) /* 行号合法 */
  132.    {
  133.      printf("%d: ",i);
  134.      StrPrint(T[i-1]);
  135.      printf("请输入新内容: ");
  136.      gets(str);
  137.      StrAssign(&T[i-1],str);
  138.    }
  139.    else
  140.      printf("行号超出范围\n");
  141. }

  142. void Search()
  143. { /* 查找字符串 */
  144.    int i,k,f=1; /* f为继续查找标志 */
  145.    char b;
  146.    HString s;
  147.    printf("请输入待查找的字符串: ");
  148.    scanf("%s%*c",str);
  149.    InitString(&s);
  150.    StrAssign(&s,str);
  151.    for(i=0;i<n&&f;i++) /* 逐行查找 */
  152.    {
  153.      k=1; /* 由每行第1个字符起查找 */
  154.      while(k)
  155.      {
  156.        k=Index(T[i],s,k); /* 由本行的第k个字符开始查找 */
  157.        if(k) /* 找到 */
  158.        {
  159.          printf("第%d行: ",i+1);
  160.          StrPrint(T[i]);
  161.          printf("第%d个字符处找到。继续查找吗(Y/N)? ",k);
  162.          b=getchar();
  163.          getchar();
  164.          if(b!='Y'&&b!='y') /* 中断查找 */
  165.          {
  166.            f=0;
  167.            break;
  168.          }
  169.          else
  170.            k++;
  171.        }
  172.      }
  173.    }
  174.    if(f)
  175.      printf("没找到\n");
  176. }

  177. void Replace1()
  178. { /* 替换字符串 */
  179.    int i,k,f=1; /* f为继续替换标志 */
  180.    char b;
  181.    HString s,t;
  182.    printf("请输入待替换的字符串: ");
  183.    scanf("%s%*c",str);
  184.    InitString(&s);
  185.    StrAssign(&s,str);
  186.    printf("替换为: ");
  187.    scanf("%s%*c",str);
  188.    InitString(&t);
  189.    StrAssign(&t,str);
  190.    for(i=0;i<n&&f;i++) /* 逐行查找、替换 */
  191.    {
  192.      k=1; /* 由每行第1个字符起查找 */
  193.      while(k)
  194.      {
  195.        k=Index(T[i],s,k); /* 由本行的第k个字符开始查找 */
  196.        if(k) /* 找到 */
  197.        {
  198.          printf("第%d行: ",i+1);
  199.          StrPrint(T[i]);
  200.          printf("第%d个字符处找到。是否替换(Y/N)? ",k);
  201.          b=getchar();
  202.          getchar();
  203.          if(b=='Y'||b=='y')
  204.          {
  205.            StrDelete(&T[i],k,StrLength(s));
  206.            StrInsert(&T[i],k,t);
  207.          }
  208.          printf("继续替换吗(Y/N)?");
  209.          b=getchar();
  210.          getchar();
  211.          if(b!='Y'&&b!='y') /* 中断查找、替换 */
  212.          {
  213.            f=0;
  214.            break;
  215.          }
  216.          else
  217.            k+=StrLength(t);
  218.        }
  219.      }
  220.    }
  221.    if(f)
  222.      printf("没找到\n");
  223. }

  224. void Save()
  225. { /* 存盘 */
  226.    int i;
  227.    getchar();
  228.    fp=fopen(filename,"w");
  229.    if(fp)
  230.    {
  231.      for(i=0;i<n;i++)
  232.      {
  233.        T[i].ch[T[i].length]=0;
  234.        fputs(T[i].ch,fp);
  235.        fputc(10,fp);
  236.      }
  237.      fputc(10,fp);
  238.      fclose(fp);
  239.    }
  240.    else
  241.      printf("存盘失败\n");
  242. }

  243. void main()
  244. {
  245.    Status s=TRUE;
  246.    int i,k;
  247.    for(i=0;i<MAX_LEN;i++) /* 初始化串 */
  248.      InitString(&T[i]);
  249.    while(s)
  250.    {
  251.      printf("请选择: 1.打开文件(新或旧)  2.显示文件内容\n");
  252.      printf("        3.插入行  4.删除行  5.拷贝行  6.修改行\n");
  253.      printf("        7.查找字符串        8.替换字符串\n");
  254.      printf("        9.存盘退出          0.放弃编辑\n");
  255.      scanf("%d",&k);
  256.      switch(k)
  257.      {
  258.        case 1: Open();
  259.                break;
  260.        case 2: List();
  261.                break;
  262.        case 3: Insert();
  263.                break;
  264.        case 4: Delete();
  265.                break;
  266.        case 5: Copy();
  267.                break;
  268.        case 6: Modify();
  269.                break;
  270.        case 7: Search();
  271.                break;
  272.        case 8: Replace1();
  273.                break;
  274.        case 9: Save();
  275.        case 0: s=FALSE;
  276.      }
  277.    }
  278. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-10-21 00:32 , Processed in 0.028788 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表