/* 文本编辑器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");
}
发表评论 评论 (0 个评论)