建立的动态链表为什么总是删除不了头结点!、求高手指点!感激不尽!!!
#include<iostream>
#include<string>
using namespace std;
struct node
{
string str;
struct node *next;
};
int n;
bool T=0;
struct node *head;
typedef struct node NODE;
struct node *creat()//创建一个动态链表
{
struct node *p1,*p2;
n=0;
p1=p2=new node;
head=NULL;
cout<<"请输入字符:"<<endl;
cin>>p2->str;
while(p2->str!="#")
{
n=n+1;
if(n==1)
head=p1;
else p1->next=p2;
p1=p2;
p2=new node;
cout<<"请输入字符:"<<endl;
cin>>p2->str;
}
p1->next=p2;
p1=p2;
p1->next=NULL;
return head;
}
void printnode()//打印显示链表
{
struct node *p=NULL;
p=head;
cout<<"链表数据为:"<<endl;
for(int i=0;i<n;i++,p=p->next)
cout<<p->str<<" ";
}
void deletenode(NODE * &p,string b)//删除指定结点
{
NODE *head0=p;
for(int i=0;i<n;i++,p=p->next)
{ if(p->str==b)
{
head0=head0->next;
T=1;
break;
}
else if(p->next->str==b)
{
p->next=p->next->next;
T=1;
break;
}
}
if(T==0)
cout<<"链表中无字符串:"<<b<<endl;
p=head0;
}
int main()//主函数
{struct node *head;
char ch;
string str1;
cout<<"建立一个动态链表:"<<endl;
head=creat();//创建一个动态链表
printnode();//显示链表
cout<<"是否要删除一个结点y/n"<<endl;
cin>>ch;
if(ch=='y')
{
cout<<"请输入要删除的字符串:"<<endl;
cin>>str1;
deletenode(head,str1);
if(T==1)
cout<<"删除后的链表为:"<<endl;
printnode();//显示链表
}
return 0;
}
[解决办法]
printnode使用的是全局变量head,而deletenode使用的是main的局部变量head。要统一为使用同一个head。
[解决办法]
你这段代码有严重的内存泄漏问题啊。且不说能否删除,就算照你的意思成功了,你觉得指针不使用这块空间就是删除了么?用new动态分配的指针,必须有delete,才算删除,否则指针丢失,就无法处理这块内存了。
[解决办法]
struct node *head;//这是全局的head
……
int main()//主函数
{
struct node *head;//但这里又定义了一个head,print用的是全局的当然有问题咯
char ch;
string str1;
cout<<"建立一个动态链表:"<<endl;
head=creat();//创建一个动态链表
printnode();//显示链表
cout<<"是否要删除一个结点y/n"<<endl;
cin>>ch;
if(ch=='y')
{
cout<<"请输入要删除的字符串:"<<endl;
cin>>str1;
deletenode(head,str1);
if(T==1)
cout<<"删除后的链表为:"<<endl;
printnode();//显示链表
}
return 0;
}