Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
堆栈推送函数使用c语言实现,使用双链表实现_C_Pointers_Stack_Graph Theory_Doubly Linked List - Fatal编程技术网

堆栈推送函数使用c语言实现,使用双链表实现

堆栈推送函数使用c语言实现,使用双链表实现,c,pointers,stack,graph-theory,doubly-linked-list,C,Pointers,Stack,Graph Theory,Doubly Linked List,我试图用C语言实现Hierholzer算法。 我已经为使用双链表实现的简单堆栈创建了一个push函数,但是指针总是移动到else条件,即使起始节点为空 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #include<stddef.h> typedef struct node {

我试图用C语言实现Hierholzer算法。 我已经为使用双链表实现的简单堆栈创建了一个push函数,但是指针总是移动到else条件,即使起始节点为空

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<stddef.h>

typedef struct node
{
    int source;
    int num;
    struct node *l, *r;
    int done;
}node;

void push(int source, int num, struct node *head)
{
    node *n = malloc(sizeof(node));
    n->num = num;
    n->l = NULL;
    n->done = 0;
    n->source = source;

    if (*head == NULL)
    {
        head = n;
        head -> r = NULL;
    }
    else
    {
        n -> r = head;
        head->l = n;
        head = n;
    }
}

int pop(node *head)
{
    if(head == NULL)
    {
        return -1;
    }
    else
    {
        node *temp = head;
        head = head->r;
        int num = temp->num;
        free(temp);
        return num;
    }
}

void append(node *extra, node *head)
{
    node *temp = extra;
    while(temp->r != NULL)
    {
        temp = temp->r;
    }
    temp->r = head;
    head->l = temp;
    head = extra;
}

node** read(int num)
{
    char a[2000] = "Assignment1.txt" ,c[1000];


    FILE *f = fopen(a,"r");
    printf("Got file\n");

    node *adj[num];

    int i=0;
    node *l;
    printf("l: %d\n", l);

    while(fscanf(f,"%s",c))
    {

        char *p = strtok(c, ",");
        while(p!=NULL)
        {
            push(i, atoi(p), l);
            p = strtok (NULL, ",");
        }
        adj[i++] = l;
    }
    printf("Adjacency list created\n");

    return adj;
}

node* euler(node *adj[],int n, int i)
{
    node *cpath = NULL;
    node *fin = NULL;
    node *extra;
    node *temp = adj[i];
    node *tempi;

    while(temp!=NULL)
    {
        if(temp->r->r == NULL)
        {
            tempi = temp;
        }

        if(temp->done == 0)
        {
            temp->done = 1;
            push(i, temp->num, cpath);
            extra = euler(adj, n, temp->num);
            append(extra, cpath);
        }
        else
        {
            temp = temp->r;
        }
    }

    while(tempi->l != NULL)
    {
        push(i,tempi->num, fin);
        extra = euler(adj, n, tempi->num);
        append(tempi, fin);
        tempi = tempi->l;
    }
    if(tempi != NULL)
    {
        push(i,tempi->num, fin);
        extra = euler(adj, n, tempi->num);
        append(tempi, fin);
    }

    return fin;
}

int main()
{
    int n;
    printf("Enter the number of vertices: ");
    scanf("%d", &n);
    node **adj = read(n);
    node *fin = euler(adj, n, 0);
    node *temp = fin;

    while(temp!=NULL)
    {
        printf("%d ", temp->num);
        temp = temp->r;
    }

    return 0;
}

我无法理解为什么会出现分段错误。

在读取函数中,您将返回adj。但是,它是一个局部变量。您没有使用malloc类型函数。所以,局部变量在函数返回后销毁。因此,当您尝试访问main中的adj时,您正在尝试访问一个随机位置。我想这个问题是由这个原因引起的。

在read函数中,您返回的是adj。但是,它是一个局部变量。您没有使用malloc类型函数。所以,局部变量在函数返回后销毁。因此,当您尝试访问main中的adj时,您正在尝试访问一个随机位置。我猜问题是由这个原因引起的。

该函数处理指向head节点的传递给它的指针的值的副本。因此,原始指针本身在函数中不会更改。它是在函数中更改的传递指针值的副本

您需要通过引用传递指针,而引用是通过指针间接传递给指针的

函数可以通过以下方式声明和定义

int push( struct node **head, int source, int num )
{
    node *n = malloc(sizeof(node));
    int success = n != NULL;

    if ( success )
    {
        n->source = source;
        n->num    = num;
        n->done   = 0;
        
        n->l = NULL;
        n->r = *head;
        if ( *head != NULL ) ( *head )->l = n;

        *head = n;
    }

    return success;
}

该函数处理传递给它的指向head节点的指针的值的副本。因此,原始指针本身在函数中不会更改。它是在函数中更改的传递指针值的副本

您需要通过引用传递指针,而引用是通过指针间接传递给指针的

函数可以通过以下方式声明和定义

int push( struct node **head, int source, int num )
{
    node *n = malloc(sizeof(node));
    int success = n != NULL;

    if ( success )
    {
        n->source = source;
        n->num    = num;
        n->done   = 0;
        
        n->l = NULL;
        n->r = *head;
        if ( *head != NULL ) ( *head )->l = n;

        *head = n;
    }

    return success;
}

节点*l。。。推(i,atoi(p),l)
head变量
l
未初始化,因此可能可以解释您的语句:“指针始终移动到else条件”。访问未初始化的变量是未定义的行为。我直接将l*更改为adj[I],并将其初始化为NULL。然而,在这样做时,在推送函数中,指针只进入IF部分,而不考虑其他条件。<代码>节点*L;推(i,atoi(p),l)head变量
l
未初始化,因此可能可以解释您的语句:“指针始终移动到else条件”。访问未初始化的变量是未定义的行为。我直接将l*更改为adj[I],并将其初始化为NULL。然而,在这样做时,在推函数中,指针只会进入IF部分,而不考虑其他条件。谢谢你的帮助。我已将adj更改为malloc变量。谢谢你的帮助。