中间插入双链表

时间:2015-11-06 10:01:31

标签: algorithm data-structures linked-list doubly-linked-list

我正在尝试编写以下问题的代码:

  

在每对连续元素之间插入一个元素(邻居之和)?

     

示例:如果输入

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

2 个答案:

答案 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),这意味着它现在指向你刚添加的临时元素,而你会尝试在Bi = 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;
    }
}