我在我的代码中得到一个分段错误,它在单链表中插入数据,然后打印相同的。我完全不知道它是从哪里来的。这是我的代码。欢迎提出任何建议或建议。谢谢。
#include<stdio.h>
#include<stdlib.h>
void insert_data(int data);
void print_list();
typedef struct node{
int info;
struct node* next;
}mynode;
mynode *head=NULL,*tail=NULL,*ptr = NULL;
int main()
{
int nodes,i;
int data;
printf("how many nodes u want to insert");
scanf("%d",&nodes);
for(i=0;i<nodes;i++)
{
printf("Enter data");
scanf("%d",&data);
insert_data(data);
}
print_list();
return 0;
}
void insert_data(int data)
{
ptr = (mynode *)malloc(sizeof(mynode));
(*ptr).info = data;
if(head == NULL)
{
(*ptr).next = NULL;
head = ptr;
tail = ptr;
}
else
{
printf("inside else");
(*ptr).next=NULL;
(*tail).next = ptr;
tail = ptr;
}
return;
}
void print_list()
{
ptr = head;
while((*ptr).next != NULL)
{
printf("%d",(*ptr).info);
ptr = (*ptr).next;
}
printf("%d",(*ptr).info);
}
if(head=NULL)
应为if(head==NULL)
此外,通常不鼓励使用过多的全局变量。可以在每个函数中将ptr
声明为一个局部变量。这样做可以防止函数之间奇怪的交互。
例如:
void print_list()
{
mynode* ptr2 = head; // ptr2 is local : it only exist in this function.
while((*ptr2).next != NULL)
{
printf("%d",(*ptr2).info);
ptr2 = (*ptr2).next;
}
printf("%d",(*ptr2).info);
}
如果列表为空,则上述函数失败:在head
上添加测试可能是一件好事!
最后,该函数可以修改为处理任何列表mynode*
,而不仅仅是head
:
void print_list(mynode* somelisthead)
{
if(somelisthead==NULL){printf("empty listn");return;}
mynode* ptr2 = somelisthead; // ptr2 is local : it only exist in this function.
while((*ptr2).next != NULL)
{
printf("%d ",(*ptr2).info);
ptr2 = (*ptr2).next;
}
printf("%d",(*ptr2).info);
}
现在在main中被称为print_list(head);
你发布的代码调用malloc()
:这为每个节点分配内存。我猜用free()
写一个函数来释放内存是下面的步骤!
下面的代码是否仍然显示分段错误?
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int info;
struct node* next;
}mynode;
void print_list(mynode* somelisthead);
// why ** ? because head and tail are modified by the function. Therefore, passing by argument is required, and a pointer to head named phead is provided to the function.
void insert_data(int data, mynode** phead,mynode** ptail);
mynode *head=NULL,*tail=NULL;
int main()
{
int nodes,i;
int data;
printf("how many nodes u want to insert ?n");
scanf("%d",&nodes);
for(i=0;i<nodes;i++)
{
printf("Enter datan");
scanf("%d",&data);
insert_data(data,&head,&tail);
}
print_list(head);
return 0;
}
void insert_data(int data, mynode **phead,mynode ** ptail)
{
mynode* ptr = malloc(sizeof(mynode));
if(ptr==NULL){printf("malloc failedn");exit(1);}
ptr->info = data; // ptr-> is equivalent to (*ptr).
if((*phead) == NULL)
{
ptr->next = NULL;
*phead = ptr;
*ptail = ptr;
}
else
{
printf("inside elsen");
ptr->next=NULL;
(*ptail)->next = ptr;
*ptail = ptr;
}
return;
}
void print_list(mynode* somelisthead)
{
if(somelisthead==NULL){printf("empty listn");return;}
mynode* ptr = somelisthead; // ptr is local : it only exist in this function.
while(ptr->next != NULL)
{
printf("%d ",ptr->info);
ptr = ptr->next;
}
printf("%dn",ptr->info);
}
我没有检查scanf()
的返回值
在ubuntu gcc上运行代码不会出现分段错误。所以你的代码是正确的。
你的代码的I/O
how many nodes u want to insert5
Enter data2
Enter data3
inside elseEnter data5
inside elseEnter data2
inside elseEnter data1
inside else23521
你能提供一个测试用例,其中你的代码给出分割错误