Seg Fault C ++,list,list.last

时间:2013-12-10 11:58:19

标签: c++ segmentation-fault

我的代码在插入函数(分段错误)崩溃,看起来像'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;}

2 个答案:

答案 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中的变量是数组的随机索引,它似乎产生了分段错误。