加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言数据结构——简单行编辑(课程设计)

(2010-10-30 19:33:46)
标签:

it

分类: C语言学习

学了一学期的数据结构,个人感觉该课程重在思想,只要思路正确,就肯定可以编出好程序来。选了简单行编辑的课程设计,里面主要用到的数据结构有指针链表。C语言方面用到了很多文件读写操作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#include <windows.h>                    

#define OK 0
typedef struct linedit
{
 char string[80];                       
 struct linedit *next;                  
 struct linedit *pre;                   
 int len;                               
 int dflag;                             
}linedit;
FILE *fp,*pf;                          
linedit *head;                             
int n=0,sum,delsizen,change=0,page=0,pflag=0;
int x0,y0;                              
                                        
                                                                                 
void gotoxy(int x,int y);               
void Createlist();
void freemem();
int initFile();
int display();
int saveanddisplay(int col);
int saveall();
int delet();
int insert();

                                        
void gotoxy(int x,int y)                
{
 COORD coord;
 coord.X=x;
 coord.Y=y;
 SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
                                       
void Createlist()                                 
{
 linedit *p1,*p2;
 system("cls");
 if(!fp||!pf)                                     
 {
  printf("建立链表失败,你应该先进行打开文件操作(初始化文件)!");
  printf("按任意键返回...");
  getch();
  return;
 }
 p1=p2=(linedit *)malloc(sizeof(linedit));        
 head=NULL;
 while(n<10)
 {
  n=n+1;                                        
  if(n==1) head=p1;                             
  else
  {
   p2->next=p1;
   p1->pre=p2;
   p1->dflag=0;
  }
  p2=p1;
  p1=(linedit *)malloc(sizeof(linedit));
 }
 p2->next=NULL;
 pflag=1;
 printf("建立链表成功,按任意键返回...\n");
 getch();
}

void freemem()                                    
{
 linedit *p;
 system("cls");
 for(p=head;head!=NULL;)
 {
  head=p->next;
  free(p);
  p=head;
 }
}

int initFile()                                   
{
 char name[30],outname[30];
 system("cls");
 printf("请先进行打开文件操作...\n");
 printf("请输入要打开的文件名--格式:文件名.后缀,如insert.txt(该文件必须存在)\n");
 scanf("%s",name);
 if(!(fp=fopen(name,"r+")))
 {
  printf("打不开原输入文件或原输入文件不存在!按任意键返回.... \n");
  getch();
  return 0;
 }
 printf("请输入要写入的文件名--格式:文件名.后缀\n");
 scanf("%s",outname);
 if(!(pf=fopen(outname,"w+")))
 {
  printf("打不开输出文件!按任意键返回.... \n");
  getch();
  return 0;
 }
 printf("文件创建成功,请按任意键返回.... \n");
 getch();
 return 0;
}

int display()                                  
{
 int i;
 linedit *p;
 char conti='y';
 system("cls");
 if(!fp||!pf||!pflag)                          
 {
  printf("显示失败,你应该先进行打开文件操作(初始化文件)或者是建立链表!");
  printf("按任意键返回...");
  getch();
  return 0;
 }
 system("cls");
 while((!feof(fp))&&(conti=='y'||conti=='Y')) 
 
  system("cls");
  page++;
  gotoxy(4,2);printf("第%d页\n",page);        
  gotoxy(1,2);printf("以下为输入文件的内容\n"); 
  for(i=0,p=head,sum=0;(i<10)&&(!feof(fp));i++,p=p->next)
  {
   fgets(p->string,sizeof(p->string),fp);
   puts(p->string);
   p->dflag=1;
   p->len=strlen(p->string);
   sum=sum+p->len;
                                           
  gotoxy(2,22);printf("Y若还有下页,则继续查看下页内容,否则退回主菜单,N则退回主菜单");
  printf("请选择(Y/N):");
  conti=getche();
  if(feof(fp))                               
  {
   printf("\n文件已经结束!");
   return 0;
  }
 }
 return 0;
}
int saveanddisplay(int col)                      
{
 int i,endflat=0;
 char conti='y';
 linedit *p=NULL;
 system("cls");
 if(!fp||!pf)
 {
  printf("保存显示失败,你应该先进行打开文件操作(初始化文件)或者建立链表!");
  printf("按任意键返回...");
  getch();
  return 0;
 }
 page++;
 system("cls");                                   
 for(i=0,p=head;i<col;i++,p=p->next)              
  if(p->dflag==1)
  {
   fputs(p->string,pf);
   p->dflag=0;
  }
  if(!feof(fp))
   gotoxy(4,2);printf("第%d页\n",page);
  for(i=0,p=head,sum=0;(i<10)&&(!feof(fp));i++,p=p->next)   
   if(fgets(p->string,sizeof(p->string),fp))
   {
    puts(p->string);
    p->dflag=1;
    p->len=strlen(p->string);
    sum=sum+p->len;
   }
  
   if(feof(fp))
    printf("文件已经结束!");
    printf("保存完毕,任意键返回...");
    getch();
   return 0;
}

int saveall()                                     
{
 int i,endflat=0;
 char conti='y';
 linedit *p;
 system("cls");
 if(!fp||!pf)
 {
  printf("保存失败,你应该先进行打开文件操作(初始化文件)或者建立链表!");
  printf("按任意键返回...");
  getch();
  return 0;
 }
 for(i=0,p=head;i<10;i++,p=p->next)               
  if(p->dflag==1)
  {
   fputs(p->string,pf);
   p->dflag=0;
  }
  while(!feof(fp))                                
   fputc(fgetc(fp),pf);
  return 0;
}

int delet()                                       
{
 linedit *p1,*p2,*p3;
 int min,max,i;
 system("cls");
 if(!fp||!pf)
 {
  printf("行删除失败,你应该先进行打开文件操作(初始化文件)或者建立链表!");
  printf("按任意键返回...");
  getch();
  return 0;
 }
 change=1;
 printf("输入你想删除的起始行,行数应该在1到20之间:\n");
 scanf("%d",&min);
 while(min<1||min>20)                              
 {
  printf("输入的行数应该在1到20之间!"); 
  printf("请重新输入你想删除的起始行:\n");
  scanf("%d",&min);
 }
 printf("输入你想删除的终止行:\n");
 scanf("%d",&max);
 while(max<1||max>20)
 {
  printf("输入的行数应该在1到20之间!"); 
  printf("请重新输入你想删除的终止行:\n");
  scanf("%d",&max);
 }
 if(head==NULL)
 {
  printf("\n链表为空,输入文件没有内容!\n");
  return 0;
 }
 p1=p2=head;
 for(i=0;i<min-1;i++)                             
  p1=p1->next;
 for(i=0;i<max;i++)                               
  p2=p2->next;
 for(delsizen=0;p1!=p2;p1=p1->next)               
 {
  p1->dflag=0;
  delsizen=delsizen+p1->len;
 }
 for(i=0,p3=head;i<10;i++,p3=p3->next)            
  if(p3->dflag==1)
   puts(p3->string);
  printf("即将进行保存,请按任意键...");
  getch();
  saveanddisplay(10);                             
  change=1;
  system("cls");
  printf("删除成功,按任意键返回...");
  getch();
  return 0;
}

int insert()                                      
{
 int col,i,increhang=1,number=1;
 linedit *p,*p1,*p2;                              
 system("cls");
 if(!fp||!pf)                                     
 {
  printf("行插入失败,你应该先进行打开文件操作(初始化文件)或者建立链表!");
  printf("按任意键返回...");
  getch();
  return 0;
 }
 change=1;
 printf("输入你想插入的行数:\n");
 scanf("%d",&col);
 while(col<1||col>20)                             
 {
  printf("输入的行数应该在1到20之间!"); 
  printf("请重新输入你想插入的行数:\n");
  scanf("%d",&col);
 }
 p=p1=NULL;
 for(i=0,p1=head;i<col-1;i++,p1=p1->next);        
 p=(linedit *)malloc(sizeof(linedit));            
 p->dflag=1;
 p->next=p1->next;                                
 p->pre=p1;
 p1->next->pre=p;
 p1->next=p;
 printf("输入你想插入的内容并以取地址'&'结束:\n");
 p->string[0]=getchar();
 for(i=1;(i<80)&&(p->string[i-1]!='&');i++)      
 {
  p->string[i]=getchar();
  if((i+1==80)&&(p->string[i]!='&'))             
                                              
   p1=p;                                         
   p=(linedit*)malloc(sizeof(linedit));
   p->dflag=1;
   p->next=p1->next;
   p->pre=p1;
   p1->next->pre=p;
   p1->next=p;
   i=0;
   increhang++;
  }
  p->len=i;
 }
 p->string[i-1]='\n';
 p->string[i]='\0';
 printf("修改后的链表:\n");
 for(p2=head;p2!=NULL;p2=p2->next)               
 puts(p2->string);
 printf("插入成功,按任意键进行保存...");
 getch();
 saveanddisplay(10+increhang);                   
 change=1;
 system("cls");
 printf("按任意键返回主菜单...");
 getch();
 return 0;
}

