c - 在C中使用双向链表的段错误

标签 c sorting data-structures linked-list segmentation-fault

我在这里编写了一个带有 .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/

相关文章:

c - C 中的魔数(Magic Number)

c++ - 在cpp/c++中使用字符串值数据声明变量名

python - 如何按列表中的多个项目从最高到最低对列表进行排序?

c++ - 按字母顺序排列的字符串数组排序

c++ - 堆栈使用链表错误

c - 在数组 (C) 中搜索最大的开放空间?

c - `typedef` 和 `struct` 在 C 函数标准内吗?

c - 如何在 C 编译器的 ASM 输出中启用 DIV 指令

c - 求数组中两个数的最大和

c - 在创建霍夫曼树时哪个节点在增加权重时向左或向右