我在这里编写了一个带有 .h 原型(prototype)的双向链表的实现,一切运行良好,直到我开始在终端中输入值。输入第二个值后出现段错误,但是,如果我只使用 1 个值,它会正常执行。我已经经历了好几次,但是,我找不到我的错误。你们能帮我找出为什么会出现错误吗?
这是 .h 文件:
#include <stdio.h>
typedef struct node Node;
struct node
{
int d;
Node *link;
}*head,*current,*prev;
int num_nodes;
void linked_list_init(int data);
void linked_list_sort();
void linked_list_print();
这是 .c 文件:
#include "link.h"
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main(){
int n,e,i;
printf("How many numbers do you want to sort: ");
scanf("%d",&e);
for(i=0;i<e;i++){
printf("Enter number: ");
scanf("%d",&n);
linked_list_init(n);
}
linked_list_sort();
printf("The sorted numbers are: ");
linked_list_print();
}
void linked_list_init(int data){
Node *prev=0,*next=0;
current=(Node*)malloc(sizeof(Node));
if(head==0)
{
head=current;
current->d=data;
current->link=0;
prev=current;
}
else{
current->d=data;
current->link=0;
prev->link=current;
prev=current;
}
}
void linked_list_sort(){
int i,j;
Node *prev=0,*next=0;
current=head;
prev=head;
next=head->link;
for(i=0;i<num_nodes-1;i++)
{
for(j=0;j<num_nodes-i-1;j++)
{
if(current->d>next->d)
{
current->link=next->link;
next->link=current;
if(current==head)
{
head=next;prev=next;
}
else
{
prev->link=next;prev=next;
}
if(next!=0) //check whether final node is reached
next=current->link;
}
else //move each node pointer by one position
{
prev=current;
current=next;
next=current->link;
}
}
//next iteration
current=head;
prev=head;
next=current->link;
}
}
void linked_list_print(){
current=head;
while(current!=0){
printf("%d ",current->d);
current=current->link;
}
}
最佳答案
问题是您在函数中用局部声明屏蔽了全局变量。这意味着函数中的变量 prev
与全局变量 prev
不相同。
除此之外,永远不要将变量定义放在头文件中,因为如果头文件包含在多个文件中,它们会相互冲突。
还有一个小错误,就是在向列表中插入新节点时不会增加计数器。
关于c - 在C中使用双向链表的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721423/