// 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