C++ Seg故障C++;,最后一个

C++ Seg故障C++;,最后一个,c++,segmentation-fault,C++,Segmentation Fault,我的代码在插入函数(分段错误)时崩溃,它看起来像“List.last”一样,但不是静态的。不要介意代码的其余部分。我知道解决办法一定很简单,但我还是想入非非。很长一段时间以来,我一直在编码 #include <iostream> #include <string> #include <cmath> #include <iomanip> using namespace std; typedef int elementtype, position ;

我的代码在插入函数(分段错误)时崩溃,它看起来像“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;}
#包括
#包括
#包括
#包括
使用名称空间std;
类型定义内部元素类型、位置;
常量int maxlength=10;
结构列表
{
elementtype元素[maxlength];
元素类型最后;
};
位置结束(列表l)
{ 
返回(l.last+1);
}
位置第一(列表l)
{
如果(l.last>=0)
返回(最后一次);
其他的
返回(结束(l));
}
下一个位置(位置p,列表l)
{
返回(l.元素[p+1]);
}
上一个位置(位置p,列表l)
{
返回(l.元素[p-1]);
}
位置定位(元素类型x,列表l)
{int i;
对于(i=0;i=0)和(pp;i--)
l、 元素[i+1]=l.元素[i];
l、 元素[p]=x;
返回(true);}
否则返回(假);
}
bool删除(位置p、列表和l)
{
int i;

如果(p>0 | | p在
Locate
函数中

for(i=0;i<=maxlength;i++)
允许以后在此行访问索引10

l.elements[p]=x;
当前您正在访问超出数组限制的元素。如果数组的大小为
x
,则无法访问
array[x]
,因为索引是基于零的


使用调试器可以帮助您识别这一点。

除了@Mathematicsian1975建议的更改之外,还有一个基本错误是

打印(列表)
方法


当语句
i=Next(i,l)时元素从<代码>列表中获取值。元素数组,它最初包含随机值。因此变量<代码> > <代码>是数组的随机索引,它似乎正在生成分割错误。

您将此标记为C++,但这是非常非C++的方法。正在使用is
std::cout
:)太多的缺陷…无论是在代码中还是在编码风格中…你确定它会工作吗?因为在
Insert
中注释
l.last++
会工作,而将其保留在那里,甚至在main中增加它会给我带来seg.fault。@user3086720不,我不确定-唯一能完全确定的方法是在调试器中运行它-which是您应该做的。我只强调了几个实例,其中循环变量的限制允许访问数组中的越界元素。
if((p>=0)&&(p<=maxlength))
l.elements[p]=x;