link_struct *MergeLink(link_struct *pPre,link_struct *pNext)

本文详细解析了一种链表合并算法的实现过程,通过将两个链表的数据进行整合,达到节省内存并提高效率的目的。文章重点介绍了如何处理链表中的数据复制及内存管理等问题。

link_struct *MergeLink(link_struct *pPre,link_struct *pNext)

{

if(pPre == NULL && pNext == NULL)

return NULL;

else if(pPre == NULL)

return NULL;

else if(pNext == NULL)

return NULL;

link_struct* pEnd = pPre;

link_struct* pNextBackup = pNext;


bool bIsPreEnd = true;

int nOffset = 0;

int nRecv =0;

char buf[8] = {0};

char buffer[MAX_BUFF_SIZE] = {0};

memcpy(buf,pPre->RecvBuf,8);

int pblen = *(int*)(buf+4);

while(pEnd)

{

if(pblen+sizeof(CLIENT_PACKET)-nRecv<=sizeof(pEnd->RecvBuf))

nOffset = pblen+sizeof(CLIENT_PACKET)-nRecv;

nRecv+=sizeof(pEnd->RecvBuf);

pEnd = pEnd->next;

}

nRecv = 0;

while(pNext)

{

if(bIsPreEnd)

{

memcpy((pEnd->RecvBuf)+nOffset,pNext->RecvBuf,sizeof(pNext->RecvBuf)-nOffset);                 //pPre的下半截,即pNext的上半截

bIsPreEnd = false;

memcpy(buffer,(pNext->RecvBuf)+sizeof(pNext->RecvBuf)-nOffset,nOffset);                 //buffer的半截,即pNext的半截

}

else

{

link_struct* pNew = (link_struct*)malloc(sizeof(link_struct));

if(pNew == NULL)

{

MessageBox("内存空间分配失败","提示");

ReleaseLinkMemory(pPre);

ReleaseLinkMemory(pNext);

ReleaseLinkMemory(pNew);

Return NULL;

}

memcpy(buffer+nOffset,(pNext->RecvBuf)+sizeof(pNext->RecvBuf)-nOffset,nOffset);                 //buffer的下半截,即pNext的上半截

memcpy(pNew->RecvBuf,buffer,sizeof(pNew->RecvBuf));                 //pNew半截,即pNext的半截

pEnd->next = pNew;

pEnd->pNew;

if(pNext->next!=NULL)

memcpy(buffer,(pNext->RecvBuf)+sizeof(pNext->RecvBuf)-nOffset,nOffset); //buffer的上半截,即pNext的下半截

else

{

pNew = (link_struct*)malloc(sizeof(link_struct));

if(pNew == NULL)

{

MessageBox("内存空间分配失败","提示");

ReleaseLinkMemory(pPre);

ReleaseLinkMemory(pNext);

ReleaseLinkMemory(pNew);

Return NULL;

}

memcpy(pNew->RecvBuf,(pNext->RecvBuf)+sizeof(pNext->RecvBuf)-nOffset,,sizeof(pNew->RecvBuf));          

}

pEnd->next = NULL;

}

pNext = pNext->next;

}

ReleaseLinkMemory(pNextBackup);

return pPre;

}

#include<iostream> using namespace std; namespace bite { // List的节点类 template<class T> struct ListNode { ListNode(const T& val = T()); ListNode<T>* _pPre; ListNode<T>* _pNext; T _val; }; //List的迭代器类 template<class T, class Ref, class Ptr> struct ListIterator { typedef ListNode<T>* PNode; typedef ListIterator<T, Ref, Ptr> Self; ListIterator(PNode pNode = nullptr); ListIterator(const Self& l); T& operator*(); T* operator->(); Self& operator++(); Self operator++(int); Self& operator--(); Self& operator--(int); bool operator!=(const Self& l); bool operator==(const Self& l); PNode _pNode; }; //list类 template<class T> class list { typedef ListNode<T> Node; typedef Node* PNode; public: typedef ListIterator<T, T&, T*> iterator; typedef ListIterator<T, const T&, const T&> const_iterator; public: /////////////////////////////////////////////////////////////// // List的构造 list(); list(int n, const T& value = T()); template <class Iterator> list(Iterator first, Iterator last); list(const list<T>& l); list<T>& operator=(const list<T> l); ~list(); /////////////////////////////////////////////////////////////// // List Iterator iterator begin(); iterator end(); const_iterator begin(); const_iterator end(); /////////////////////////////////////////////////////////////// // List Capacity size_t size()const; bool empty()const; //////////////////////////////////////////////////////////// // List Access T& front(); const T& front()const; T& back(); const T& back()const; //////////////////////////////////////////////////////////// // List Modify void push_back(const T& val) { insert(end(), val); } void pop_back() { erase(--end()); } void push_front(const T& val) { insert(begin(), val); } void pop_front() { erase(begin()); } // 在pos位置前插入值为val的节点 iterator insert(iterator pos, const T& val); // 删除pos位置的节点,返回该节点的下一个位置 iterator erase(iterator pos); void clear(); void swap(list<T>& l); private: void CreateHead(); PNode _pHead; }; };
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值