⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shixian.h

📁 用C++编的
💻 H
📖 第 1 页 / 共 2 页
字号:
输入: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 + -