昨晚我在C代码中发现了一些奇怪的行为。 我有一些用于创建和操作C链接列表的基本函数。 我插入第n个位置的行为虽然很奇怪。
第一个版本工作正常,但第二个版本根本不会插入到列表中。我错过了什么吗?
//This works fine
void insert_nth(struct node** head, int data, int n_pos){
if (n_pos == 0){
insert_top(head, data);
return;
}
struct node* current = *head;
for(int i = 0; i < n_pos - 1 ; i++){
if(current == NULL) return;
else current = current->next;
}
if(current == NULL) return;
insert_top(&(current->next), data);
}
//This doesn't insert at all
void insert_nth(struct node** head, int data, int n_pos){
if (n_pos == 0){
insert_top(head, data);
return;
}
struct node* current = *head;
for(int i = 0; i < n_pos ; i++){
if(current == NULL) return;
else current = current->next;
}
if(current == NULL) return;
insert_top(&(current), data);
}
以下是我用作参考的其他功能。
int main(){
struct node* head = NULL;
build_rand_list(&head);
list_print(&head);
return 0;
}
void list_print(struct node** head){
printf("List size is %d: List: ", list_length(head));
for(struct node* current = *head; current!= NULL; current = current->next)
printf("%d ", current->data);
printf("\n");
}
void build_rand_list(struct node** head){
//Assume head is NULL
assert(*head == NULL);
srand(time(NULL));
for (int i = 0; i < 10; i++){
int random_num = rand() % 11;
insert_end(head, random_num);
}
}
void insert_top(struct node** head, int data){
struct node *new_node = (struct node *)malloc(sizeof(struct node));
new_node->data = data;
new_node->next = *head;
*head = new_node;
}
答案 0 :(得分:1)
&(current)
是局部变量的地址
&(current->next)
是列表中节点内指针的地址。
修改current
最终所做的局部变量insert_top
对列表的节点没有影响。
答案 1 :(得分:0)
例如,如果将值为2的节点传递给insert_top
函数,结果将是这样的
好像你没有正确处理指针。例如,没有指向您创建的新节点的节点。
更好的实施方式是
void insert_nth(struct node *head, int data, int npos) {
struct node *current = head;
for (int i = 0; i < npos - 1; i++) {
current = current->next;
if (current == null) {
printf("%s\n", "Insert failed");
return;
}
}
struct node *new_node = (struct node *)malloc(sizeof(struct node *));
new_node->data = data;
new_node->next = current->next;
current->next = new_node;
return;
}
head
参数是列表的实际头部。
结果将使我更满意。希望这会有所帮助。