2

我一直在尝试将新节点添加到配置文件的链接列表中(例如 facebook 配置文件),并且在启动时出现运行时错误。这就是我得到的:

#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);
}
4

5 回答 5

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

删除和插入的实现留给读者作为练习。

于 2012-04-27T09:55:56.063 回答
1

当然,您分配内存并将其分配给局部变量。如果要更改指针,请再传递一个星号。而且,顺便说一句,不要命名任何像朋友或新的东西。它在 C++ 中的关键字,它会产生不需要的问题。

于 2012-04-27T10:03:33.873 回答
1

你应该有friend *head全局的。

而在

void node_add(friend* new) 
{
    new = (friend* )malloc(sizeof(friend));
    new->next = head;
    head = new; 
} 
于 2012-04-27T10:20:24.997 回答
0

您应该使用双指针。

void node_add(friend **new) {
    *new = malloc(sizeof(friend));
    /* etc */
}
于 2012-04-27T10:03:54.713 回答
-1

问题出在以下行: amit.name = "amit";

你应该是一个 malloc 并做一个 strcpy()

于 2012-04-27T10:07:05.213 回答