【请c++高手帮我看下程序】为什么会报错,定会感激不尽……

///总程序是关于链式栈的入栈,出栈,遍历栈,下面的就是:顺序输出栈中元素。template<classT>voidlinked_Stack<T>::prt_linked... ///总程序是关于链式栈的入栈,出栈,遍历栈,下面的就是:顺序输出栈中元素。
template <class T>
void linked_Stack<T>::prt_linked_Stack()
if(top==NULL)
cout<<"空栈!"<<endl;
else
{
node<T> * p=top;
cout<<p->d<<endl; //此处有误,编译通过,运行出错。
top=p->next; //此处同上一样。
delete p;
}

类模板就不说了,在运行时总会跳出这样的---->如图的错误,(编译了一下,)不知道哪里错了,还请那位大侠帮下忙。【注:还请别粘贴无用的话,我也查过了,但都不是,这个是老师留的作业】
#include <iostream>
using namespace std;
template <class T> //T为虚拟类型
struct node
{
T d;
node *next;
};
//定义带链栈类
template <class T> //模板声明,数据元素虚拟类型为T
class linked_Stack //带链栈类
{
private: //数据成员
node<T> * top; //带链栈的栈顶指针
public: //成员函数
linked_Stack(); //构造函数,建立空栈,即栈初始化
void prt_linked_Stack(); //顺序输出带链栈中的元素
int flag_linked_Stack(); //检测带链栈的状态
void ins_linked_Stack(T); //入栈
T del_linked_Stack(); //退栈
T read_linked_Stack(); //读栈顶元素
};
//带链栈初始化
template <class T>
linked_Stack<T>::linked_Stack()
{
//栈顶指针为空
top=NULL;
return;
}
//顺序输出栈中的元素
template <class T>
void linked_Stack<T>::prt_linked_Stack()
{
///////////////////////////////////////////此处是要求填的。
if(top==NULL)
{
cout<<"空栈!"<<endl;
}
else
{
while(top!=NULL)
{
cout<<top->d<<endl;
top=top->next;
}
}
}
展开
 我来答
myloneisland
2011-04-17 · TA获得超过923个赞
知道小有建树答主
回答量:215
采纳率:83%
帮助的人:88万
展开全部
好吧,这段代码在我自己的链栈模板上运行过了,没错,你把其他代码也贴上来吧
另外,这种输出方式是逆序输出,和你压栈的顺序刚好相反,并不是你想要的顺序输出,而且你这段代码只输出最后一个压栈的元素,要输出全部元素加一个while(top!=NULL)循环吧
追问
另开了一个提问,附带题目和代码,麻烦帮我看下,谢谢了……
追答
struct node
{
T d;
node *next;
node(T data=0,node*n=NULL):d(data),next(n){}//构造函数
};

templatevoid linked_Stack::ins_linked_Stack(T &data)
{
top=new node(data,top);//压栈
}

