link 列表分段错误

link list segmentation fault

typedef struct node{
int data;
struct node *link;
}nd;

nd *head=NULL , *ahead=NULL;

void create_node(int item) {
    nd *new, *temp;
    new = (nd*)malloc(sizeof(nd));
    new->data=item;
    new->link=NULL;
    if(head==NULL) {
        head=new;
    }
    else {
        temp=head;
        while(temp->link!=NULL) {
            temp=temp->link;
        }
        temp->link=new;
    }

}

void alpha_check(int size) {
    int i,j,num;
    nd *ti , *tj;
    ti=tj=head;
    for(i=1 ; i<=size ; i++) {
        for(j=1 ; j<=size ; j++) {
            num = ((ti->data)*10)+(tj->data);
            tj=tj->link;

            /*if(num>=65 && num<=90) {
                   printf("\n->%d",num);
              }*/
        }
     //ti=ti->link;
    }
}

void traverse(nd *thead) {
    while(thead->link!=NULL) {
        printf("%d ",thead->data);
        thead=thead->link;
    }
    printf("%d ",thead->data); 
}

所以上面代码中唯一的问题在于函数 alpha_check() 我想要变量 tj指向下一个节点。它没有指向下一个节点,而是给我 Segmentation fault (core dumped)。 请解释为什么我不能让 tj 指向下一个节点。

段错误是向内核发出的信号,表明您的程序正在访问内存,但它没有权限导致内核终止您的程序。这通常意味着您超出了数组的边界,或者在您的情况下,您正在取消引用指向不应该指向的东西的指针。就像其他人在他们的评论中提到的那样,您在遍历链表时需要具有与遍历数组时不同类型的约束。您需要在检查节点指针不为 NULL 的同时进行遍历,而不是在 for 循环中执行一些固定大小。

我已经对您的 alpha_check 程序进行了更改,并添加了一个 main 用于测试它。正如您所期望的那样工作。

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data;
    struct node* link;
} nd;

nd *head=NULL , *ahead=NULL;

void create_node(int item) {
    nd* new,* temp;
    new = (nd*)malloc(sizeof(nd));
    new->data = item;
    new->link = NULL;

    printf("%d %p\n", new->data, new);

    if(head == NULL) {
        head = new;
    }
    else {
        temp = head;
        while(temp->link)
            temp = temp->link;
        temp->link = new;

    }
}

void alpha_check(int size) {
    int i,j,num;
    nd* ti ,* tj;
    ti = tj = head;

    for(i = 1 ; i <= size ; i++) {
        while(tj) {
            num = ti->data * 10 + tj->data;
            tj = tj->link;

         //if(num>=65 && num<=90)
         //{
            printf("\n->%d",num);
            printf(" %p\n", tj);
         //}
     }
     //ti=ti->link;
    }
}

void traverse(nd* thead) {
    while(thead->link) {
        printf("%d ", thead->data);
        thead = thead->link;
    }
    printf("%d ", thead->data);
}

int main(void) {
    create_node(10);
    create_node(1);
    create_node(5);

    alpha_check(2);
    return 0;
}