登录站点

用户名

密码

文本编辑器基本程序

已有 204 次阅读  2011-12-13 20:32   标签编辑器  程序员 

/* 文本编辑器1*/
// 文件: 文本编辑.cpp
// 程序员:caoxing
// 日期: 2011-3-24
// 概要: 实行对文本行的处理
// 组成: 由五个自定义函数和一个主函数:
//     Initial( );
//     MenuSelect( );
//     EnterData( );
//     DeleteData( );
//     List( );
//     main( );
// 目的:作为对文本编辑功能提升的基础程序----实现页对行,行对字.词的操作;这也是本程序的不足之处
#i nclude<stdio.h>
#i nclude<stdlib.h>
#define MAX 100     // 最大行数

typedef struct node{
 char Data[80];
 struct node *next;
}nodetype;      //结点类型

typedef struct head{
 int Num;     //行号
 int Len;     //改行字符的个数
 nodetype *next;     
}headtype;      //头结点类型

headtype Head[MAX];

void Initial(  );    //初始化各行头结点
int MenuSelect( );    //菜单选择函数
void EnterData( );    //输入数据函数    
void DeleteData( );    //删除数据函数
void List( );     //显示各行数据函数

int main( )
{
 int choice;     //输入的选择函数模块的函数
 Initial( );   //初始化各行头节点
 while(1)
 {
  choice=MenuSelect( );
  scanf("%d",&choice);
  switch(choice)
  {
   case 1:EnterData( );//输入数据 
             break;
   case 2:DeleteData( );//删除数据
       break;
   case 3:List( ); //显示数据
       break;
   case 4:exit(0);  //退出
  }
 }
 return 0;
}

void Initial( )
{
 int i;
 for(i=0;i<MAX;i++)
 {
  Head[i].Len=0;  //给行头节点长度参数赋为0
 }
}

int MenuSelect( )
{
 int i;
 i=0;
 printf("1:Enter\n");
 printf("2:Delete\n");
 printf("3:List\n");
 printf("4:Exit\n");
 while(i<0||i>4)
 {
  printf("\n");
  scanf("%d",&i);
 }
 return i;
}

void EnterData( )
{
 nodetype *p;
 int i,j,LineNumber,k,m;
 char StrBuffer[100];
 while(1)
 {
  printf("请输入数据要插入的行号(0-100):\n如果退出:输入101\n");
  scanf("%d",&LineNumber);//输入行号
  if(LineNumber==101) break;//判断是否退出
  if(LineNumber<0||LineNumber>=MAX)
  {
   printf("请重新输入行号:\n如想退出:输入101\n");
   scanf("%d",&LineNumber);
  } if(LineNumber==101) break;
   printf("请输入要插入的数据,以@作为结束符号\n");
  i=LineNumber;
  Head[i].Num=LineNumber;//行号赋值
  Head[i].next=(nodetype *)malloc(sizeof(nodetype));
  p=Head[i].next;
  m=1;
  j=-1;
  StrBuffer[0]=0;
  k=0;
  do
  {
   j++;
   if(!StrBuffer[k])
   {
    scanf("%s",StrBuffer);//输入字符串,以确定最后一个为\0
    k=0;
   }
   if(j>=80*m)//如果满足条件,说明数据要存储到下一个节点
   {
    m++;
    p->next=(nodetype *)malloc(sizeof(nodetype));
    p=p->next;
   }
   p->Data[j%80]=StrBuffer[k++];//数据赋值
  }while(p->Data[j%80]!='@');//当为@时,跳出循环
  Head[i].Len=j;
 }
 system("cls");
}

void DeleteData( )
{
 nodetype *p,*q;
 int i,j,m,LineNumber;
 while(1)
 {
  printf("输入要删除的行号(0-100):\n如果想退出,请输入101:\n");
  scanf("%d",&LineNumber);
  if(LineNumber==101) break;
  if(LineNumber<0||LineNumber>=MAX)
  {
   printf("请重新输入行号(0-100)\n如想退出,请输入101:\n");
   scanf("%d",&LineNumber);
  }
  if(LineNumber==101) break;
  i=LineNumber;
  p=Head[i].next;
  m=0;  //节点的初始值
  if(Head[i].Len>0)
  {
   m=(Head[i].Len-1)/80+1;//判断改行用了几个节点
  }
  for(j=0;j<m;j++)
  {
   q=p->next;
   free(p);
   p=q;
  }
  Head[i].Len=0;      //表明该行为空
  Head[i].Num=0;
 }
 system("cls");
}

void List( )
{
 nodetype *p;
 int i,j,m,n,num,index=0;
 for(i=0;i<MAX;i++)
 {
  if(Head[i].Len>0)  //若果本行不空
  {
   ++index;
   printf("第%d行有数据,他们是:\n",Head[i].Num);
   n=Head[i].Len;
   m=1;
   p=Head[i].next;
   for(j=0;j<n;j++) //遍历行
   {
    if(j>=80*m)
    {
     p=p->next;
     m++;
    }
    else
     printf("%c",p->Data[j%80]); //打印数据
   }
   printf("\n");
  }
 }
 if(index==0)
 {
  printf("您还没有存入数据!\n");
 }
     printf("\n");
  printf("请输入101,以方便退出:\n");
  scanf("%d",&num);
  system("cls");
}

上一篇: Signal Tap II简单使用小记 下一篇: /*串的模式匹配算法*/

分享 举报