堆栈推送函数使用c语言实现,使用双链表实现
我试图用C语言实现Hierholzer算法。 我已经为使用双链表实现的简单堆栈创建了一个push函数,但是指针总是移动到else条件,即使起始节点为空堆栈推送函数使用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 {
#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变量。谢谢你的帮助。