// CopyComplexList.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <string.h>

struct NameItem
{
	NameItem(char * name)
	{
		strcpy(this->name,name);
		pOther=NULL;
		pNext=NULL;
	}
	NameItem(NameItem * pItem)
	{
		strcpy(this->name,pItem->name);
		pOther=NULL;
		pNext=NULL;
	}
	NameItem* InsertMeAfterSb(NameItem * pSbPrev)
	{
		this->pNext=pSbPrev->pNext;
		pSbPrev->pNext=this;
		return this;
	}
	NameItem* InsertSbAfterMe(NameItem * pSb)
	{
		pSb->pNext=this->pNext;
		this->pNext=pSb;
		return pSb;
	}
	char name[256];
	NameItem *pOther;
	NameItem *pNext;
};

void printAll(NameItem* pItems)
{
	while(pItems)
	{
		printf("%s ",pItems->name);
		pItems=pItems->pNext;
	}
	printf("\n");
}

void printOthers(NameItem* pItems)
{
	while(pItems)
	{
		if(pItems->pOther)
		{
		   printf("%s->%s ",pItems->name,pItems->pOther->name);
		}
		pItems=pItems->pNext;
	}
	printf("\n");
}

void freeAll(NameItem* pItems)
{
	NameItem* pItems0;
	while(pItems)
	{
		//printf("%s ",pItems->name);
		pItems0=pItems->pNext;
		delete pItems;
		pItems=pItems0;
	}
	//printf("\n");
}

NameItem* ezCopyItems(NameItem* pSrc)
{
	NameItem* pHead=new NameItem(pSrc);	
	pSrc=pSrc->pNext;
	NameItem* ptmpItem=pHead;
	while(pSrc)
	{
		ptmpItem=ptmpItem->InsertSbAfterMe(new NameItem(pSrc));
		pSrc=pSrc->pNext;
	}
return pHead;

}
NameItem* GetItemByName(NameItem* pItem,char *name);
NameItem* complexCopyItems(NameItem* pItemBase,NameItem* pSrc)
{
	NameItem* pResult=pItemBase;
	while(pItemBase)
	{
		if(pSrc->pOther)
		{
		   //printf("%s->%s ",pItems->name,pItems->pOther->name);
			pItemBase->pOther=GetItemByName(pResult,pSrc->pOther->name);
		}
		pItemBase=pItemBase->pNext;
		pSrc=pSrc->pNext;

	}

	return pResult;
}
NameItem* GetItemByName(NameItem* pItem,char *name)
{
	while(pItem)
	{
		if (strcmp(pItem->name,name)==0)
		{
			return pItem;
		}
		pItem=pItem->pNext;
	}
	return NULL;
}
NameItem* GetItemByIndex(NameItem* pItem,int index)
{
	if(index<0)return NULL;
	for(int i=0;i<index;i++)
	{
		 pItem=pItem->pNext;
		 if(!pItem)return NULL;
	}
	return pItem;
}

NameItem* BindItemsByIndex(NameItem* pItem,int from,int to)
{
	NameItem*  pFrom=GetItemByIndex(pItem,from);
	NameItem*  pTo=GetItemByIndex(pItem,to);
	if(pFrom && pTo)
	{
		pFrom->pOther=pTo;
		return pFrom;
	}
	else
	 return NULL;
}

int main(int argc, char* argv[])
{
	NameItem* pItemA=new NameItem("zhao");
	NameItem* pTmpItem=pItemA->InsertSbAfterMe(new NameItem("qian"));
	pTmpItem=pTmpItem->InsertSbAfterMe(new NameItem("shun"));
	pTmpItem=pTmpItem->InsertSbAfterMe(new NameItem("li"));
	printf("printAll(pItemA)=====\n");
	printAll(pItemA);
	///建立pItemA内部的复杂联系
	BindItemsByIndex(pItemA,1,3);
	BindItemsByIndex(pItemA,2,0);
	printf("printOthers(pItemA)=====\n");
	printOthers(pItemA);
	
	NameItem* pItemB=ezCopyItems(pItemA);
	printf("printAll(pItemB)=====\n");
	printAll(pItemB);

	///在pItemB的基础上,拷贝pItemA内部的复杂联系
	NameItem* pItemC=complexCopyItems(pItemB,pItemA);
	//打印pItemC内部的复杂联系
	printf("printOthers(pItemC)=====\n");
	printOthers(pItemC);
	
	printf("Hello World!\n");
	return 0;
}



printAll(pItemA)=====
 zhao qian shun li
 printOthers(pItemA)=====
 qian->li shun->zhao
 printAll(pItemB)=====
 zhao qian shun li
 printOthers(pItemC)=====
 qian->li shun->zhao
 Hello World!
 Press any key to continue