int main()                                       
{
 char ch;
 int x0,y0;
 gotoxy(5,10);
 printf("请先进行活区初始化,按任意键继续...");
 getch();
 initFile();                                     
 while(1)
 
  system("cls");
  gotoxy(27,3);  printf("+-----------------------------+");         
  gotoxy(27,4);  printf("|   CopyRight by Jinlianghe   |");
  gotoxy(27,5);  printf("|         3108006677          |");
  gotoxy(27,6);  printf("+-----------------------------+");
  x0=18,y0=8;
  gotoxy(x0,y0);   printf("************************************************\n");
  gotoxy(x0,y0+=1);printf("*                0:初始化文件(w)               *\n");
  gotoxy(x0,y0+=1);printf("*                1:建立链表(c)                 *\n");
  gotoxy(x0,y0+=1);printf("*                2:显示活区(p)                 *\n");
  gotoxy(x0,y0+=1);printf("*                3:行插入(i)                   *\n");
  gotoxy(x0,y0+=1);printf("*                4:行删除(d)                   *\n");
  gotoxy(x0,y0+=1);printf("*                5:活区切换(n)                 *\n");
  gotoxy(x0,y0+=1);printf("*                6:保存(e)                     *\n");
  gotoxy(x0,y0+=1);printf("*                7:退出(0)                     *\n");
  gotoxy(x0,y0+=1);printf("************************************************\n");
  gotoxy(x0,y0+=1);printf("请选择p ,i, d, n, e进行操作...\n");
  gotoxy(x0+=31,y0);
  scanf("%c",&ch);
   switch(ch)
  {
  case 'e': case 'E':
   if(change==1)
    saveall();
    freemem();                                                           
   if(fp) fclose(fp);                                                    
   if(pf) fclose(pf);
   system("cls");
   printf("已保存,按任意键返回...");
   getch();
   break;
   case 'c':case 'C':
   Createlist();                                                                           
   break;
   case 'w':case 'W':
   initFile();                                                                             
   break;
  case 'p':case 'P':
   display();
   break;
  case 'n':case 'N':
   saveanddisplay(10);                                                   
   break;
  case 'd':case 'D':
   delet();                                                              
   break;
  case 'i': case 'I':
   insert();                                                             
   break;
  case '0':exit(0);break;                                                
  default:break;
  }
 }
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有