如何修复此排序链表插入?
How Do I Fix This Sorted Linked List Insertion?
我得到了一个处理双向链表、动态数据分配和递归的简单作业。我创建了一个只有 10 个整数的数组,我试图使用递归将这些整数放入一个排序的双向链表中。我在将节点插入链表时遇到了一些问题;我的输出是“2 7 9 100”并且由于某种原因缺少其他 6 个整数。我究竟做错了什么?感谢您的任何帮助! (使用的语言是C)
#include <stdio.h>
#include <stdlib.h>
#define N 10
typedef struct node_ {
int value;
struct node_ *next;
struct node_ *prev;
} node;
void insert(node **head, node *cur, node *p);
void print_list(node *cur);
void print_list(node *cur)
{
if (!cur) {
printf("\n");
return;
} else {
printf("%d ", cur->value);
print_list(cur->next);
}
}
int main(int argc, char *argv[])
{
int i;
int data[N] = {2, 7, 3, 9, 4, 4, 0, 8, 7, 100};
node *p, *head;
head = NULL;
for (i = 0; i < N; i++) {
p = (node *)malloc(sizeof(node));
p->value = data[i];
insert(&head, head, p);
}
print_list(head);
}
void insert(node **head, node *cur, node *p)
{
if(*head == NULL)
{
p->next = p->prev = NULL;
*head = p;
return;
}
if(p->value < cur->value)
{
p->prev = cur->prev;
p->next = cur;
cur->prev = p;
if(cur->prev != NULL)
cur->prev->next = p;
else
*head = p;
return;
}
if(cur->next == NULL)
{
cur->next = p;
p->next = NULL;
p->prev = cur;
}
else
insert(head, cur->next, p);
}
我认为问题出在这里:
cur->prev = p;
if(cur->prev != NULL)
如果您已经失去了 cur->prev
的价值,那 if 永远不会是假的。
您需要将cur->prev
保存到一个临时变量中并在if语句中使用它,或者在if语句之后进行赋值。
我得到了一个处理双向链表、动态数据分配和递归的简单作业。我创建了一个只有 10 个整数的数组,我试图使用递归将这些整数放入一个排序的双向链表中。我在将节点插入链表时遇到了一些问题;我的输出是“2 7 9 100”并且由于某种原因缺少其他 6 个整数。我究竟做错了什么?感谢您的任何帮助! (使用的语言是C)
#include <stdio.h>
#include <stdlib.h>
#define N 10
typedef struct node_ {
int value;
struct node_ *next;
struct node_ *prev;
} node;
void insert(node **head, node *cur, node *p);
void print_list(node *cur);
void print_list(node *cur)
{
if (!cur) {
printf("\n");
return;
} else {
printf("%d ", cur->value);
print_list(cur->next);
}
}
int main(int argc, char *argv[])
{
int i;
int data[N] = {2, 7, 3, 9, 4, 4, 0, 8, 7, 100};
node *p, *head;
head = NULL;
for (i = 0; i < N; i++) {
p = (node *)malloc(sizeof(node));
p->value = data[i];
insert(&head, head, p);
}
print_list(head);
}
void insert(node **head, node *cur, node *p)
{
if(*head == NULL)
{
p->next = p->prev = NULL;
*head = p;
return;
}
if(p->value < cur->value)
{
p->prev = cur->prev;
p->next = cur;
cur->prev = p;
if(cur->prev != NULL)
cur->prev->next = p;
else
*head = p;
return;
}
if(cur->next == NULL)
{
cur->next = p;
p->next = NULL;
p->prev = cur;
}
else
insert(head, cur->next, p);
}
我认为问题出在这里:
cur->prev = p;
if(cur->prev != NULL)
如果您已经失去了 cur->prev
的价值,那 if 永远不会是假的。
您需要将cur->prev
保存到一个临时变量中并在if语句中使用它,或者在if语句之后进行赋值。