链接列表分段错误 typedef结构节点{ int数据; 结构节点*链接; }钕; nd*head=NULL,*head=NULL; 无效创建_节点(int项){ nd*新,*温度; 新=(nd*)malloc(sizeof(nd)); 新建->数据=项目; 新建->链接=NULL; if(head==NULL){ 头=新的; } 否则{ 温度=水头; while(临时->链接!=NULL){ 温度=温度->链接; } 临时->链接=新建; } } 无效alpha_检查(整数大小){ int i,j,num; nd*ti,*tj; ti=tj=水头; 对于(i=1;idata); tj=tj->link; /*如果(num>=65&&numlink; } } 空心导线测量(nd*THAD){ while(thead->link!=NULL){ printf(“%d”,thead->data); thead=thead->link; } printf(“%d”,thead->data); }
因此,上述代码中唯一的问题在于函数alpha_check()中,我希望变量tj指向下一个节点。它不是指向下一个节点,而是给我分段错误(堆芯转储)。链接列表分段错误 typedef结构节点{ int数据; 结构节点*链接; }钕; nd*head=NULL,*head=NULL; 无效创建_节点(int项){ nd*新,*温度; 新=(nd*)malloc(sizeof(nd)); 新建->数据=项目; 新建->链接=NULL; if(head==NULL){ 头=新的; } 否则{ 温度=水头; while(临时->链接!=NULL){ 温度=温度->链接; } 临时->链接=新建; } } 无效alpha_检查(整数大小){ int i,j,num; nd*ti,*tj; ti=tj=水头; 对于(i=1;idata); tj=tj->link; /*如果(num>=65&&numlink; } } 空心导线测量(nd*THAD){ while(thead->link!=NULL){ printf(“%d”,thead->data); thead=thead->link; } printf(“%d”,thead->data); },c,segmentation-fault,singly-linked-list,C,Segmentation Fault,Singly Linked List,因此,上述代码中唯一的问题在于函数alpha_check()中,我希望变量tj指向下一个节点。它不是指向下一个节点,而是给我分段错误(堆芯转储)。 请解释为什么我不能让tj指向下一个节点。分段错误是向内核发出的一个信号,表明您的程序正在访问内存,它没有导致内核终止您的程序的权限。这通常意味着您超出了数组的边界,或者在您的情况下,您正在取消引用我指定的指针s指向不应该指向的内容。与其他注释中提到的内容一样,在遍历链表时,您需要使用与遍历数组时不同的约束类型。您需要在遍历时检查节点指针是否为空,而不
请解释为什么我不能让tj指向下一个节点。分段错误是向内核发出的一个信号,表明您的程序正在访问内存,它没有导致内核终止您的程序的权限。这通常意味着您超出了数组的边界,或者在您的情况下,您正在取消引用我指定的指针s指向不应该指向的内容。与其他注释中提到的内容一样,在遍历链表时,您需要使用与遍历数组时不同的约束类型。您需要在遍历时检查节点指针是否为空,而不是在for循环中执行某些固定大小的操作 我已经对您的alpha_检查程序进行了更改,并添加了一个main来测试它。它可以按照您的预期工作
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);
}
#包括
#包括
类型定义结构节点{
int数据;
结构节点*链接;
}钕;
nd*head=NULL,*head=NULL;
无效创建_节点(int项){
nd*新,*温度;
新=(nd*)malloc(sizeof(nd));
新建->数据=项目;
新建->链接=NULL;
printf(“%d%p\n”,新建->数据,新建);
if(head==NULL){
头=新的;
}
否则{
温度=水头;
while(临时->链接)
温度=温度->链接;
临时->链接=新建;
}
}
无效alpha_检查(整数大小){
int i,j,num;
nd*ti,*tj;
ti=tj=水头;
对于(i=1;i数据*10+tj->data;
tj=tj->link;
//如果(num>=65&&numlink;
}
}
空心导线测量(nd*THAD){
while(thead->link){
printf(“%d”,thead->data);
thead=thead->link;
}
printf(“%d”,thead->data);
}
内部主(空){
创建_节点(10);
创建_节点(1);
创建_节点(5);
阿尔法检查(2);
返回0;
}
用于(i=1;我看不到列表是如何创建的,也看不到如何调用alpha_check
。似乎这个size
是错误的。在列表结束之前,使用大小而不是while循环遍历列表也很奇怪。使用调试器。它会告诉您哪里出了问题以及发生了什么。您传递给函数alpha_ch的大小是多少eck?如果您创建的结构包含头指针和一些跟踪列表大小的变量,则可以使用大小为的for循环。struct list{size\u t size;nd*head;}
您还可以使用for循环而不是while循环来检查指针是否为空for(tj=head;tj;tj=tj->link)
#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;
}