我一直在尝试将新节点添加到配置文件的链接列表中(例如,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);
}
答案 0 :(得分: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;
}
删除和插入的实现留给读者练习。
答案 1 :(得分:1)
当然,您分配内存并将其分配给本地变量。 如果要更改指针,请使用另一个星号传递指针。 而且,顺便说一句,不要说出像朋友或新朋友那样的名字。它在C ++中的关键字, 它创造了不需要的问题。
答案 2 :(得分:1)
你应该friend *head
全球
并在
void node_add(friend* new)
{
new = (friend* )malloc(sizeof(friend));
new->next = head;
head = new;
}
答案 3 :(得分:0)
你应该使用双指针。
void node_add(friend **new) {
*new = malloc(sizeof(friend));
/* etc */
}
答案 4 :(得分:-1)
问题在于以下几行: amit.name =“amit”;
你应该是一个malloc并且做一个strcpy()