链表清单分段错误

时间:2017-09-09 14:53:31

标签: c segmentation-fault singly-linked-list

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 指向下一个节点。而不是指向下一个节点,它给我分段错误(核心转储)。 请解释为什么我不能让tj指向下一个节点。

1 个答案:

答案 0 :(得分:1)

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

我已对您的alpha_check程序进行了更改,并添加了一个用于测试它的主程序。它的工作方式与您期望的一样。

#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;
}