-1
我一直試圖使一個程序工作,編譯器不顯示我既沒有警告也沒有錯誤,只是顯示我運行完成分割故障核心轉儲,我想這與值的指派有關,但我沒有找到錯誤,你能幫我嗎?程序不運行(正在運行完成分割故障核心轉儲)
結構人
#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
結構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
功能的結構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);
}
遺憾的代碼量很大,但也許你會需要它理解我做了什麼錯我的計劃
您是否嘗試過使用調試器,比如'gdb'? – 2014-11-24 11:51:05
另外,請提供[MCVE](http://stackoverflow.com/help/mcve) – 2014-11-24 11:51:28
爲什麼你有'argc = argc; argv = argv;'in'main'? – 2014-11-24 11:51:39