使用下面的插入函式向單鏈表插入資料時報錯,報錯提示為Thread 1: EXC_BAD_ACCESS (code=2, address=0x10000000a)報錯的地方是insert函式的 p->next = s;部分,環境為xcode,使用c語言。新手菜鳥一枚,請各位大佬賜教~
enum Status List_Insert(SqListPtr L,int pos,ElemType elem)
{
enum Status status = fail;
Ptr p,s;
p = (Ptr)malloc(sizeof(Node));
status =List_Retrieve(L,pos-1,&p);
if (status==success) {
s = (Ptr)malloc(sizeof(Node));
s->elem = elem;
s->next = p->next;
p->next = s;
status = success;
}else status = range_error;
return status;
}
鏈表的頭檔案定義為
typedef int ElemType;
typedef enum Status
{
success = 1, fail = 0, fatal = -1, range_error = -2
}Status;
typedef struct Node
{
ElemType elem;
struct Node *next;
}Node, *Ptr,**SqListPtr;
其余相關函式為
enum Status List_Init(SqListPtr L)
{
Status s = fail;
Ptr p;
if (*L==NULL)
{
p = (Ptr)malloc(sizeof(Node));
if (p == NULL) return s;
*L = p;
(*L)->next = NULL;
s = success;
}
return s;
}
enum Status List_Create(SqListPtr L,ElemType Data[],int Len)
{
enum Status s;
Ptr p;
s = List_Init(L);
if (s == success) {
for (int i = Len-1;i>=0 ;--i ) {
p = (Ptr)malloc(sizeof(Node));
if (p) {
p->elem = Data[i];
p->next = (*L)->next;
(*L)->next = p;
}
else{
s = fail;
break;
}
}
}
return s;
}
void List_Print(SqListPtr L)
{
Ptr p = *L;
while(p->next) {
p = p->next;
printf("%d\n",p->elem);
}
}
enum Status List_Retrieve(SqListPtr L,int pos,ElemType *elem)
{
enum Status s = range_error;
Ptr p = (*L)->next;
int i = 1;
while ( p && i<pos) {
i++;
p=p->next;
}
if (p&&i==pos) {
*elem = p->elem;
s = success;
}
return s;
}
int main() {
SqListPtr L = (SqListPtr)malloc(sizeof(Node));
int len = 5;
int Data[] = {1,2,3,4};
List_Create(L, Data, len);
int delepos = 3;
List_Insert(L,delepos,23);
return 0;
}
uj5u.com熱心網友回復:
List_Retrieve函式最后一個引數是什么啊,和你的insert函式不匹配啊還有另外一個同名函式吧?
你的Create函式,應該是掛反了吧,頭指標被你放到了最后
這個應該是構建的一個有頭指標的佇列,頭指標的elem元素沒有意義,后面掛接真實的鏈表。
你創建后,列印一下看看就知道了
根據前面說的,改造了兩個函式如下:
enum Status List_Retrieve(SqListPtr L,int pos, Ptr *p1)
{
enum Status s = Status::range_error;
Ptr p = (*L)->next;
int i = 1;
while ( p && i<pos) {
i++;
p=p->next;
}
if (p&&i==pos) {
s = success;
}
*p1 = p;
return s;
}
enum Status List_Insert(SqListPtr L,int pos,ElemType elem)
{
enum Status status = fail;
Ptr p,s;
// p = (Ptr)malloc(sizeof(Node));
status = List_Retrieve( L, pos-1, &p );
if (status==success) {
s = (Ptr)malloc(sizeof(Node));
s->elem = elem;
s->next = p->next;
p->next = s;
status =success;
}else status = Status::range_error;
return status;
}
int main() {
SqListPtr L = (SqListPtr)malloc(sizeof(Node));
int len = 5;
int Data[] = {1,2,3,4};
List_Create(L, Data, len);
List_Print(L);
int delepos = 3;
List_Insert(L,delepos,23);
List_Print(L);
return 0;
}
uj5u.com熱心網友回復:
這個最好一行一行除錯,很容易看出問題來;轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/123791.html
標籤:數據結構與算法
上一篇:spss
下一篇:Animate中TypeError: Error #10010: 術語尚未定義,并且無任何屬性。 at 3_fla::MainTimeline/frame181
