我正在尝试编写以下问题的代码:
在每对连续元素之间插入一个元素(邻居之和)?
示例:如果输入
12 23 34 45 for n=4
输出应为:
12 35 23 57 34 79 45
我写的代码是:
struct node *InsBet(node *head) {
node *i,*j,*t;
i=head;
while(i->next!=NULL) {
t = (node*)malloc(sizeof(node));
t->data = i->data + i->next->data;
i->next = t;t->prev = i;
t->next = i->next;i->next->prev = t;
i = i->next;
}
return head;
}
打印完阵列后,我的终端崩溃了。
我的打印程序是:
void PrintList(node *head) {
node *i;
i=head;
while(i!=NULL) {
printf("%d ",i->data);
i=i->next;
}
}
答案 0 :(得分:3)
第一个问题是您在将i->next
复制到t->next
之前覆盖 i->next = t;t->prev = i;
t->next = i->next;i->next->prev = t;
切换
的顺序 t->next = i->next; i->next->prev = t;
i->next = t; t->prev = i;
进入
A-->B
详细说明,假设您的列表中有2个元素链:t
,并且您希望在它们之间添加临时元素,因此您创建A
,但是因为您做的第一件事覆盖第一个元素的前向指针(在这种情况下为B
),您将失去再次访问i
的机会。相反,您将临时元素的前向指针分配给自身的地址,从而创建无限循环。
第二个问题是你只用一个链接推进当前指针(t
),这意味着它现在指向你刚添加的临时元素,而你会尝试在B
和i = t->next;
之间添加其他临时元素。这将导致无限循环 - 而不是通过 -
template <typename T>
class Heap{
public:
Heap(int size, bool (*comparator) (const T & a, const T & b) = [] (const T & a, const T & b){
return a < b;
})
// other unimportant methods
}
答案 1 :(得分:1)
上面的答案解释得非常好,但只是为了给你一个有效的代码,在这里你去:
PS,你不需要返回头部指针,因为它通过引用传递,并且返回它没有用处
void InsBet(node *head) {
node *i,*t;
i=head;
while(i->next!=NULL) {
t = (node*)malloc(sizeof(node));
t->data = i->data + i->next->data;
t->prev = i;
t->next = i->next;
i->next = i->next->next;
i->prev = t;
i = t->next;
}
}