释放单链表结点的内存空间

topyangdong 2011-09-28 09:23:54
#include<iostream>
#include<string>
using namespace std;


class Node //定义结点
{
private:
friend class S_list;
char *name;
int num;
Node *next;

public:
Node();
Node(char *m_name,int m_num);
Node * input_information();
~Node();
};


class S_list //定义链表
{
private:
Node node;

public:
S_list();
~S_list();
Node * creat_list();
Node * insert_node_list(Node &n,Node *hd);
Node * del_node_list(Node &n,Node *hd);
void del_list(Node *hd);
void display_list(Node *hd);
void redisplay_list(Node *hd);
};


Node::Node() //结点的默认构造函数
{
name=NULL;
num=0;
next=NULL;
}


Node::Node(char *m_name,int m_num) //结点的构造函数
{
name=new char[strlen(m_name)+1];
strcpy(name,m_name);
num=m_num;
}


Node::~Node() //结点的析构函数
{
delete [] name;
delete next;
}


Node * Node::input_information() //输入结点信息
{
Node *pre_node;
pre_node=new Node; //分配结点空间
if(!pre_node)
{
cout<<"error"<<endl;
exit(0);
}
cout<<"\n input information:\n";
cout<<" name:";
pre_node->name=new char; //分配结点内字符串信息的空间
cin.getline(pre_node->name, 10);
cout<<" num:";
int x;
cin>>x;
pre_node->num = x;
cin.get();
pre_node->next = NULL;
return(pre_node);
}


S_list::S_list():node() //链表默认构造函数
{
}
S_list::~S_list()
{
}


Node * S_list::creat_list() //创建链表
{
Node *head = NULL,*present,*last;
int n = 0;
present = node.input_information();
while(present->num != 0)
{
n++;
if(n == 1)
head=last= present;
last->next = present;
last = present;
present=present->next;
present = node.input_information();
}
return head;
}



Node * S_list::insert_node_list(Node &n,Node *hd)//插入结点
{
Node *head,*present,*before;
head=hd;
present=before=hd;
if(hd->next==NULL)
{
hd->next=&n;
n.next=NULL;
return hd;
}
while((present->next!=NULL)&&(present->num<n.num))
{

before=present;
present=present->next;
}
if((present->num>=n.num)&&(present->next!=NULL))
{
before->next=&n;
n.next=present;
return hd;

}
else
{
present->next=&n;
n.next=NULL;
return hd;
}
}


Node * S_list::del_node_list(Node &n,Node *hd) //删除结点
{
Node *present,*before;
present=before=hd;
if((hd->num==n.num)&&(strcmp(hd->name,n.name)==0))
{
hd=hd->next;
return hd;
}
while(((present->num!=n.num )||(strcmp(present->name,n.name)!=0))&&(present->next!=NULL))
{
before=present;
present=present->next;
if(((present->num==n.num)&&(strcmp(present->name,n.name)==0))&&(present->next!=NULL))
{
before->next=present->next;
delete present->name; //改怎么释放要删除结点的内存空间呢?
delete present;
return hd;
}
}
if(((present->num==n.num)&&(strcmp(present->name,n.name)==0))&&(present->next==NULL))
{
before->next=NULL;
delete present;
delete present->name;
}

return hd;
}


void S_list::del_list(Node *hd) //删除链表
{
Node *temp;
if(hd->next==NULL)
delete hd;
while(hd->next!=NULL)
{
temp=hd;
hd=hd->next;
delete [] temp->name;
delete temp;
}
delete hd;
}
void S_list::display_list(Node *hd) //输出链表
{
Node *head,*present,*before;
head=hd;
present=before=hd;
while(present->next!=NULL)
{
cout<<present->name<<" "<<present->num<<endl;
present=present->next;

}
cout<<present->name<<" "<<present->num<<endl;
}
main()
{
Node *test;
S_list list1;
test=list1.creat_list();
list1.display_list(test);
Node node1("beijing",10);
test=list1.del_node_list( node1,test);
list1.display_list(test);
Node node2("shenyang",24);
test=list1.insert_node_list(node2,test);
list1.display_list(test);
list1.del_list(test);
return 0;
}



















...全文
575 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
topyangdong 2011-09-28
  • 打赏
  • 举报
回复
删除后,运行还是不行,越界访问。debug error
  • 打赏
  • 举报
回复
delete present->name; //改怎么释放要删除结点的内存空间呢? 这句已经不需要了
delete present; //在delete的时候,会先调用Node的析构函数,而在这个析构函数里面,会自动删除name这块内存
.

ps: 结贴率就是 你问了问题之后,要结贴,点左上角 结贴那个按钮

topyangdong 2011-09-28
  • 打赏
  • 举报
回复
知道结贴怎么回事了,拜托,大虾!一定厚报!
topyangdong 2011-09-28
  • 打赏
  • 举报
回复
什么是结贴率?新手,望体谅!
  • 打赏
  • 举报
回复
看到你的结贴率,没一点回答的欲望

64,401

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