2012-04-27 8 views
2

링크 된 프로필 목록 (예 : 페이스 북 프로필)에 새 노드를 추가하려고 시도했는데 시작하는 동안 런타임 오류가 발생합니다. 이것이 내가 가진 것입니다 :링크 된 목록에 노드를 추가하려고 시도했습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdlib.h> 
typedef struct friend 
{ 
    char *name; 
    int age; 
    char gender; 
    struct friend* next; 
}friend; 
void node_add(friend* new); 
int main(int argc, char *argv[]) 
{ 
friend amit; 
friend* new; 
amit.name = "amit"; 
amit.age = 16; 
amit.gender = 'm'; 
node_add(new); 
new->name = "amit"; 
printf ("name: %s\n", new->name); 
system("PAUSE");  
return 0; 
} 
void node_add(friend* new) 
{ 
new = (friend*)malloc(sizeof(friend)); 
friend* head = new; 
new -> next = head; 
} 

나는 지금 노드 삭제 기능을 만들려고합니다. 나는 사용자가 삭제하려고 않는 노드를 찾은 다음 문제는

delete -> next = delete -> next -> next 

을 수행하여 삭제하려고 나는 목록의 첫 번째 노드 얻을 필요가있다. 여기 은 내가 쓴 것입니다 :

void node_delete(friend* delete) 
{ 
friend* temp; 
char name[256]; 
int i = 0, j =0; 
printf ("Please enter the friend's name you want to delete: \n"); 
fgets (name, 256, stdin); 
fgets (name, 256, stdin); 
while (0 == (strcmp(temp -> next -> name, delete -> next -> name))) 
{ 
     temp = friend -> next; 
} 
temp -> next = temp -> next -> next; 
free (delete); 
} 
+0

에서
? –

+0

프로그램을 실행하려고하면 런타임 오류가 발생합니다 ... 이 문제가 귀하가 싫어하면 정확한 오류를 보는 방법을 잘 모릅니다 ... –

+1

왜 당신은 노드 자체에 대한 '다음'포인터? – Christoffer

답변

1

편집 :이 코드 꽤 심각한 문제가 사실이 있기 때문에 그것은, 내 테스트는 진드기 너무 빨랐다 보이지만 미묘한

:

main()에서 실제로는 전혀 새로운 것을 가리키고 있지 않습니다. 그것은 메모리 공간으로 밖으로 왜곡 된 포인터, 때로는 작동 할 수 있습니다, 그리고 대부분의 시간, 그냥 끔찍한.

friend *new; // here's your problem; change this to: 
friend *new = malloc(sizeof(friend)); 

또한 결과는 malloc으로 변환하지 마십시오.

재 편집 :

매우 간단한 링크리스트의 구현이 보일 수 있습니다 방법 : 삭제 및 삽입

typedef struct _node node; 
struct _node { 
    void *payload; 
    node *next; 
}; 

node *create_node() { 
    node *retval = malloc(sizeof(node)); 

    retval->payload = NULL; 
    retval->next = NULL; 

    return retval; 
} 

node *add_node (node *target) { 
    if (target->next) 
    return; 

    node *next = create_node(); 
    node->next = next; 
} 

node *node_search (node *haystack, void *needle) { 
    while (haystack) { 
    if (!compare(needle, haystack->payload)) { 
     return haystack; 
    } else { 
     haystack = haystack->next; 
    } 
    } 

    return NULL; 
} 

구현이 독자에게 연습으로 남아 있습니다.

+0

나는 그것을 제거했다, 그것은 도움이되지 않았다 .... –

+0

@AmitSegal : 그러면 당신은 당신이 얻고있는 정확한 오류를 게시 할 필요가있다. –

+0

어떻게 할 수 있습니까 ..? –

1

물론 메모리를 할당하고 로컬 변수에 할당합니다. 포인터를 변경하려면 포인터를 하나 더 많은 별표와 함께 전달하십시오. 그리고 그런데 친구 나 새와 같은 이름을 지어서는 안됩니다. 그것의 키워드는 C++, 이고 그것은 문제를 만들 필요가 없습니다.

0

이중 포인터를 사용해야합니다.

void node_add(friend **new) { 
    *new = malloc(sizeof(friend)); 
    /* etc */ 
} 
+0

노드가 new에 추가되고 참조로 반환되지 않기 때문에 이는 필수 사항은 아닙니다. –

+0

이 코드를 사용할 때 더 이상 SEGFAULT가 없습니다 ... – md5

+0

아, 당신은 무엇을 압니까? 그는 * 그것을 참조로 반환하고 있습니다. 나는 그것이 의도적이라고 생각하지 않는다, tho '. –

-1

문제는 다음 라인에 = "미트" amit.name;

당신은 malloc을하고 당신은 friend *head이 글로벌해야

+0

아니, 그 줄 괜찮 았어. –

+0

@Adarsh ​​: 아니오, 그렇습니다. – md5

1

의 strcpy()를 수행한다.
그리고 정확한 오류의 무엇

void node_add(friend* new) 
{ 
    new = (friend*)malloc(sizeof(friend)); 
    new->next = head; 
    head = new; 
} 
관련 문제