在列表中每隔两个元素之间插入元素



我需要编写一个函数,在每两个现有节点之间的单链表中插入一个新节点,其值等于这两个节点的值之差。

例如,如果我们有列表1→2.→5.→7结果应该是1→1.→2.→3.→5.→2.→7,因为2-1=1,5-2=3和7-5=2。

这是我的尝试:

struct Node{
int v;
struct Node* next;
};
void insert(struct Node** headPtr){
struct Node* curr = *headPtr;
struct Node* new = malloc(sizeof(struct Node));
while(curr->next!=NULL){
new->v=curr->next->v-curr->v;
new->next=curr->next;
curr->next=new;
curr=curr->next;
}
}
void addRear(struct Node** headPtr, int v_new){
struct Node* new = malloc(sizeof(struct Node));
new->v=v_new;
new->next=NULL;
if(*headPtr==NULL){
*headPtr=new;
}else{
struct Node* curr = *headPtr;
while(curr->next!=NULL){
curr=curr->next;
}
curr->next=new;
}
}
void print(struct Node* head){
struct Node* curr = head;
while(curr!=NULL){
printf("%d ",curr->v);
curr = curr->next;
}
}

但是当我在main中运行以下内容时,我没有得到任何结果。这是我的main代码:

struct Node* head=NULL;
addRear(&head,1);
addRear(&head,2);
addRear(&head,5);
addRear(&head,7);
print(head);
printf("n");
insert(&head);
print(head);

两个问题:

  • 您只创建了一个新节点。在循环中移动新节点的创建
  • curr=curr->next是不正确的,因为curr将变得等于new节点。因此,在下一次迭代中,您将不会再接近列表的末尾。循环永远不会结束。相反,您应该执行curr = new->next

这是更正后的代码:

void insert(struct Node** headPtr){
struct Node* curr = *headPtr;
while (curr->next != NULL) {
struct Node* new = malloc(sizeof(struct Node)); // <---
new->v = curr->next->v - curr->v;
new->next = curr->next;
curr->next = new;
curr = new->next; // <---
}
}

相关内容

  • 没有找到相关文章

最新更新