node类没有定义构造函数,由于你没给压栈代码,单靠编译器合成的默认构造函数不知道你是怎么样压栈的,试试以上代码
另:在局部作用域中,编译器提供的合成默认构造函数不会初始化内置和复合类型(包括指针和数组),而你这边struct node类中定义的是node类指针,类类型成员要通过自己类的默认构造函数来完成初始化任务
七月流光1
2011-04-17 · TA获得超过528个赞
知道小有建树答主
回答量:339
采纳率:100%
帮助的人:187万
展开全部
把p分配空间后再赋值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
释竹阳花
2011-04-17 · TA获得超过2901个赞
知道小有建树答主
回答量:837
采纳率:0%
帮助的人:814万
展开全部
凡是出现这种问题,需要检查指针的使用,绝大多是她出现了问题。
p->d 是干什么的?
另外:delete一定要与new成对使用,反则会出现悬指针,或内存泄漏,后会很严重。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户46372
2011-04-18 · TA获得超过309个赞
知道答主
回答量:275
采纳率:0%
帮助的人:0
展开全部
Button1Click(TObject *Sender)
{
Memo1->Text ="48582D4341524420202020080000000000000000000021795A3E000000000000";

int hour,min,sec,year,month,day;

int i=0;

long int cc;

/*if(Memo1->Text =="")
{
ShowMessage("Please Input A String!");
return;
} */

Memo2->Text="";
char *b=new char[64];
char *c=new char[11];
c[0]='0';
c[1]='x';
strcpy(b,Memo1->Text.c_str());
int data;

Memo2->Text=Memo2->Text+"文件名:";
for(i=0;i<8;i++)
{
//strcpy(c,"0x");
c[2]=b[i*2];
c[3]=b[i*2+1];
c[4]=0;

sscanf(c+2, "%x", &data);
Memo2->Text=Memo2->Text+IntToHex(data,2)+" ";
}

Memo2->Text=Memo2->Text+"\r\n扩展名:";
for(i=8;i<11;i++)
{
c[2]=b[i*2];
c[3]=b[i*2+1];
sscanf(c+2, "%x", &data);
Memo2->Text=Memo2->Text+IntToHex(data,2)+" ";
}

Memo2->Text=Memo2->Text+"\r\n文件属性:";
c[2]=b[22];
c[3]=b[23];
sscanf(c+2, "%x", &data);
switch( data )
{
case 0x00:Memo2->Text=Memo2->Text+"文件可以读写";break;
case 0x01:Memo2->Text=Memo2->Text+"文件只读";break;
case 0x02:Memo2->Text=Memo2->Text+"文件隐藏";break;
case 0x04:Memo2->Text=Memo2->Text+"系统";break;
case 0x08:Memo2->Text=Memo2->Text+"卷标";break;
case 0x10:Memo2->Text=Memo2->Text+"子目录";break;
case 0x20:Memo2->Text=Memo2->Text+"文件归档";break;
default:break;
}

Memo2->Text=Memo2->Text+"\r\n文件修改时间:";
c[2]=b[46];
c[3]=b[47];
c[4]=b[44];
c[5]=b[45];
c[6]=0;

sscanf(c+2, "%x", &data);
cc=data;
hour=(cc&0xf800)>>11;
min=(cc&0x07e0)>>5;
sec=cc&0x001f;
Memo2->Text =Memo2->Text+IntToStr(hour)+"时"+IntToStr(min)+"分"+IntToStr(sec)+"秒";

Memo2->Text=Memo2->Text+"\r\n文件修改日期:";
c[2]=b[50];
c[3]=b[51];
c[4]=b[48];
c[5]=b[49];
sscanf(c+2, "%x", &data);
cc=data;
year=((cc&0xfe00)>>9)+1980;
month=(cc&0x01e0)>>5;
day=cc&0x001f;
Memo2->Text =Memo2->Text+IntToStr(year)+"年"+IntToStr(month)+"月"+IntToStr(day)+"日";

Memo2->Text=Memo2->Text+"\r\n文件开始首簇号:";
c[2]=b[54];
c[3]=b[55];
c[4]=b[52];
c[5]=b[53];
sscanf(c+2, "%x", &data);
cc=data;

Memo2->Text =Memo2->Text+StrToInt(cc);

Memo2->Text=Memo2->Text+"\r\n文件总字节数:";
c[2]=b[62];
c[3]=b[63];
c[4]=b[60];
c[5]=b[61];
c[6]=b[58];
c[7]=b[59];
c[8]=b[56];
c[9]=b[57];
c[10]=0;
sscanf(c+2, "%x", &data);
cc=data;

Memo2->Text =Memo2->Text+cc+"("+cc/1000+"KB)";

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-04-20
展开全部
Button1Click(TObject *Sender)
{
Memo1->Text ="48582D4341524420202020080000000000000000000021795A3E000000000000";

int hour,min,sec,year,month,day;

int i=0;

long int cc;

/*if(Memo1->Text =="")
{
ShowMessage("Please Input A String!");
return;
} */

Memo2->Text="";
char *b=new char[64];
char *c=new char[11];
c[0]='0';
c[1]='x';
strcpy(b,Memo1->Text.c_str());
int data;

Memo2->Text=Memo2->Text+"文件名:";
for(i=0;i<8;i++)
{
//strcpy(c,"0x");
c[2]=b[i*2];
c[3]=b[i*2+1];
c[4]=0;

sscanf(c+2, "%x", &data);
Memo2->Text=Memo2->Text+IntToHex(data,2)+" ";
}

Memo2->Text=Memo2->Text+"\r\n扩展名:";
for(i=8;i<11;i++)
{
c[2]=b[i*2];
c[3]=b[i*2+1];
sscanf(c+2, "%x", &data);
Memo2->Text=Memo2->Text+IntToHex(data,2)+" ";
}

Memo2->Text=Memo2->Text+"\r\n文件属性:";
c[2]=b[22];
c[3]=b[23];
sscanf(c+2, "%x", &data);
switch( data )
{
case 0x00:Memo2->Text=Memo2->Text+"文件可以读写";break;
case 0x01:Memo2->Text=Memo2->Text+"文件只读";break;
case 0x02:Memo2->Text=Memo2->Text+"文件隐藏";break;
case 0x04:Memo2->Text=Memo2->Text+"系统";break;
case 0x08:Memo2->Text=Memo2->Text+"卷标";break;
case 0x10:Memo2->Text=Memo2->Text+"子目录";break;
case 0x20:Memo2->Text=Memo2->Text+"文件归档";break;
default:break;
}

Memo2->Text=Memo2->Text+"\r\n文件修改时间:";
c[2]=b[46];
c[3]=b[47];
c[4]=b[44];
c[5]=b[45];
c[6]=0;

sscanf(c+2, "%x", &data);
cc=data;
hour=(cc&0xf800)>>11;
min=(cc&0x07e0)>>5;
sec=cc&0x001f;
Memo2->Text =Memo2->Text+IntToStr(hour)+"时"+IntToStr(min)+"分"+IntToStr(sec)+"秒";

Memo2->Text=Memo2->Text+"\r\n文件修改日期:";
c[2]=b[50];
c[3]=b[51];
c[4]=b[48];
c[5]=b[49];
sscanf(c+2, "%x", &data);
cc=data;
year=((cc&0xfe00)>>9)+1980;
month=(cc&0x01e0)>>5;
day=cc&0x001f;
Memo2->Text =Memo2->Text+IntToStr(year)+"年"+IntToStr(month)+"月"+IntToStr(day)+"日";

Memo2->Text=Memo2->Text+"\r\n文件开始首簇号:";
c[2]=b[54];
c[3]=b[55];
c[4]=b[52];
c[5]=b[53];
sscanf(c+2, "%x", &data);
cc=data;

Memo2->Text =Memo2->Text+StrToInt(cc);

Memo2->Text=Memo2->Text+"\r\n文件总字节数:";
c[2]=b[62];
c[3]=b[63];
c[4]=b[60];
c[5]=b[61];
c[6]=b[58];
c[7]=b[59];
c[8]=b[56];
c[9]=b[57];
c[10]=0;
sscanf(c+2, "%x", &data);
cc=data;

Memo2->Text =Memo2->Text+cc+"("+cc/1000+"KB)";

}
另外,站长团上有产品团购,便宜有保证
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式