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

📄 tu.cpp

📁 /* 实现一个图类
💻 CPP
字号:
#include "TU.h"

//初始化图,并建立一个顶点
TU::TU(void)

{
	 
      vnum=0;
         PNODE p;PLINK l;
		p=new NODE;l=new LINK;
     	p->next=NULL;
		l->next=NULL;
		p->link=l;
	
      top=p;


}

TU::~TU(void)
{
	PLINK m,n;
			PNODE s;
			while (top!=NULL)
			{
              s=top->next;
				m=top->link;
				while (m!=NULL)
				{
					n=m->next;
					delete m;
					m=n;
				
				}
			  delete top;
			  top=s;
			  
			}
}
//得到图的顶点数
int TU::getvnum() 
{
	return vnum;
}


//寻找IP的结点,未找到返回NULL
PNODE TU::searchdd(int ip)

{   
   PNODE p;
	p=top->next;  
 
	while ((p!=NULL)&&(p->ip!=ip)) p=p->next;
	return p;
   };
//当a为0表示无向边,为1表示有向边
//建立从IP1到IP2的关系,如果IP1或IP2不存在,则建立IP1或IP2结点,如果TOP为空,并修改TOP
//如果IP1到IP2的关系存在,则新的关系将覆盖旧的关系  q表示边的权
int TU::addgx(int ip1,int ip2,int q=1,int a=0) 
{
    if ((ip1==ip2) || (q<1)) return 0;//当IP1与IP2相等或权小于1的时候退出 返回假
	PNODE p1,p2;
	PLINK l,m;
	p1=searchdd(ip1);
 
	if (p1==NULL)   //在图里找IP1,如没找到,则新建IP1结点
	{
		p1=new NODE;
		p1->ip=ip1;
		p1->next=top->next;
		
		l=new LINK;
		l->next=NULL;
		p1->link=l; //添加一个空结点
         vnum++;
		top->next=p1;
	
	}
	
	p2=searchdd(ip2); 
	if (p2==NULL) //在图里找IP2,如没找到,则新建IP2结点
	{
		p2=new NODE;
		p2->ip=ip2;
		p2->next=top->next;

		l=new LINK;
		l->next=NULL;
		p2->link=l;//添加一个空结点
         vnum++;
		top->next=p2;
	
	}
  
  l=p1->link;
  while ((l->next!=NULL)&&(l->next->node->ip!=ip2)) l=l->next; //在IP1边里找IP2,
                                                     //如果没找到,则建立IP1与IP2的关系
  if (l->next==NULL) 
  {	
	  
	l= new LINK;
	l->node=p2;
	l->q=q;
	l->next=p1->link->next;
	p1->link->next=l;
  };



  l=p2->link;
  while ((l->next!=NULL)&&(l->next->node->ip!=ip1))  l=l->next; //在IP2边找IP1,
  
  if (l->next==NULL)  
  { if (a==0)  //当在IP2边没有找到IP1,并且 需要建立无向边时候,在IP2里增加IP1
    {
    l= new LINK;
	l->node=p1;
	l->q=q;
	l->next=p2->link->next;
	p2->link->next=l;
	}
  } 
   else
   if (a==1)  //当IP2边里找到IP1,并且需要建立有向边的时候,需要在IP2边里去掉IP1的信息
   {
    m=l->next;
	l->next=l->next->next;
	delete m;
   }
   return 1;
}

//打印图
void TU::printtu() 
{
	PNODE p;
	PLINK s;

	p=top->next;

   while (p!=NULL)
   {
  printf("%d ",p->ip);
  s=p->link->next;
    while (s!=NULL)
	{  
		printf("----%d",s->node->ip);
		s=s->next;
	}
	printf("\n");
	p=p->next;

   }
}
 //查找ip1与ip2的是否相通,如果不通,则返回0
int TU::isxt(int ip1,int ip2) 
{
	PNODE p1;
	p1=searchdd(ip1);
    if ((p1==NULL) || (searchdd(ip2)==NULL)) return 0;//如果不存在IP1或IP2则返回0失败
	if (ip1==ip2) return 0;//IP1与IP2不能相等,否则返回0失败  
   PNODE p;
   p=top->next;
   while (p!=NULL) {p->bz=0;p=p->next;}
   return (blt(p1,ip2));
 }
//增加一个顶点 ,标识别为ip, 如果顶点存在则什么也不做,
void TU::adddd(int ip) 
 {
	if (searchdd(ip)==NULL)
	{
		PNODE p;PLINK l;
		p=new NODE;l=new LINK;
		p->ip=ip;p->next=top->next;top->next=p;
		l->next=NULL;
		p->link=l;
		vnum++;

	}
 }



//递归 深度优先遍历图,//从IP1出发查找IP2,找到则返回1,失败返回假
int TU::blt(PNODE ip1, int ip2)

{
	PLINK s;
   
	if (ip1->bz==0)
		if (ip1->ip!=ip2)
	     { 
			// printf("%d \n" ,ip1->ip);
		   ip1->bz=1;
		   s=ip1->link->next;
		    while (s!=NULL) 
		     if (blt(s->node,ip2))
		     return 1;
		    else s=s->next;
	      return 0;
	     }
		else 
		
		{
			//printf("%d \n" ,ip1->ip);
			return 1;
		}
	else
	return 0;


}

// 删除一个顶点,删除成功返回,并取掉关联的边,返回1,未找到则返回0
int TU::deldd(int ip)
{
	PNODE p,q;
	PLINK a,b;
	p=top;
	
	while ((p->next!=NULL)&&(p->next->ip!=ip)) p=p->next;
	if (p->next==NULL) return 0;//不存在此顶点,返回1
	q=p->next; //记录顶点
	a=q->link;
	p->next=p->next->next;//从顶点链表中去掉该顶点
   while (a!=NULL)  //删除该顶点边表
   {
	   b=a->next;
	   delete a;
	   a=b;
   }

   p=top->next;
  
   while (p!=NULL)
   {
	   a=p->link;
	   while((a->next!=NULL)&&(a->next->node!=q)) a=a->next;
	   if (a->next!=NULL)
	   {
		   b=a->next;
		   a->next=a->next->next;
		   delete b;
	   }
	   p=p->next;

   }
   delete q;
   vnum--;
	return 1;
}

// 检查是否存在IP的顶点 
int TU::isczdd(int ip)
{
   if (searchdd(ip)==NULL)
	   return 0;
   else
    return 1;
}

// 检查IP1到IP2是否有连接
int TU::iszl(int ip1,int ip2)
{
	PNODE p1;
	p1=searchdd(ip1);
    if ((p1==NULL) || (searchdd(ip2)==NULL)) return 0;//如果不存在IP1或IP2则返回0失败
	if (ip1==ip2) return 0;//IP1与IP2不能相等,否则返回0失败  
   PLINK p;
   p=p1->link->next;
   while (p!=NULL)
	   if (p->node->ip==ip2) 
		   return 1;
	   else
		   p=p->next;
  return 0;
}



// 得到IP1到IP2边的权,如果IP1或IP2不存在,或边不存在则返回0
int TU::getq(int ip1, int ip2)
{
	PNODE p1;
	p1=searchdd(ip1);
    if ((p1==NULL) || (searchdd(ip2)==NULL)) return 0;//如果不存在IP1或IP2则返回0失败
	if (ip1==ip2) return 0;//IP1与IP2不能相等,否则返回0失败  
   PLINK p;
   p=p1->link->next;
   while (p!=NULL)
	   if (p->node->ip==ip2) 
		   return p->q;
	   else
		   p=p->next;
  return 0;


	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -