使用c的堆栈推送功能,使用双向链表实现

亚历克斯·阿布罗伊

我正在尝试使用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;
}

我尚未调试整个代码,但是我被卡在read()函数中,其中输入是Assignment1.txt,其中包括:

2,3
3,1
1,2

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

来自莫斯科的弗拉德

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

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

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

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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用链表实现堆栈损坏

来自分类Dev

在C中实现双向链表

来自分类Dev

使用c struct实现链表

来自分类Dev

使用链表创建堆栈

来自分类Dev

C ++如何实现双向链表的迭代器

来自分类Dev

如何使用C将值插入双向链表

来自分类Dev

Java - 双向链表实现

来自分类Dev

使用堆栈和列表ADT的推送方法实现

来自分类Dev

如何使用函数重载实现双向映射功能?

来自分类Dev

使用链表的队列实现:C#

来自分类Dev

java-如何在使用链表实现的堆栈中实现弹出操作?

来自分类Dev

我在双向链表上使用此打印功能时遇到问题

来自分类Dev

使用双向链表的Queue中的Remove()函数

来自分类Dev

python中使用Del的双向链表

来自分类Dev

使用模板化链表的C ++堆栈-内存泄漏

来自分类Dev

堆栈实现-链表

来自分类Dev

链表的堆栈实现

来自分类Dev

为什么我要在C ++中实现自己的双向链表?

来自分类Dev

为什么这个不可变的双向链表实现会导致堆栈溢出

来自分类Dev

使用调用堆栈在C中实现堆栈数据结构?

来自分类Dev

使用数组实现堆栈

来自分类Dev

堆栈-链表的实现-字符串使用不正确

来自分类Dev

为什么我不能使用链表实现从堆栈中弹出元素?

来自分类Dev

在什么情况下我们使用链表实现堆栈

来自分类Dev

使用链表实现错误队列

来自分类Dev

您将使用什么来实现两个堆栈队列?基于数组的堆栈还是链表堆栈?两个队列堆栈呢?

来自分类Dev

如何在 C 编程中使用链表将堆栈链接到其他堆栈?

来自分类Dev

如何显示使用c中的链表实现的队列元素?

来自分类Dev

在C中使用指向指针的指针的链表实现

Related 相关文章

热门标签

归档