这里为啥段错误,段错误是啥?,怎么解决啊

问题

img


代码

#include<stdio.h>
#include<stdlib.h> 
typedef int DateType;
typedef struct Node
{
  DateType date;
  struct Node* next;
}Node,*Lk;
void Cl(Lk &L,int n){
    int i,k;
    Node *r,*s;
    L = new Node;
    r=L;
    L->next=NULL;
    for(i=1;i<=n;i++){
        s=new Node;
        scanf("%d",&k);
        s->date=k;
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
void output(Lk &L){
    Node *s;
    s=L->next;
    while(s!=NULL){
        printf("%d ",s->date);
        s=s->next;
    }
    printf("\n");
}
Node * getdate(Lk &L,int i){
    int j=0;
    Node *p;
    if(i<=0){
        return NULL;
    }
    p=L;
    while(j<i&&p->next!=NULL){
        p=p->next;
        j++;
    }
    if(j==i){
        return p;
    }
    else{
        return NULL;
    }
}
void insert(Lk &L,int n,int s){
    Node *k,*p;
    if(n==0){
       k=new Node;
       k->date=s;
       k->next=L->next;
       L->next=k;
    }
    else{
    p=getdate(L,n);
    if(p==NULL){
        return;
    }
    k=new Node;
    k->date=s;
    k->next=p->next;
    p->next=k;
  }
}
void Delete(Lk &L,int b){
    Node *p,*r;
    if(b==0){
        return;
    }
    else if(b-1==0){
       r=L->next;
       L->next=r->next;
       delete r;
    }
    p=getdate(L,b-1);
       r=p->next;
       p->next=r->next;    
       delete r;
} 
int main()
{
    int a=0,n,i,k;
    Lk L;
    scanf("%d",&n);
    Cl(L,n);
    //output(L);
    scanf("%d",&k);
    for(i=1;i<=k;i++){
        int m;
        scanf("%d",&m);
        if(m==0){
            int n,s;
            scanf("%d %d",&n,&s);
            insert(L,n,s);
            //output(L);
        }
        else if(m==1){
            int b;
            scanf("%d",&b);
            Delete(L,b);
            //output(L);
        }
  }
  output(L); 
}

结果

img

img

  1. ```

```

代码没什么问题,修改处见注释,供参考:

#include<stdio.h>
#include<stdlib.h> 
typedef int DateType;
typedef struct Node
{
    DateType date;
    struct Node* next;
}Node, * Lk;
void Cl(Lk& L, int n) {
    int i, k;
    Node* r, * s;
    L = new Node;
    r = L;
    L->next = NULL;
    for (i = 1; i <= n; i++) {
        s = new Node;
        scanf("%d", &k);
        s->date = k;
        r->next = s;
        r = s;
    }
    r->next = NULL;
}
void output(Lk& L) {
    Node* s;
    s = L->next;
    while (s != NULL) {
        printf(s == L->next ? "%d" : " %d", s->date); // 修改
        s = s->next;
    }
    //printf("\n");
}
Node* getdate(Lk& L, int i) {
    int j = 0;
    Node* p;
    if (i <= 0) {
        return NULL;
    }
    p = L;
    while (p->next != NULL && j < i) {  //while(j < i && p->next != NULL) 修改
        p = p->next;
        j++;
    }
    if (j == i) {
        return p;
    }
    else {
        return NULL;
    }
}
void insert(Lk& L, int n, int s) {
    Node* k, * p;
    if (n == 0) {
        k = new Node;
        k->date = s;
        k->next = L->next;
        L->next = k;
    }
    else {
        p = getdate(L, n);
        if (p == NULL) {
            return;
        }
        k = new Node;
        k->date = s;
        k->next = p->next;
        p->next = k;
    }
}
void Delete(Lk& L, int b) {
    Node* p, * r;
    if (b == 0) {
        return;
    }
    else if (b - 1 == 0) {
        r = L->next;
        L->next = r->next;
        delete r;
    }
    p = getdate(L, b - 1);
    r = p->next;
    p->next = r->next;
    delete r;
}
int main()
{
    int a = 0, n, i, k;
    Lk L;
    scanf("%d", &n);
    Cl(L, n);
    //output(L);
    scanf("%d", &k);
    for (i = 1; i <= k; i++) {
        int m;
        scanf("%d", &m);
        if (m == 0) {
            int n, s;
            scanf("%d %d", &n, &s);
            insert(L, n, s);
            //output(L);
        }
        else if (m == 1) {
            int b;
            scanf("%d", &b);
            Delete(L, b);
            //output(L);
        }
    }
    output(L);
}

【以下回答由 GPT 生成】

段错误是因为程序访问了不属于自己的内存空间或者对已经释放的内存空间进行操作等情况导致的。解决段错误的方法有以下几种:

  1. 检查数组越界问题:确保在访问数组元素时,索引不超出数组的范围。可以使用条件语句来判断索引是否超出范围,避免访问无效的内存空间。

  2. 检查空指针问题:当使用指针访问内存空间时,需要确保指针不是空指针。在使用指针之前,可以使用条件语句对指针进行判断,如果指针为NULL,则不进行指针操作。

  3. 检查未初始化指针问题:在使用指针之前,需要先为指针分配内存并初始化。可以使用malloc()或calloc()函数来为指针分配内存空间,然后用指针进行操作。

  4. 检查释放后继续访问问题:在释放内存空间后,需要确保不再对该内存空间进行操作。在释放指针指向的内存空间之后,将指针设置为NULL,以避免继续访问已释放的内存空间。

以下是对提供的代码进行检查,找出可能导致段错误的问题,并给出解决方案:

void Cl(Lk &L, int n) {
    int i, k;
    Node *r, *s;
    L = new Node;
    r = L;
    L->next = NULL;
    for (i = 1; i <= n; i++) {
        s = new Node;
        scanf("%d", &k);
        s->date = k;
        r->next = s;
        r = s;
    }
    r->next = NULL;
}

在函数Cl中,可能会出现段错误的情况是:在循环中,当输入的n大于实际输入的元素个数时,会导致访问未初始化的内存空间。为了解决这个问题,可以在循环中增加对n和实际输入元素个数的判断,当n超过实际输入元素个数时,结束循环。

Node *getdate(Lk &L, int i) {
    int j = 0;
    Node *p;
    if (i <= 0) {
        return NULL;
    }
    p = L;
    while (j < i && p->next != NULL) {
        p = p->next;
        j++;
    }
    if (j == i) {
        return p;
    } else {
        return NULL;
    }
}

在函数getdate中,可能会出现段错误的情况是:当输入的i超过链表中元素的个数时,则会访问未初始化的内存空间。为了解决这个问题,可以在while循环中增加对j和i的判断,当j等于i时,返回相应的节点;否则,返回NULL。

通过以上的解决方案,可以尝试解决段错误的问题。如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^