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指向下一个节点。
答案 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;
}