我的代码在插入函数(分段错误)崩溃,看起来像'List.last'表现为静态但不是。别介意其余的代码。我知道解决方案必须简单,但它会让我头晕目眩。我编写了很长时间的科学
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
typedef int elementtype, position ;
const int maxlength=10;
struct List
{
elementtype elements[maxlength];
elementtype last;
};
position END(List l)
{
return(l.last+1);
}
position First(List l)
{
if (l.last>=0)
return(l.last);
else
return(END(l));
}
position Next(position p,List l)
{
return(l.elements[p+1]);
}
position Previous(position p,List l)
{
return(l.elements[p-1]);
}
position Locate(elementtype x, List l)
{ int i;
for(i=0;i<=maxlength;i++)
{
if(x==l.elements[i])
return(i);
else
return(END(l));
}
}
elementtype Retrieve(position p, List l)
{
return(l.elements[p]);
}
bool Insert(int x, position p, List &l)
{
int i;
if(l.last-1==maxlength)
return(false);
else
if((p>=0)&&(p<=maxlength))
{l.last++;
for(i=l.last;i>p;i--)
l.elements[i+1]=l.elements[i];
l.elements[p]=x;
return(true);}
else return(false);
}
bool Delete(position p, List &l)
{
int i;
if(p>0||p<l.last){
l.elements[i]=l.elements[i+1];
l.last=l.last-1;
return(true);}
else
if(p=l.last){
l.last=l.last-1;
return(true);}
else
return(false);
}
void print(List l)
{
position i=First(l);
while (i!=END(l))
{
cout<< Retrieve(i,l);
i=Next(i,l);
}
cout<<("\n");
}
int main(){
List l;
l.last=-1;
Insert(100,First(l),l);
print (l);
cout<<l.elements[0];
for (int i=0; i<3;i++)
Insert(i,First(l),l);
print (l);
Insert (20,Previous(END(l),l) ,l);
print(l);
Delete( Locate(20,l),l);
print(l);
return 0;}
答案 0 :(得分:2)
此处在您的Locate
功能
for(i=0;i<=maxlength;i++)
您遇到问题,因为您允许在长度为10的数组中访问索引10.更改为
for(i=0;i<maxlength;i++)
同样在Insert
if((p>=0)&&(p<=maxlength))
允许稍后在此行访问索引10
l.elements[p]=x;
目前您正在访问超出阵列限制的元素。如果数组的大小为x
,则无法访问array[x]
,因为索引为零。
使用调试器可以帮助您识别它。
答案 1 :(得分:0)
除了@ mathematician1975建议的更改外,
中还有一个基本错误 print(List)
方法。
当语句i=Next(i,l);
执行时,它从List.elements
数组中获取一个值,该数组最初包含随机值。所以变量i
中的变量是数组的随机索引,它似乎产生了分段错误。