(1)含有随机指针的链表拷贝
代码暂未测试
typedef struct NODE{
int value;
NODE* next;
NODE* random;
}NODE;
NODE* ListCopy(NODE *head)
{
NODE *pHead = head;
NODE *sHead = NULL;
NODE *returnHead = NULL;
while(pHead != NULL)
{
sHead = (NODE *)malloc(sizeof(NODE));
sHead->value = pHead->value;
sHead->next = pHead->next;
sHead->random = NULL;
pHead->next = sHead;
pHead = pHead->next;
}
if(head != NULL)
returnHead = head->next;
else
returnHead = NULL;
pHead = head;
sHead = pHead->next;
while(pHead != NULL)
{
pHead->next = pHead->next->next;
sHead->next = sHead->next->next;
sHead->random = pHead->random->next;
pHead = pHead->next->next;
sHead = sHead->next->next;
}
return (returnHead);
}
注:malloc用法
1)对于内存的使用情况,在操作系统中维护了一个空闲链表,当用户调用malloc()函数申请内存空间时,操作系统从此链表中找出一块能够满足用户请求大小的空间,
将此空间一分为二,将其中一块的首地址返回给用户,另一块返还给空闲链表,同时在此空间的头部放置数据信息结构(包括数据大小,空间已分配标记等),如果
找不到足够大的内存块,操作系统将会对内存碎片进行整理,整理之后能够满足则返回分配的内存首地址,否则返回NULL;当用户调用free()函数时,系统将
地址库返还给空闲链表。
2)在此例子中,虽然是在子函数中调用的malloc()函数申请动态内存,但是子函数退出时并没有释放此块内存,所以调用函数扔能够访问到子函数申请的内存。
内存地址到调用函数。