⑴ 关于删除整个单链表的问题
其实你可以分为clear(清空内容,即不删除头结点,方便后续接着使用),以及destroy(当知道该链表不会再被使用时,包括头结点全部销毁)方法。
⑵ 单链表删除操作
// 删除节点,释放内存空间
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。
结题吧。
⑶ 如何删除链表(C语言).
把头节点拆下,把剩下的结点当两个,第一个作为第一个,剩下的作为第二个,先删除第一个,在删除第二个,直到第二个为空
⑷ C语言链表删除问题
所谓链表,就是用指针将内存中动态分配的结点空间,链接起来成一个表。
所以,建表的过程即是每次为新结点分配内存;因此,释放空间的话,也要从头到尾,一个一个结点的释放,这样才能全部释放掉。
这段代码释放了整个链表空间内存;while循环的作用是从头到尾释放后续结点,如果直接free(pHead)则后面的结点将无法找到,那么造成内存空间泄露。
另外,你的while循环存在一个错误,假设释放了倒数第一个结点后,pHead指向最后一个结点,而最后一个结点的next为NULL,那么这样最后一个结点也没有释放掉,while就退出了。
⑸ 如何删除链表
单向链表节点的一般形式:
struct
node{
int
value;
node
*next;};
每个链表节点的next成员即为指向下个节点的指针。
不管链表是单向链表还是双向链表或者其他什么形式,删除元素的思想是要知道即将被删除的元素,以及该元素的上一个节点和下一个节点。把即将被删除的元素的指针成员的值赋给其上一个节点的指针成员,再删除元素,就能完成任务。
比如要删除一个值为n的元素,我们可以如下判断:
node
*temp
=
p->next;
if
(temp->value
==
n){
p->next
=
temp->next;
delete
temp;}
else
p
=
temp;
如此加上循环就能搜索链表中符合要求的元素并删除。
⑹ 用数据结构删除一串数值中重复的值如何编程
#include "stdafx.h"#include<iostream.h>class ListNode //定义单向链表的结点结构;class LinkList;LinkList::LinkList()//初始化void LinkList::HeadCreate()//输入元素各个值 cout<<"整条链表为:"; p=head; while(p!=0) cout<<endl;//输出该链表}void LinkList::TailCreate()//输入元素各个值 head=head->next;//消除第一个空结点 cout<<"整条链表为:"; p=head; while(p!=0) cout<<endl;//输出该链表}void LinkList::InsertBefore()//查找第i个结点结束 ListNode *TempNode; TempNode=new ListNode; cout<<"插入的数值:"; cin>>TempNode->data; p=head; cout<<"插入前的链表为:"; while(p!=0) cout<<endl;//输出插入前的链表 if(a==1) //当插入的为第一个结点 else //当插入的不为第一个结点 p=head; cout<<"插入后的链表为:"; while(p!=0) cout<<endl;//输出插入后的链表}void LinkList::Delete()//查找第i个结点结束 q=head; cout<<"删除前的链表为:"; while(q!=0) cout<<endl;//输出删除前的链表 if(a==1) //当删除的为第一个结点 else //当删除的不为第一个结点 s=head; cout<<"删除后的链表为:"; while(s!=0) cout<<endl;//输出删除后的链表}void LinkList::Locate()//链表从头至尾查找 if(p==NULL) //查找成功 else //查找失败}void LinkList::ListSize()void LinkList::Reserve()void main()//switch }//while}//main 如果帮助到您,请记得采纳为满意答案哈,谢谢!祝您生活愉快! vae.la
⑺ C语言链表 删除
structLNode*delete(LNode*head)
{
LNode*node=head;
LNode**parent=&head;
doublemin,max;
printf("请输入min和max:");
scanf("%lf%lf",&min,&max);
while(node)
{
//大于min和小于max,则删除节点
if(node->data>min&&node->data<max)
{
*parent=node->next;
//如果你的LNode是malloc出来的,需要free(node);
node=*parent;
}
else
{
node=node->next;
parent=&node->next;
}
}
returnhead;
//这个逻辑不需要给你太多注释,你只需要拿一支笔,手动画一个3个节点的链表,
//然后从函数执行开始,一步一步去推怎么执行的就懂了。
//至于你的程序的错误,没帮你看
}
⑻ C语言中关于链表的删除
所谓链表,就是用指针将内存中动态分配的结点空间,链接起来成一个表。
所以,建表的过程即是每次为新结点分配内存;因此,释放空间的话,也要从头到尾,一个一个结点的释放,这样才能全部释放掉。
这段代码释放了整个链表空间内存;while循环的作用是从头到尾释放后续结点,如果直接free(pHead)则后面的结点将无法找到,那么造成内存空间泄露。
另外,你的while循环存在一个错误,假设释放了倒数第一个结点后,pHead指向最后一个结点,而最后一个结点的next为NULL,那么这样最后一个结点也没有释放掉,while就退出了。
while循环应该更正为:
while(pHead!=NULL)
{
pNext=pHead->next;
free(pHead);
pHead=pNext;
}
⑼ 怎样删除链表中的数据
如果链表表头不是设置成全局,可以用下面函数处理
//删除节点 删除值为m的节点
//*phead为表头指针
int deleteNode(LinkList *phead,int m)
{
LinkList p,q;//p为值是m的节点,q是p的前一个节点
if(*phead == NULL)//如果链表为空,做下溢处理
{
printf("单链表为空!\n");
return 0;
}
if((*phead)->data == m) //如果表头值为m,删除表头
{
p=*phead;
*phead=(*phead)->next;
free(p);//释放表头
}
else //从第二个节点查找值是m的
{
q=*phead;
p=(*phead)->next;
//注意先p !=NULL,否则因没有于m等值的节点将出现非法访问操作
while(p !=NULL && p->data!=m )
{
q=p;
p=p->next;
}
if(p!=NULL)//找到了
{
q->next=p->next;//让前一个节点指向p的后继节点
free(p);//删除节点p
}
else
{
printf("未找到值为%d的节点.\n",m);
return 0;
}
}
return 1;
}
⑽ c++如何删除链表
struct或者class A
{
其他数据的定义
public
A *next;
};
假设已经建好的链表头部指针为head,删除链表的程序如下
A *tmp;
while(head)
{
tmp=head;
head=head->next;
delete tmp;
}