Ⅰ 求问个c语言问题,删除链表节点的时候 为什么要释放被删节点,不释放也不影响呀
如果不释放的话会造成内存泄露。
比如一个业务逻辑中需要不断的增加节点,并不断的删除节点,如果不释放节点的内存空间的话,假设每个节点占内存8字节,那么这个块逻辑执行足够多次数,内存就放不下了。这就是隐患了。
(尤其处理的数据量级较大时,这个问题会比较明显)
Ⅱ C++链表节点删除方法,如何合适的释放内存
既然有ListNode,就应该有List类,将removeElements封装到List类中,由List类负责内存的分配和释放;
这样责任就清晰了。
再就是结点的分配一般都是在堆上申请,在栈上连接起来的结点当然无法删除;
如果非得需要按照这样的实现,在栈上应用list,那么只用更改结点指针就好了,不用delete,栈上的即结点在退出程序逻辑范围时自动删除了;
Ⅲ C语言中关于链表的删除
所谓链表,就是用指针将内存中动态分配的结点空间,链接起来成一个表。
所以,建表的过程即是每次为新结点分配内存;因此,释放空间的话,也要从头到尾,一个一个结点的释放,这样才能全部释放掉。
这段代码释放了整个链表空间内存;while循环的作用是从头到尾释放后续结点,如果直接free(pHead)则后面的结点将无法找到,那么造成内存空间泄露。
另外,你的while循环存在一个错误,假设释放了倒数第一个结点后,pHead指向最后一个结点,而最后一个结点的next为NULL,那么这样最后一个结点也没有释放掉,while就退出了。
while循环应该更正为:
while(pHead!=NULL)
{
pNext=pHead->next;
free(pHead);
pHead=pNext;
}
Ⅳ 单链表删除操作
// 删除节点,释放内存空间
p->next = p->next->next;
delete p->next;
******************************************
若链表为:
链表节点 | 1 | 2 | 3 |...
对应指针 | p | p->next | p->next->next|...
你想删除节点2(p->next),
但你的做法是:
p->next = p->next->next;(1的下一个由指向2改为指向3);
链表节点 | 1 | 2 | 3 |...
对应指针 | p | | p->next |...
delete p->next;(删除3)
这就错了,若要删除必须先将被删的节点2保存给临时变量,修改链表后再删除。正确的做法是:
linkList* tmp = NULL;
...
tmp = p->next;
p->next = p->next->next;
delete tmp;
另外,while (p && cnt != location - 1)这种写法虽然正确,但很不规范且危险,容易出现优先级和默认值的疏忽。
关于你补充的问题,不分析你的代码了,直接给你重写一个吧,看懂了就可以自己改了。
void Sort(linkList* L)
{
bool done_flag = FALSE;
linkList* p = L;
linkList* temp = NULL;
if (p->next == NULL)
{
return;
}
/*你的链表结构存在独立首节点,所以p可以直接做两个交换节点的父节点*/
/*若未发现乱序,说明已经排好*/
while(!done_flag)
{
done_flag = TRUE;
/*遍历链表 保证p下至少存在两个节点*/
while(p->next->next != NULL)
{
/*若顺序错误则对换*/
if (p->next->name[0] > p->next->next->name[0])
{
/*存在乱序*/
done_flag = FALSE;
/*链表:p p1 p2 p3*/
/*交换p1 p2*/
/*temp 指向 p1*/
temp = p->next;
/*p 的下一个改为 p2*/
p->next = p->next->next;
/*将 p3挂到p1后面,此时p的下一个是p2,所以p的下一个的下一个是p3,temp此时为p1*/
temp->next = p->next->next;
/*p 的下一个此时为 p2,将p2的下一个指向 temp(p1)*/
p->next->next = temp;
}
/*p后移*/
p = p->next;
}
}
}
bool你那里有问题的话,可以改为int或char。
结题吧。
Ⅳ 顺序表、链表清空和销毁
我正好在学数据结构,以下是我的理解,自以为还比较靠谱。你参考着看吧。
ClearList只是把线性表中原来存储元素的空间中存的那些元素都清除了,类似于把原线性表改成一个空的线性表,但这个线性表是确实存在的。
而Destroy是把整个线性表占的空间都释放了,这个线性表结构都不存在了,下次想做一个线性表只能重新初始化。
下面是我在老师给的课件找到的粗略算法:
顺序表的:
销毁线性表L
void DestroyList(SqList*L)
{
if (L->elem) free(L->elem); //释放线性表占据的所有存储空间
}
清空线性表L
void ClearList(SqList*L)
{
L->length=0; //将线性表的长度置为0
}
链表的:
销毁链表L
void DestoryList(LinkList *L)
{
NODE *p;
while (L->head){ //依次删除链表中的所有结点
p=L->head; L->head=L->head->next;
free(p);
}
}
清空链表L
void ClearList(LinkList *L)
{
NODE *p;
while (L->head->next){
p=L->head->next; //p指向链表中头结点后面的第一个结点
L->head->next=p->next; //删除p结点
free(p); //释放p结点占据的存储空间
}
}
具体的在C环境编程实现的话还要加工下的。
希望能给你点启发!
Ⅵ 设二叉树以二叉链表存储,删除一颗二叉树,并释放所有的结点空间的算法
typedef struct Bitnode //二叉树结点定义
{
int data;
struct Bitnode *lchild;
struct Bitnode *rchild;
}Bitnode;
Bitnode* Binary_Create() //创建二叉树
{
Bitnode *t = NULL;
int n;
scanf("%d", &n);
if (n != 0)
{
t = (Bitnode *)malloc(sizeof(Bitnode));
if (t == NULL)
printf("内存分配错误!");
else
{
t->data = n;
t->lchild = Binary_Create();
t->rchild = Binary_Create();
}
}
return t;
}
void Binary_Output(Bitnode *t) //前序遍历二叉树
{
if (t != NULL)
{
printf("%d ", t->data);
Binary_Output(t->lchild);
Binary_Output(t->rchild);
}
}
void Binary_Delete(Bitnode *t) //释放空间
{
if (t != NULL)
{
Binary_Delete(t->lchild);
Binary_Delete(t->rchild);
free(t);
}
}
void Inorder(Bitnode *t) //中序遍历
{
if ( t != NULL)
{
Inorder(t->lchild);
printf("%d ", t->data);
Inorder(t->rchild);
}
}
Ⅶ Visual C++ 中怎样调用DeleteList函数删除链表中的某一结点,并释放被删除结点所占的存储空间
=(j+m-1) % LengthList(t);
DeleteList(&t, x=GetList(t,j));
如果 DeleteList的第二个参数是删除 表的第j个节点 那么
填 (x=GetList(t,j),j) 上面填的是搜索到节点值 再删除 要求的是没有重复的节点值