急!一个C++问题!希望大家能帮个忙!谢谢

zcl198715 2008-03-15 10:36:24
//此程序是建立链表相关的操作
#include <iostream>
#include <string>
using namespace std;//申明结构

struct Elephant
{
string name;
Elephant* next;
};

void print_elephants( const Elephant* ptr );
Elephant* get_elephants();
void free_list( const Elephant* ptr );

int main()
{
Elephant* start;
start = get_elephants();
print_elephants( start );//由于start是指针类型,作为此函数的参数,会在此函数的作用下,start所指向的内存地址会改变,当此函数返回时,start已经为0
free_list( start ); //因此,当再调free_list(start)时,按理说应该不有任何作用了,但此函数还是被调用了!也就是说此时start还是start=get_elephants(),这是为什么啊?
return 0;
}

Elephant* get_elephants()//创建链表
{
Elephant *current,*first;
int response;
current =first=new Elephant;
cout << "\nNAME: ";
cin >> current -> name;
cout << "\nAdd another? (1 == yes, 0 == no): ";
cin >> response;
while ( response == 1 )
{
current = current -> next = new Elephant;
cout << "\nNAME: ";
cin >> current -> name;
cout << "\nAdd another? (1 == yes, 0 == no): ";
cin >> response;
}
current -> next = 0;
return first;
}


void print_elephants( const Elephant* ptr )//打印
{
int count = 1;
cout << "\n\n\n";
while ( ptr != 0 ) {
cout << "Elephant number " << count++
<< " is " << ptr -> name << '\n';
ptr = ptr -> next;
}
}

void free_list( const Elephant* ptr )//释放
{
const Elephant* temp_ptr;
while ( ptr != 0 )
{
cout<<"1111111111111111"<<endl;
temp_ptr = ptr -> next;
delete ptr;
ptr = temp_ptr;
}
}


希望高手们能帮个忙,小弟我不胜感谢!
...全文
106 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chowming 2008-03-16
  • 打赏
  • 举报
回复
传递的是值吧
HelloDan 2008-03-16
  • 打赏
  • 举报
回复
搞笑,上面的两位
zcl198715 2008-03-16
  • 打赏
  • 举报
回复
非常谢谢!
IT_lau 2008-03-16
  • 打赏
  • 举报
回复
传的是指针的一个引用,所以不回改变start的指向
tianma2005123 2008-03-16
  • 打赏
  • 举报
回复
看看高质量一文.
夜雨_倚琴 2008-03-16
  • 打赏
  • 举报
回复
不好意思!
修改start的值,应该将声明改为:
void print_elephants( const Elephant *&ptr );
夜雨_倚琴 2008-03-16
  • 打赏
  • 举报
回复
print_elephants( start );
start是指针类型没错, 但是 传递到 void print_elephants( const Elephant* ptr ) 里时候 ptr = start.
之后在print_elephants调用的时候 ptr的值 会改变, 显然 start值 不会变.

如果你想让start变化的话,可以将打印函数声明为:
void print_elephants( const Elephant& *ptr );

44看吧!
baihacker 2008-03-15
  • 打赏
  • 举报
回复
别人是问成功的原因,你自己看他的注释
ryfdizuo 2008-03-15
  • 打赏
  • 举报
回复

//编译,运行没有问题;
#include <iostream>
#include <string>
using namespace std;//申明结构

struct Elephant
{
string name;
Elephant* next;
};

void print_elephants( const Elephant* ptr );
Elephant* get_elephants();
void free_list( const Elephant* ptr );

int main()
{
Elephant* start;
start = get_elephants();
print_elephants( start );
free_list( start );

return 0;
}

Elephant* get_elephants()//创建链表
{
Elephant *current,*first;
int response;
current =first=new Elephant;
cout << "\nNAME: ";
cin >> current ->name;
cout << "\nAdd another? (1 == yes, 0 == no): ";
cin >> response;
while ( response == 1 )
{
current = current -> next = new Elephant;
cout << "\nNAME: ";
cin >> current -> name;
cout << "\nAdd another? (1 == yes, 0 == no): ";
cin >> response;
}
current -> next = 0;

return first;
}


void print_elephants( const Elephant* ptr )//打印
{
int count = 1;
cout << "\n\n\n";
while ( ptr != 0 ) {
cout << "Elephant number " << count++
<< " is " << ptr -> name << '\n';
ptr = ptr -> next;
}
}

void free_list( const Elephant* ptr )//释放
{
const Elephant* temp_ptr;
while ( ptr != 0 )
{
cout <<"1111111111111111" <<endl;
temp_ptr = ptr -> next;
delete ptr;
ptr = temp_ptr;
}
}
ryfdizuo 2008-03-15
  • 打赏
  • 举报
回复
程序没有错误啊,可以的啊。是不是编译器的问题,我是vs2005
baihacker 2008-03-15
  • 打赏
  • 举报
回复
print_elephants( start );//由于start是指针类型,作为此函数的参数,会在此函数的作用下,start所指向的内存地址会改变,当此函数返回时,start已经为0

在函数内的那个是指针的一个副本
相当于

void print_elephants( const Elephant* ptr )//打印

在进入函数的时候 定义一个指针 ptr , 值为start的值, 也就是说指向同一个地方
当 ptr指向零的时候start还是指向那里

64,186

社区成员

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

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