关于大学学的数据结构链栈的问题
发布网友
发布时间:2022-04-26 14:59
我来回答
共2个回答
热心网友
时间:2022-05-04 21:17
#include<iostream>
using namespace std;
#define max 100//最大表长
typedef char datatype;//假设表中元素为char型
typedef struct{//存储结构
int last;//尾元下标
datatype data[max];//顺序表
}seqlist;
seqlist init(seqlist t){//初始化
t.last=-1;//置空表
return t;
}
void out(seqlist t){//输出
int i;cout<<'(';
for(i=0;i<=t.last;i++)
cout<<t.data[i]<<',';
if(t.last>-1)cout<<'\b';//退格到多余的逗号
cout<<')';
}//输出形式为:(a1,a2,…,an)
int len(seqlist t){//求表长
return t.last+1;
}
seqlist ins(seqlist t,int i,datatype x){//插入
int j;
if(t.last==max-1||i<1||i>t.last+2){
cout<<"\n表满或位置错!\n";exit(0);
}
for(j=++t.last;j>=i;j--)
t.data[j]=t.data[j-1];//后移数据
t.data[i-1]=x;//插入
return t;
}
seqlist del(seqlist t,int i){//删除
int j;
if(i<1||i>t.last+1){
cout<<"\n无此位置!\n"; exit(0);
}
for(j=i;j<=t.last;j++)
t.data[j-1]=t.data[j];//前移数据
t.last--;//修正尾元下标
return t;
}
datatype get(seqlist t,int i){//取元素
if(i<1||i>t.last+1){
cout<<"\n位置错!\n";exit(0);
}
return t.data[i-1];
}
int search(seqlist t,datatype x){//查找
int i;
for(i=t.last;i>=0&&t.data[i]!=x;i--);
return i+1;
}
seqlist replace(seqlist t,int i,datatype x){//替换
if(i<1||i>t.last+1){
cout<<"\n位置错!\n";exit(0);
}
t.data[i-1]=x;
return t;
}
seqlist copy(seqlist t){//复制
return t;
}
seqlist clear(seqlist t){//清空
t.last=-1;
return t;
}
void main(){//测试
seqlist t=init(t);//或seqlist t={-1}
cout<<"t=";out(t);
cout<<",\t表长="<<len(t);//或t.last+1
cout<<"\n\n用插入生成表:(a,b,c)";
t=ins(t,1,'a');t=ins(t,2,'c');t=ins(t,2,'b');
cout<<"\nt=";out(t);
cout<<",\t表长="<<len(t);
int i,n=len(t);
cout<<"\n\n表中元素依次为:\n";
for(i=1;i<=n;i++)
cout<<get(t,i)<<' ';//或t.data[i-1]
cout<<"\n\n值为a,b,c,e的元素序号为:\n";
cout<<search(t,'a')<<' '<<search(t,'b')<<' ';
cout<<search(t,'c')<<' '<<search(t,'e');
cout<<"\n\n把表t复制表s:";
seqlist s;
s=copy(t);//或s=t
cout<<"\ns=";out(s);
cout<<"\n\n把表t删空:";
t=del(t,2);t=del(t,2);t=del(t,1);
cout<<"\nt=";out(t);
cout<<"\n\n把表s替换为:(d,e,f)";
s=replace(s,1,'d');s=replace(s,2,'e');s=replace(s,3,'f');
cout<<"\ns=";out(s);
cout<<"\n\n清空表s:";
s=clear(s);//或s.last=-1
cout<<"\ns=";out(s);
cout<<endl;
}
完了 看吧。
热心网友
时间:2022-05-04 22:35
你的while循环写错了,你想借助S遍历,但是循环条件用的还是top,而top在循环内部没有修改,所以就进入死循环了,应该这么改:
while(S!=NULL) //用S
{
printf("%d,\n",S->data);
S=S->next; //S要修改
}
还有,print函数应该是不想修改链栈的吧,只是读取。所以参数就不要用a的地址了,直接用a传递就行了,保证函数体内不会意外修改a。函数参数要做相应的修改。
像这样:都不用额外借助一个S了。
void print(coffee *top)
{
top=top->next;
while(top!=NULL)
{
printf("%d,\n",top->data);
top=top->next; //top要修改
}
}
用print(a);调用就好了。
有问题Hi联系。
追问我下面是用顺序表举例的,具体问题是链栈,存储结构是类(数据元素,后继指针)附加头结点,参数传递方式是当前对象,基本操作(成员函数)
要求写出操作,逻辑结构,存储结构的函数,基本操作的函数,设计要求,源程序,和测试