0

我想写以下问题的代码:双向链表插入在这两者之间

插入每对连续元素之间的元素(邻居的总和)?

示例:如果输入是

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

回答

3

第一个问题是,你将其复制到t->next

交换机

i->next = t;t->prev = i; 
    t->next = i->next;i->next->prev = t; 

顺序为

前覆盖 i->next
t->next = i->next; i->next->prev = t; 
    i->next = t; t->prev = i; 

详细说明一下,假设你的链表中有2个元素:A-->B,并且你想添加临时元素,所以你创建了t,但是因为你做的第一件事就是覆盖第一个元素(在这种情况下为A),您将失去再次访问B的机会。相反,您将自身的地址分配到临时元素的前向指针中,从而创建无限循环。

第二个问题是,你只有一个链接,这意味着它现在将指向您刚刚添加的临时元件推进当前指针(i),你会尝试添加额外的临时元素在tB之间。这将导致无限循环 - 而不是事先我通过 -

i = t->next; 
+0

对不起可以说你的程序请做什么,你可以给更新代码。 –

+0

仍然我的终端是现金后,你可以找到错误 –

+0

@RamanaUday你是对的,有第二个错误 - 看我最后的编辑 – Leeor

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

但是在打印过程中,我将使用head = CreateLinkedList(int n);和InsBet(头);所以之后我会打印PrintList(头像);所以哪些头将在PrintList期间使用。并感谢代码。 –

+0

一个linkedList只有一个头。如果将它与数组进行比较,则头是第一个元素 – Lukas