数据结构某个地方求指教,该怎么处理
数据结构某个地方求指教
求教大神一个问题,下面的程序是小弟写的一个再简单不过的小程序,有一处我有点迷糊
我的PNODE init(PNODE&);函数的功能是用来初始化一个链表,您会发现在main中我将它作为菜单的一部分,所以我就在想,需不需要free,您觉得我这样写可以么?
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
using namespace std;
typedef struct Node
{
int data;
struct Node * pNext;
}NODE, *PNODE;
PNODE init(PNODE&);
void add(PNODE);
void print(PNODE);
int main(void)
{
PNODE head = NULL;
int ch;
while(true)
{
cout<<"**********************************************************"<<endl;
cout<<"1.初始化链表\t2.添加元素\t3.显示链表\t4.退出\n请输入你的选择:";
cin>>ch;
switch(ch)
{
case 1:
head = init(head);
break;
case 2:
add(head);
break;
case 3:
print(head);
break;
case 4:
exit(-1);
break;
}
}
return 0;
}
PNODE init(PNODE &he)
{
if (NULL != he)
free(he);
PNODE head = (PNODE)malloc(sizeof(NODE));
head->pNext = NULL;
if (NULL != head)
{
return head;
}
else
{
cout<<"动态分配失败.."<<endl;
return NULL;
}
}
void add(PNODE head)
{
if (NULL == head)
{
cout<<"请先初始化链表!"<<endl;
return;
}
PNODE p, q;
p = head;
q = (PNODE)malloc(sizeof(NODE));
cout<<"请输入您要存入的数据:";
cin>>q->data;
if (0 != q->data)
{
p->pNext = q;
p = p->pNext;
}
else
{
cout<<"储存完毕..."<<endl;
p->pNext = NULL;
return;
}
while (1)
{
cout<<"请输入您要存入的数据:";
q = (PNODE)malloc(sizeof(NODE));
cin>>q->data;
if (0 != q->data)
{
p->pNext = q;
p = p->pNext;
}
else
{
cout<<"储存完毕..."<<endl;
p->pNext = NULL;
return;
}
}
}
void print(PNODE head)
{
if (NULL == head)
{
cout<<"请先初始化链表!"<<endl;
return;
}
if (NULL == head->pNext)
{
cout<<"链表中无有效数字!"<<endl;
return;
}
PNODE p = head;
while (p->pNext != NULL)
{
cout<<p->pNext->data<<endl;
p = p->pNext;
}
}
------解决方案--------------------
你那儿直接就又重新用了。。。。就不需要了又不是说不用了,你free掉要用的有可能还会有问题
------解决方案--------------------
if (NULL != he)
free(he);
理解楼主意思了,这样的代码也并没有什么一定有一定没有的问题,楼主清楚即可;
但是,且注释好就行,免得有人用错
------解决方案--------------------
不需要
如果是C++的对象使用链表的话可以添加 但是最好注释清除免得错误
------解决方案--------------------
用的话如果传入的不是刚分配的反而可能出错!
为了防止出错,最好
求教大神一个问题,下面的程序是小弟写的一个再简单不过的小程序,有一处我有点迷糊
我的PNODE init(PNODE&);函数的功能是用来初始化一个链表,您会发现在main中我将它作为菜单的一部分,所以我就在想,需不需要free,您觉得我这样写可以么?
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
using namespace std;
typedef struct Node
{
int data;
struct Node * pNext;
}NODE, *PNODE;
PNODE init(PNODE&);
void add(PNODE);
void print(PNODE);
int main(void)
{
PNODE head = NULL;
int ch;
while(true)
{
cout<<"**********************************************************"<<endl;
cout<<"1.初始化链表\t2.添加元素\t3.显示链表\t4.退出\n请输入你的选择:";
cin>>ch;
switch(ch)
{
case 1:
head = init(head);
break;
case 2:
add(head);
break;
case 3:
print(head);
break;
case 4:
exit(-1);
break;
}
}
return 0;
}
PNODE init(PNODE &he)
{
if (NULL != he)
free(he);
PNODE head = (PNODE)malloc(sizeof(NODE));
head->pNext = NULL;
if (NULL != head)
{
return head;
}
else
{
cout<<"动态分配失败.."<<endl;
return NULL;
}
}
void add(PNODE head)
{
if (NULL == head)
{
cout<<"请先初始化链表!"<<endl;
return;
}
PNODE p, q;
p = head;
q = (PNODE)malloc(sizeof(NODE));
cout<<"请输入您要存入的数据:";
cin>>q->data;
if (0 != q->data)
{
p->pNext = q;
p = p->pNext;
}
else
{
cout<<"储存完毕..."<<endl;
p->pNext = NULL;
return;
}
while (1)
{
cout<<"请输入您要存入的数据:";
q = (PNODE)malloc(sizeof(NODE));
cin>>q->data;
if (0 != q->data)
{
p->pNext = q;
p = p->pNext;
}
else
{
cout<<"储存完毕..."<<endl;
p->pNext = NULL;
return;
}
}
}
void print(PNODE head)
{
if (NULL == head)
{
cout<<"请先初始化链表!"<<endl;
return;
}
if (NULL == head->pNext)
{
cout<<"链表中无有效数字!"<<endl;
return;
}
PNODE p = head;
while (p->pNext != NULL)
{
cout<<p->pNext->data<<endl;
p = p->pNext;
}
}
------解决方案--------------------
你那儿直接就又重新用了。。。。就不需要了又不是说不用了,你free掉要用的有可能还会有问题
------解决方案--------------------
if (NULL != he)
free(he);
理解楼主意思了,这样的代码也并没有什么一定有一定没有的问题,楼主清楚即可;
但是,且注释好就行,免得有人用错
------解决方案--------------------
不需要
如果是C++的对象使用链表的话可以添加 但是最好注释清除免得错误
------解决方案--------------------
用的话如果传入的不是刚分配的反而可能出错!
为了防止出错,最好
- C/C++ code
free(ptr); ptr = NULL;