📄 shixian.h
字号:
输入:BLCK_Q *BLCK_Q,INF_BLCK *pblck
BLCK_Q 队列指针
pblck 入队结点指针
输出:无
作用:实现插入队列的操作,供ExtrCmp调用
**************************************************************************************/
void InsQ(BLCK_Q *BLCK_Q,INF_BLCK *pblck)
{/*插入队列函数*/
INF_BLCK *q_hd; /*指示队列的头指针*/
INF_BLCK *q_rr; /*指示队列的尾指针*/
/*初始化*/
q_hd=BLCK_Q->head->next;
q_rr=BLCK_Q->rear;
if(BLCK_Q->head==q_rr)
{/*队列为空则编辑头指针*/
BLCK_Q->head->next=pblck;
}
else
{/*队列不为空则编辑尾指针*/
q_rr->next=pblck;
}
BLCK_Q->rear=pblck; /*尾插入法*/
}
/**************************************************************************************
函数名称:CmpltMssn
输入:int fini,BLCK_Q *INF_BLCK_OLD,BLCK_Q *INF_BLCK_NW,BLCK_Q *RSLT_BLCK_Q
整型变量fini用来表示比较任务是否完成 >=2:文件比较全部完
2:新版本读完且比较完
3:旧版本读完且比较完
4:新旧版本都读完
<2情况不会调用到此函数,并且ExtrCmp()中没有可能赋大于4的数值给fini
INF_BLCK_NW 存放从新版本中读取的信息队列供比较模块取数据
INF_BLCK_OLD 存放从旧版本中读取的信息队列供比较模块取数据
RSLT_BLCK_Q 是比较结果清单队列,存放比较结果,供统计、标记取结果
pold_cmp pnw_cmp的说明参看ExtrCmp.c
输出:无
作用:供ExtrCmp调用,实现最后的清单操作
complete mission
**************************************************************************************/
void CmpltMssn(int fini,BLCK_Q *INF_BLCK_OLD,BLCK_Q *INF_BLCK_NW,BLCK_Q *RSLT_BLCK_Q )
{
int bttm_nw=0;
int bttm_old=0;
int RdOld(char *);
int RdNw(char *);
INF_BLCK *pnw;
INF_BLCK *pold;
INF_BLCK *pold_cmp;
INF_BLCK *pnw_cmp;
pold_cmp=NULL;
pnw_cmp=NULL;
pnw=INF_BLCK_NW->head->next;
pold=INF_BLCK_OLD->head->next;
switch(fini)
{
case 2:{/*新版本读完且比较完的操作*/
while(bttm_old==0)
{/*将剩余的信息全部读出来*/
pold_cmp=(INF_BLCK *)malloc(sizeof(INF_BLCK)); /*申请空间*/
Init(pold_cmp->version,100);
bttm_old=RdOld(pold_cmp->version); /*从旧版本中读取信息*/
if(bttm_old==0)
{/*查看是否读到文件结尾*/
InsQ(INF_BLCK_OLD,pold_cmp); /*读到旧版本比较队列*/
pold_cmp->type=1; /*定义修改类型为删除*/
pold_cmp->next=NULL;
strcpy(pold_cmp->add,"\0");
strcpy(pold_cmp->del,"\0");
}
else
{
free(pold_cmp); /*释放掉因读到结尾而书写失败的结点*/
}
}
/*将旧版本比较队列的信息都调入结果队列*/
InsQ(RSLT_BLCK_Q,pold);
INF_BLCK_OLD->head->next=NULL; /*编辑头结点,防止错误操作该结点*/
RSLT_BLCK_Q->rear=INF_BLCK_OLD->rear;
INF_BLCK_OLD->rear=INF_BLCK_OLD->head; /*编辑尾结点,防止错误操作该结点*/
break;
}
case 3:{/*旧版本读完且比较完的操作*/
while(bttm_nw==0)
{/*将剩余的信息全部读出来*/
pnw_cmp=(INF_BLCK *)malloc(sizeof(INF_BLCK)); /*申请空间*/
Init(pnw_cmp->version,100);
bttm_nw=RdNw(pnw_cmp->version); /*从新版本中读取信息*/
if(bttm_nw==0)
{
InsQ(INF_BLCK_NW,pnw_cmp); /*读到新版本比较队列*/
pnw_cmp->type=3; /*定义修改类型为新增*/
pnw_cmp->next=NULL;
strcpy(pnw_cmp->add,"\0");
strcpy(pnw_cmp->del,"\0");
}
else
{
free(pnw_cmp); /*释放掉因读到结尾而书写失败的结点*/
}
}
/*将新版本比较队列的信息都调入结果队列*/
InsQ(RSLT_BLCK_Q,pnw);
RSLT_BLCK_Q->rear=INF_BLCK_NW->rear;
INF_BLCK_NW->head->next=NULL; /*编辑头结点,防止错误操作该结点*/
INF_BLCK_NW->rear=INF_BLCK_NW->head; /*编辑尾结点,防止错误操作该结点*/
break;
}
case 4:{/*新旧版本都读完*/
/*将旧版本比较队列的信息都调入结果队列*/
InsQ(RSLT_BLCK_Q,pold);
RSLT_BLCK_Q->rear=INF_BLCK_OLD->rear;
INF_BLCK_OLD->head->next=NULL;
INF_BLCK_OLD->rear=INF_BLCK_OLD->head;
/*将新版本比较队列的信息都调入结果队列*/
InsQ(RSLT_BLCK_Q,pnw);
RSLT_BLCK_Q->rear=INF_BLCK_NW->rear;
INF_BLCK_NW->head->next=NULL;
INF_BLCK_NW->rear=INF_BLCK_NW->head;
break;
}
default:{/*报错处理*/
printf("fini赋值错误");
//getch();
exit(1);
break;
}
}
}
/****************************************************************************************
函数名称:EdtRslt
输入:INF_BLCK *pnw_cmp,INF_BLCK *pold_cmp,BLCK_Q *INF_BLCK_NW,BLCK_Q *INF_BLCK_OLD,BLCK_Q *RSLT_BLCK_Q
INF_BLCK_NW 存放从新版本中读取的信息队列供比较模块取数据
INF_BLCK_OLD 存放从旧版本中读取的信息队列供比较模块取数据
RSLT_BLCK_Q 是比较结果清单队列,存放比较结果,供统计、标记取结果
pold_cmp pnw_cmp的说明参看ExtrCmp.c
输出:无
作用:一次比较成功后,实现对清单队列的操作
edit result
****************************************************************************************/
void EdtRslt(INF_BLCK *pnw_cmp,INF_BLCK *pold_cmp,BLCK_Q *INF_BLCK_NW,BLCK_Q *INF_BLCK_OLD,BLCK_Q *RSLT_BLCK_Q)
{
/*pnw和pold的作用和ExtrCmp函数中的作用完全一样*/
INF_BLCK *pnw;
INF_BLCK *pold;
pnw=INF_BLCK_NW->head->next;
pold=INF_BLCK_OLD->head->next;
while(pold!=pold_cmp)
{
InsQ(RSLT_BLCK_Q,pold);
pold=pold->next;
}
if(RSLT_BLCK_Q->rear->next!=NULL)
{
RSLT_BLCK_Q->rear->next=NULL; /*断开和原来队列的联系*/
}
else
{
/*空操作*/
}
INF_BLCK_OLD->head->next=pold_cmp->next;
pold_cmp->next=NULL;
if(INF_BLCK_OLD->head->next==NULL)
{
INF_BLCK_OLD->rear=INF_BLCK_OLD->head; /*编辑尾结点,防止错误操作该结点*/
}
else
{
/*空操作*/
}
while(pnw!=pnw_cmp)
{
InsQ(RSLT_BLCK_Q,pnw);
pnw=pnw->next;
}
if(RSLT_BLCK_Q->rear->next!=NULL)
{
RSLT_BLCK_Q->rear->next=NULL; /*断开和原来队列的联系*/
}
else
{
/*空操作*/
}
INF_BLCK_NW->head->next=pnw_cmp->next;
if(INF_BLCK_NW->head->next==NULL)
{
INF_BLCK_NW->rear=INF_BLCK_NW->head; /*编辑尾结点,防止错误操作该结点*/
}
else
{
/*空操作*/
}
InsQ(RSLT_BLCK_Q,pold_cmp); /*最后入清单队列的是pold_cmp*/
free(pnw_cmp); /*pnw_cmp失去利用价值,释放*/
}
/************************************************************************/
/**************************************************************************************
文件名:extr_cmp.c
简要描述:全局比较模块
***************************************************************************************/
/**************************************************************************************
函数名称:ExtrCmp
输入:BLCK_Q *INF_BLCK_NW,BLCK_Q *INF_BLCK_OLD,BLCK_Q *RSLT_BLCK_Q
INF_BLCK_NW 存放从新版本中读取的信息队列供比较模块取数据
INF_BLCK_OLD 存放从旧版本中读取的信息队列供比较模块取数据
RSLT_BLCK_Q 是比较结果清单队列,存放比较结果,供统计、标记取结果
输出:一个int型的返回值。0表示两个版本比较工作尚未完成,1表示两个版本比较工作比较完成。
作用:整个外部比较模块的核心
***************************************************************************************/
int ExtrCmp(BLCK_Q *INF_BLCK_NW,BLCK_Q *INF_BLCK_OLD,BLCK_Q *RSLT_BLCK_Q)
{
/*全函数开始前的初始化数据*/
int RdNw(char *); /*读取新版本信息的函数声名*/
int RdOld(char *); /*读取旧版本信息的函数声名*/
void InsQ(BLCK_Q *,INF_BLCK *); /*入队函数声名*/
int IntrCmp(char *,char *,char *,char *); /*内部比较函数声名*/
int fini=0; /*1:任务完成 0:任务未完成 >=2:文件比较全部完成
2:新版本读完且比较完
3:旧版本读完且比较完
4:新旧版本都读完*/
int sml_ln=0; /*1:不是对应行 0:对应行*/
int bttm_nw=0; /*1:新版本文件读到结尾 0:文件未读完*/
int bttm_old=0; /*1:旧版本文件读到结尾 0:文件未读完*/
INF_BLCK *pold; /*pold是指向旧版本信息的指针*/
INF_BLCK *pnw; /*pnw是指向新版本信息的指针*/
INF_BLCK *pnw_cmp; /*pnw_cmp是指向待立刻比较的新版本信息的指针*/
INF_BLCK *pold_cmp; /*pold_cmp是指向待立刻比较的旧版本信息的指针*/
while(fini==0)
{
/*每次比较前的初始化数据*/
pnw=INF_BLCK_NW->head->next;
pold=INF_BLCK_OLD->head->next;
pnw_cmp=(INF_BLCK *)malloc(sizeof(INF_BLCK));
pold_cmp=(INF_BLCK *)malloc(sizeof(INF_BLCK));
/*新版本信息初始化*/
pnw_cmp->type=3; /*默认修改类型为新增行*/
pnw_cmp->next=NULL;
Init(pnw_cmp->version,100);
bttm_nw=RdNw(pnw_cmp->version); /*从新版本中读取信息*/
/*防止传入空串*/
if(pnw_cmp->version=='\0')
{
strcpy(pnw_cmp->version," ");
}
else
{
}
Init(pnw_cmp->add,50);
Init(pnw_cmp->del,50);
/*旧版本信息初始化*/
pold_cmp->type=1; /*默认修改类型为删除行*/
pold_cmp->next=NULL;
Init(pold_cmp->version,100);
bttm_old=RdOld(pold_cmp->version); /*从旧版本中读取信息*/
/*防止传入空串*/
if(pold_cmp->version=='\0')
{
strcpy(pold_cmp->version," ");
}
else
{
}
Init(pold_cmp->add,50);
Init(pold_cmp->del,50);
if(bttm_nw!=0)
{/*新版本文件读到结尾*/
if(INF_BLCK_NW->rear==INF_BLCK_NW->head)
{/*对应的新版本比较队列为空,达到任务完成的条件*/
fini=2;
}
else
{
/*空操作*/
}
free(pnw_cmp); /*清除无用空间*/
pnw_cmp=pnw; /*指向新版本队列第一条信息*/
}
else
{
InsQ(INF_BLCK_NW,pnw_cmp); /*入新版本队列*/
}
if(bttm_old!=0)
{/*旧版本文件读到结尾*/
if(INF_BLCK_OLD->rear==INF_BLCK_OLD->head)
{/*对应的旧版本比较队列为空,达到任务完成的条件*/
fini=3;
}
else
{
/*空操作*/
}
free(pold_cmp); /*清除无用空间*/
pold_cmp=pold; /*指向旧版本队列第一条信息*/
}
else
{
InsQ(INF_BLCK_OLD,pold_cmp); /*入旧版本队列*/
}
if((bttm_old==1)&&(bttm_nw==1))
{/*两篇文章都到结尾,达到任务完成的条件*/
fini=4;
}
else
{
/*空操作*/
}
if(fini>=2)
{/*达到文件比较全部完成的条件*/
CmpltMssn(fini,INF_BLCK_OLD,INF_BLCK_NW,RSLT_BLCK_Q);
}
else
{/*文件还未全部完成比较,进行本次比较工作*/
pnw=INF_BLCK_NW->head->next;
pold=INF_BLCK_OLD->head->next;
while(((pold!=NULL)||(pnw!=NULL))&&(fini==0))
{
if(strcmp(pnw_cmp->version,pold_cmp->version)==0)
{/*是完全一样的两行内容*/
fini=1; /*完成本次比较*/
pold_cmp->type=0; /*定义为无变化*/
same++;//////////////////////////////////////
}
else
{/*不是完全一样的两行内容*/
sml_ln=IntrCmp(pold_cmp->version,pnw_cmp->version,pold_cmp->add,pold_cmp->del); /*使用内部比较模块进行比较*/
if(sml_ln==0)
{/*是对应的两行*/
fini=1; /*完成本次比较*/
pold_cmp->type=2; /*定义为修改*/
}
else
{
if((pnw==NULL)||(pnw_cmp==pnw))
{/*新版本信息全部比较过或新版本队列只有一条信息*/
pnw_cmp=INF_BLCK_NW->rear; /*确保pnw_cmp是最新读入的新版本信息*/
pnw=NULL;
if((pold==NULL)||(pold_cmp==pold))
{/*旧版本信息全部比较过或旧版本队列只有一条信息*/
pold=NULL;
}
else
{
/*将旧版本比较队列中的下一条信息替换当前的pold_cmp,预备和最新读入的新版本信息比较*/
pold_cmp=pold;
pold=pold->next;
}
}
else
{
/*将新版本比较队列中的下一条信息替换当前的pnw_cmp,预备和最新读入的旧版本信息比较*/
pnw_cmp=pnw;
pnw=pnw->next;
}
}
}
}
}
}
if(fini==1)
{/*本次的比较结束*/
EdtRslt(pnw_cmp,pold_cmp,INF_BLCK_NW,INF_BLCK_OLD,RSLT_BLCK_Q); /*编辑清单队列*/
return (0); /*告诉主程序模块,比较尚未完全完成*/
}
else
{/*所有的比较任务都完成*/
return (1); /*告诉主程序模块,比较已经完全完成*/
}
}
/*****************************************************************************/
/****************************************************
文件名:OtptRslt.c;Otpt2Rslt.c;
简要描述:写入行变动信息,添入修改标志
*****************************************************/
/****************************************************
函数名:OtptRslt.c;
功能:新建文件写入改变动信息;统计修改信息,清空队列信息节点。
输入:比较结果队列
输出:统计结果;生成的文件
*****************************************************/
void OtptRslt(BLCK_Q *q)
{
FILE *fp1,*fp2;
INF_BLCK *p,*p2;
int flag=1;
p=q->head->next;
if(p==NULL)
return;
if((fp1=fopen("D:\\file1.txt","ab"))==NULL)/*新建文件fp1:源文件和修改记录和行志fp2:修改标志和行标志*/
{
printf("\n Open file1 erroe!!!\n");
exit(0);
}
if((fp2=fopen("D:\\file2.txt","ab"))==NULL)
{
printf("\n Open file2 error!!!\n");
exit(0);
}
while(flag) /*写入文件*/
{
a[p->type]++;
cnt1=a[0]+a[2]+a[3];
cnt2=a[1]+a[2]+a[3];
if(p->type==0)
fprintf(fp1,"%-7d %s\r\n",cnt1,p->version);
if(p->type==1)
{
fprintf(fp1," /*%s 此行被删除*/\r\n",p->version);
fprintf(fp2,"%-7d /*%s 此行被删除*/\r\n",cnt2,p->version);
}
if(p->type==2)
{
fprintf(fp1,"%-7d %s /*此行被修改:删除了%s ,增加了 %s*/\r\n",cnt1,p->version,p->add,p->del);
fprintf(fp2,"%-7d %s /*此行被修改:删除了%s ,增加了 %s*/\r\n",cnt2,p->version,p->add,p->del);
}
if(p->type==3)
{
fprintf(fp1,"%-7d %s /*此行为增加*/\r\n",cnt1,p->version);
fprintf(fp2,"%-7d %s /*此行为增加*/\r\n",cnt2,p->version);
}
p2=p; /*回收节点空间*/
if(p!=q->rear)
{
p=p->next;
free(p2);
}
else
{
q->rear=q->head;
free(p2);
flag=0;
}
}
fclose(fp1);
fclose(fp2);
}
/****************************************************
函数名:Otpt2Rslt.c;
功能:写入统计修改信息和变动信息;在屏幕上输出完整文件。
输入:统计结果;上一函数生成变动信息文件。
输出:输出列表1,和2。
*****************************************************/
void Otpt2Rslt(void)
{
int flag=1;
char c;
FILE *fp1,*fp2,*fp3,*fp4;
if((fp1=fopen("D:\\file1.txt","rb"))==NULL)
{
printf("\n Open file1 erroe!!!\n");
exit(0);
}
if((fp2=fopen("D:\\file2.txt","rb"))==NULL)
{
printf("\n Open file2 error!!!\n");
exit(0);
}
if((fp3=fopen("D:\\filelist1.txt","wb"))==NULL)
{
printf("\n Open filelist1 erroe!!!\n");
exit(0);
}
if((fp4=fopen("D:\\filelist2.txt","wb"))==NULL)
{
printf("\n Open filelist2 error!!!\n");
exit(0);
}
fprintf(fp3,"修改标志\r\n修改日期:%s;\r\n修改作者:%s;\r\n修改原因:%s;\r\n修改的行数:%d;\r\n增加的行数:%d;\r\n删除的行数:%d;\r\n总的代码行数:%d;\r\n\r\n",strdate,strauthur,strreason,a[2],a[3],a[1],cnt1);
fprintf(fp4,"修改标志\r\n修改日期:%s;\r\n修改作者:%s;\r\n修改原因:%s;\r\n修改的行数:%d;\r\n增加的行数:%d;\r\n删除的行数:%d;\r\n总的代码行数:%d;\r\n\r\n",strdate,strauthur,strreason,a[2],a[3],a[1],cnt1);
while(!feof(fp1))
fputc(fgetc(fp1),fp3);
while(!feof(fp2))
fputc(fgetc(fp2),fp4);
fclose(fp1);
fclose(fp2);
fclose(fp3);
fclose(fp4);
system("del d:\\file1.txt"); /*删除中间文件*/
system("del d:\\file2.txt");
while(flag) //此段为修改2
{
printf("\n请选择:\n1.带有源代码和修改信息 2.修改记录和行标志 3.退出\n");
flushall();
scanf("%c",&c);
while(!((c=='1')||(c=='2')||(c=='3')))
{
printf("\nInput error! Repeat it!");
printf("\nChose the file to read:\n1.带有源代码和修改信息 2.修改记录和行标志 3.退出\n");
flushall();
scanf("%c",&c);
}
if(c=='1')
{
system("cls"); /*清屏,打印文件*/
system("type d:\\filelist1.txt");
}
if(c=='2')
{
system("cls");
system("type d:\\filelist2.txt");
}
if(c=='3')
flag=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -