首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

建立的动态链表为什么总是删除不了头结点!求!感激不尽!

2013-11-29 
建立的动态链表为什么总是删除不了头结点!、求高手指点!感激不尽!!!#includeiostream#includestringusi

建立的动态链表为什么总是删除不了头结点!、求高手指点!感激不尽!!!
#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;
}

[解决办法]
哥们你写的有点乱,不过还好,找出原因了。
提点小意见,一,写的有点不规范哦。 二如上面几位说的内存泄漏问题,(你的代码在我机器上运行,把我内存都漏光了。哈哈)

你说不能删除主要问题是在这里:
 cout<<"删除后的链表为:"<<endl;
   printnode();//显示链表
printnode函数打印用到的节点头是?
而你的删除函数 struct node* deletenode(NODE *p,string b)//删除指定结点
这里我加了个返回值,本来没有返回值是void的。咱们先不说这个删除函数是否有问题,假设真的删除了,你并没有返回。。
 你的全局和局部都是head,不知道该怎么说了。
简单的说就是你输出的内容其实并没有被修改。你修改的东西和你输出的东西没有联系。ok

热点排行