我一直试图让一个程序工作,编译器不会向我显示警告和错误,只是显示我RUN FINISHED Segmentation fault core dumped,我猜它与值的赋值有关指针,但我没有找到错误,你能帮帮我吗?
结构人
#ifndef PERSONSTRUCT_H
#define PERSONSTRUCT_H
#define TRUE 1
#define FALSE 0
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
int edad;
char nombre[100];
}persona;
persona *getNodoPerson();
void setEdad(int, persona *);
void setNombre(char *, persona *);
#ifdef __cplusplus
}
#endif
#endif
struct nodo
#define TRUE 1
#define FALSE 0
#ifndef LISTASIMPLEMENLAZADA_H
#define LISTASIMPLEMENLAZADA_H
#include "PersonStruct.h"
#ifdef __cplusplus
extern "C" {
#endif
struct nodo{
struct nodo *siguiente;
persona *person;
};
typedef struct nodo *ptrNodo;
typedef struct nodo *lista;
void freeNode(ptrNodo);
ptrNodo getNodo();
int empty(lista);
ptrNodo buscar(char[],int, lista);
int contar(lista);
void addAtEnd(char *, int, lista);
void del(lista,char *,int);
void imprimirDatos(lista);
int getPos(lista, persona *);
lista getLista();
#ifdef __cplusplus
}
#endif
#endif
struct nodo的函数
#include "ListaSimplemEnlazada.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//Esta funcion elimina de memoria el nodo enviado
void freeNode(ptrNodo p)
{
free(p);
}
//Esta funcion crea el espacio de memoria para un nodo
ptrNodo getNodo()
{
ptrNodo p;
p=(ptrNodo)malloc(sizeof(struct nodo));
return p;
}
lista getLista()
{
lista l;
l=(lista)malloc(sizeof(struct nodo));
l->person=NULL;
return l;
}
//Esta funcion revisa si una lista esta vacia;
int empty(lista l)
{
int x;
if(l->siguiente==NULL)
{
x=TRUE;
}
else
{
x=FALSE;
}
return x;
}
//Esta funcion cuenta el numero de elementos que tiene una lista enlazada
int contar(lista l)
{
int cont=0;
ptrNodo aux=getNodo();
aux=l->siguiente;
while(aux!=NULL)
{
aux=aux->siguiente;
cont++;
}
return cont;
}
//Esta funcion busca en la lista especificada, el nodo en el que se encuentra la estructura se encuentra especificada
//si la estructura es encontrada, devuelve un puntero al nodo donde esta la estructura
//si no devuelve un puntero nulo
ptrNodo buscar(char *nom,int age, lista l)
{
ptrNodo aux=getNodo(),retorno=getNodo();
retorno=NULL;
if(!empty(l))
{
aux=l->siguiente;
while(aux!=NULL)
{
if ((aux->person->edad==age) && (strcmp(aux->person->nombre,nom)==0))
{
retorno=aux;
break;
}
aux=aux->siguiente;
}
}
return retorno;
}
//Ingresa un nodo al final de la lista, si la lista es vacia, lo ingresa como el primer elemento de la lista
void addAtEnd(char *nombre,int age,lista l)
{
ptrNodo aux1=getNodo(),aux2=getNodo();
aux2->person->edad=age;
strcpy(aux2->person->nombre,nombre);
aux2->siguiente=NULL;
if(!empty(l))
{
aux1=buscar(nombre,age,l);
if(aux1==NULL)
{
aux1=l->siguiente;
while(aux1!=NULL)
{
aux1=aux1->siguiente;
}
aux1->siguiente=aux2;
}
else
{
printf("El valor ya se encuentra en la lista");
}
}
else
{
l->siguiente=aux2;
}
}
//Envia la posicion numerica del nodo en la lista, retornara 0 si no encuentra el nodo
int getPos(lista l, persona *p)
{
ptrNodo aux=getNodo();
int x=0;
if(!empty(l))
{
aux=buscar(p->nombre,p->edad,l);
if(aux!=NULL)
{
aux=l->siguiente;
while(aux->person->edad==p->edad && (strcmp(aux->person->nombre,p->nombre)==0))
{
x++;
aux=aux->siguiente;
}
}
}
return x;
}
//Este metodo elimina el valor de lista
void del(lista l,char *nom,int age)
{
ptrNodo aux1=getNodo(),aux2=getNodo();
int x,i;
if(!empty(l))
{
aux1=buscar(nom,age,l);
if(aux1!=NULL)
{
x=getPos(l,aux1->person);
aux2=l->siguiente;
for(i=1;i<=(x-1);i++)
{
aux2=aux2->siguiente;
}
aux2->siguiente=aux1->siguiente;
printf("\nLa persona %s y edad %d",aux1->person->nombre,aux1->person->edad);
freeNode(aux1);
}
}
}
void imprimirDatos(lista l)
{
ptrNodo aux=getNodo();
int i=1;
if(!empty(l))
{
aux=l->siguiente;
while(aux!=NULL)
{
printf("\nLa persona numero %d con \tNombre:%s y edad:%d",i,aux->person->nombre,aux->person->edad);
i++;
}
}
}
主
#include <stdio.h>
#include <stdlib.h>
#include "ListaSimplemEnlazada.h"
#include "PersonStruct.h"
/*
*
*/
int main(int argc, char** argv) {
argc=argc;
argv=argv;
char *nombres[5]={"Alberto", "Manuel","Enrique","Josue","Ronald"};
int edad[5]={25,39,45,12,21};
int i;
lista l=getLista();
for (i=0;i<=4;i++)
{
addAtEnd(nombres[i],edad[i],l);
}
imprimirDatos(l);
del(l,nombres[0],edad[0]);
imprimirDatos(l
);
return (EXIT_SUCCESS);
}
对不起大量的代码,但也许你需要它来理解我的程序错误
答案 0 :(得分:0)
目前,您的功能getNodo
只是malloc
的前端。它返回了一个新的但未初始化的节点,其成员可能包含垃圾。在aux2->person
中取消引用attAtEnd
时:
aux2->person->edad=age;
你会遇到分段错误。您不仅必须分配,还要填充您的节点,即用合理的数据填充它。 (该数据也可能意味着aux2->person == NULL
,但如果该数据有效,则应在取消引用指针之前进行检查。)
除了西班牙语和英语的奇怪组合之外,您的功能名称不明确:get
表示您正在尝试访问现有内存。您的函数可能应该被命名为newNode
或crearNodo
。