C - 链接列表:计数=计数>下一个给出分段错误


#include<stdio.h>
#include<malloc.h>
typedef struct nde{
    int data;
    struct nde *next;
}node,*pnode;
void inst_beg(node *,int);
void inst_end(node *,int);
void inst_any(node *,int,int);
int del_begin(node *);
int del_end(node *);
int del_any(node*,int);
void display(node *);
main()
{
    pnode head= (node *)malloc(1*sizeof(node));
    head->data=0;
    head->next=NULL;
    inst_any(head,1,1);
    inst_any(head,2,2);
//  inst_any(head,3,3);
    display(head);
}
void inst_any(node *head,int pos, int data){
    pnode nd=(node *)malloc(1*sizeof(node));
    nd->data=data;
    //pnode count=(node *)malloc(1*sizeof(node));
    pnode count;
    count=head;
    printf("head: %p",head);
    printf("count: %p",count);
    int i=0;
    while(i<pos-1){
        count=count->next; //Problem is here for inst_any(phead,2,2) 
    }
    nd->next=count->next;
    count->next=nd;
    //printf("done");   
}
void display(node * head){
    pnode count=head;
    while(count->next!=NULL){
        printf("%d",count->data);
        count=count->next;
    }
}

计数的值在内部循环中变得无效,因此当inst_any(head,2,2)被调用时,我们将无法尊重它。并与GDB核对,首次计数成功地指向了头。第二次也发生了同样的事情。计数后=头部将第二次给出正确的值。不知道那之后发生了什么。为什么当它进入循环计数的值时,为什么会变为零。

查看此代码:

while(i<pos-1){
    count=count->next; //Problem is here for inst_any(phead,2,2) 
}

那是整个循环。因此,要么您的状况i<pos-1立即为false ....或者是TRUE, artes true,因为您从未在循环中修改ipos

在后一种情况下,您会走一个链接的列表。最终,您会发现末端(count->nextNULL),并且仍将此NULL分配给count。在下一个迭代中,您尝试将NULL解释至访问->next。试图解除NULL未定义的行为,分段故障是典型的结果。

go并重新考虑您的程序(例如,检查count->next是否仍然不是在您的循环条件下NULL)。

我已使用下面的评论更正了您的代码。请在其他代码中阅读我的评论,您无法意识到自己的错误。希望这对您有帮助。

typedef struct nde{
    int data;
    struct nde *next;
}node,*pnode;
void inst_beg(node *,int);
void inst_end(node *,int);
void inst_any(node *,int,int);
int del_begin(node *);
int del_end(node *);
int del_any(node*,int);
void display(node *);

void main()
{
    pnode head= (node *)malloc(sizeof(node)); //No need to multiply by one
    head->data=0;
    head->next=NULL;
    inst_any(head,1,1);
    inst_any(head,2,2);
    inst_any(head,3,3);
    display(head);
    inst_any(head,4,4); //I am adding this statement so that you can better understand where it going to be inserted
    display(head);
    inst_any(head,7,7);
}
void inst_any(node *head,int pos, int data){
    pnode nd=(node *)malloc(sizeof(node));
    nd->data=data;
    //pnode count=(node *)malloc(1*sizeof(node));
    pnode count;
    count=head;
    printf("head: %pn",head);
    printf("count: %pn",count);
    int i=0;
    while(i < (pos-1)){
        if(count == NULL){
         printf("No position available for request pos =%dn", pos);
         return;//This condition is important. If your position is not exist in the list and count reached the end of the list just return with a error message
       }
        count=count->next; //Problem is here for inst_any(phead,2,2)
        i++;//you must increment i
    }
    nd->next=count->next;
    count->next=nd;//Here count must not be null, else it will create Segmentation fault. Therefore inside from while loop above we have checked whether it is null or not. If null return from this method. 
    //printf("donen");
}
void display(node * head){
    pnode count=head;
    while(count!=NULL){//You have to correct it to print last node of the list
        printf("%dn",count->data);
        count=count->next;
    }
}

函数的已发布代码:inst_any()初始化data字段,但未能初始化next字段。

建议:

nd->data=data;
nd->next = NULL;

然后这个循环:

while(i<pos-1){
    count=count->next; //Problem is here for inst_any(phead,2,2)
}

无法更新计数器i,因此循环永远不会退出。另外,当链接列表不包含足够的条目时,此循环将在列表的末端立即运行。因此,循环还需要检查count->next不是null。

相关内容

  • 没有找到相关文章

最新更新