C++关于删除链表节点问题

当要删除姓名为name的节点时,有下列程序;
void Delete(NODE**head,char*name)
{
NODE *p,*a;
a=p=*head;
if(NULL==p)return;
if(0==strcmp((p->data).name,name))
{
*head=p->next; delete p;
} else
{
//查找姓名为name的节点a,如果while条件不满足,要么是到链表末尾节点,
//要么是找到姓名为name的节点
while((p->next!=NULL)&&(strcmp((p->data).name,name)))
{
a=p; p=p->next;
}
if(0==strcmp((p->data).name,name))
{
a->next!=p->next; delete p;
}
}
}

我看不懂, 求详细分析此代码。 十分感谢

1.if(0==strcmp((p->data).name,name)是判断p指向的这个结点的值是否等于name,所以第一个if 语句的作用是,判断头结点的值是否就为name,如果是,将head指向p->next(即下一个结点),这样就删除了,delete p是释放结点p所指向的资源。
2.while((p->next!=NULL)&&(strcmp((p->data).name,name)))循环是寻找值(p->data)等于name的结点,直到链表结束,若没找到,则退出,表示链表中没有值为name的结点。
3.若找到,则通过(a->next!=p->next; delete p;)删除这一结点,其中,a结点的next是指向p结点的(也就是a是p 的上一个结点),这代码还错了应该是(a->next=p->next; delete p;)不是!=。通过a->next=p->next,将p的上一个结点(即a)的next域直接指向p的下一个结点(也就是p的next域),这样就跳过了p这个结点,而是让p的上一个结点直接指向p的下一个结点,这样结点p就被 删除了。delete p同样是释放资源。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-09
一个还算好懂的C代码

void Delete(NODE**head,char*name)//因为有可能要改动head,所以传指针的指针为形参
{
NODE *p,*a;
a=p=*head;
if(NULL==p)return;//判断头是否为空,是的话则直接退出函数,不为空则继续
if(0==strcmp((p->data).name,name))//判断头节点指向的那个name与name是否一样,是的话删除头结点,头结点变为了它的下一个节点
{
*head=p->next; delete p;
} else
{
while((p->next!=NULL)&&(strcmp((p->data).name,name)))//如果不为尾节点,或当前结点指向的name成员不与传进来的name成员相同,那么就直接让P变为它的下一个节点
{
a=p; p=p->next;
}
if(0==strcmp((p->data).name,name))//如果指向的name成员与传进来的形参一样,则让P指向它的下一个节点,释放内存(也就是删除了节点了,删除之后要维护链表的连接)
{
a->next!=p->next; delete p;
}
}
}

打字真难 - - 看你理解了没本回答被提问者采纳
第2个回答  2011-08-10
while语句循环里面 a=p; p=p->next;
--------------------
判断完后把已经判断的节点p复制给a,p移到下一个节点。在链表里面要删除一个节点,必须有指针指向所要删除节点的前驱。

if(0==strcmp((p->data).name,name))
{
a->next!=p->next; delete p;
}
这个应该是错的。应该是 a->next = p->next; delete p;

c++ 链表 删除各种情况节点问题。。。求教。。在线等。。。
一、结尾节点无法删除的问题,你可以想象一个只有三个节点的链表,结尾节点的ID=findid,开始时,p指向第二个节点,然后执行到第一个if时,由于p->next->ID==findid,于是执行第二个if语句,但是此时p->next->next是等于NULL的,所以删除节点的代码没被执行。二、当只有一个结点时,因为一开始定义...

C++中销毁单链表的问题
{ LNode * p = L; LNode * t; while (p) { t = p->next; delete p; \/\/这里。删除当前p节点,下一步赋值为t(即p->next) p = t; }}

用C++方法实现顺序表线性表的建立、插入、删除和逆转操作。并用主函数...
NodeType *p=Head->next;\/\/使指针p指向链表的第一个节点 while(p!=NULL){ Head->next=p->next;\/\/使头指针指向p的下一个节点 delete p;p=Head->next;\/\/使p节点指向头指针向的那个节点 } delete Head;\/\/最后将头节点也删除 cout<<"已经删除链表!"<<endl;} void LinkList::display(){ ...

求大神教我c++ 谢啦 是关于链表删除的
include<iostream> using namespace std;struct Node{ int data;Node *next;};Node * ins(Node *head, int x){ Node *p,*q,*t;t=new Node;t->data=x;t->next=0;if(head==0){ head=t;return head;} q=head;p=head->next;while(p!=0){ q=p;p=p->next;} q->next=t;ret...

用C++设计一个整型链表类list,能够实现链表结点的插入(insert)、删除...
void insert(int i,int x); void DELETE(int i); void display(); private: node *first,*last; }; void list::push_back(int val) { node *p=new node(val); if(NULL==first) { first=p; last=p; } else { last->R=p; p->L=last; last=last->R; } } void list:...

帮忙用C++编一下:以二叉链表为存储结构,在二叉树中删除以值x为根结点...
} } int main(){ char str[100],x;BTnode *b;printf("请输入二叉树的字符串:");gets(str);printf("\\n要删除的子树的根节点为:");scanf("%c",&x);create(b,str);printf("\\n删除根节点为%c的子树后的二叉树字符串为:",x);Delete(b,x);printf("\\n\\n");system("pause");...

链表中的怎么使用指针进行链表的建立、插入、删除等处理操作
删除操作需要查找是否存在要删除的数据,存在则删除,不存在不采取动作 函数原型:void DeleteNode ( Node<DataType> *head, DataType data );我们设置ptr作为遍历链表的游标,设置ptrNext指针作为ptr的下一个节点,将它里面的info与data对比;设置两个指针是为了方便我们删除节点。函数定义如下 { Node<...

...带头结点的循环链表为list,设计一个算法,删除链表中数据域值为_百度...
已知一个带头节点的循环列表为list设计一个算法,删除链表中数据域值为item的所有结点C++

【数据结构】C\/C++ 单链表的 创建、初始化、增、删、改、查、遍历等基 ...
C\/C++单链表的基本操作包括创建、初始化、增删改查和遍历等。首先,定义链表结构,包括数据域和指向下一个节点的指针。头插法建立链表函数Creat_LinkList()的工作流程是:动态分配链表节点,输入用户数据,通过循环将节点依次插入到链表头部,直到用户输入0为止。尾插法的创建函数Creat_LinkList_R()则是...

c++释放链表节点是什么意思
因为链表是动态创建,分散在内存的各个地方,通过链表指针访问的.如果不要它了,就要把它的资源释放,而不是简单的断开指针链接(那样会内存泄露).而且如果链表节点上有指向资源的指针,还要先把它释放再释放链表节点本身.释放链表节点是写一个好程序的基础.

相似回答