0

我在这里用 .h 原型编写了一个双向链表的实现,一切都运行良好,直到我开始在终端中输入值。输入第二个值后出现分段错误,但是,如果我只使用 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;
    }
}
4

4 回答 4

5

问题是您在函数中使用局部声明来掩盖全局变量。这意味着prev函数中变量与全局变量不同prev

除此之外,您不应该将变量定义放在头文件中,因为如果头文件包含在多个文件中,它们会相互冲突。

还有另一个小错误,即在将新节点插入列表时不会增加计数器。

于 2013-02-06T04:18:04.033 回答
1

无需初始化 head ,0因为在您的情况下,您已经在头文件中全局声明了它(尽管在头文件中声明变量不是一个好习惯)。这里的问题是您正在重新定义prev节点 void linked_list_init(int data)功能。prev只需从那里删除节点,一切都会正常工作。

尖端:

->在文件中声明head, prev,current节点。.c

-> 使用NULL代替,0 甚至你可以使用(void *) 0代替简单0

于 2013-02-06T05:16:14.140 回答
0

每次调用linked_list_init 函数时,您似乎都在创建和初始化*prev 和*current。因此,在您输入第二个值后,第二个 if 循环正在使用 prev,它实际上已设置为 0。

我认为您要做的是使用 *prev、*head 和 *current 作为全局变量(因为您已在头文件中声明了它们)。只需使用extern在源文件中声明它们就可以了。

于 2013-02-06T04:24:22.447 回答
0

程序中使用的全局变量未初始化,因此容易产生垃圾值。我还建议您的节点使用以下定义

struct node {
    int d;
    node *llink; // Left Link
    node *rlink; // Right Link
};
typedef struct node* Node;
Node head = NULL; // Head node 

void linked_list_init(int data) {

    Node newnode = (Node) malloc(sizeof (Node));
    newnode->d = data;

    Node curr;

    if (head == NULL) {

        newnode->llink = NULL;
        newnode->rlink = NULL;
        head = newnode;

    } else {
        curr = head;
        while (curr->rlink) {
            curr = curr->rlink;
        }
        curr->rlink = newnode;
        newnode->rlink = NULL;
        newnode->llink = curr;       
    }
}

以上将继续向列表末尾添加元素。

您可以按如下方式轻松打印数据:

void linked_list_print() {
    Node curr;
    curr = head;
    while (curr) {
        printf("Element Data : %d", curr->d);
        curr = curr->rlink;
    }
}
于 2013-02-06T05:07:32.373 回答