循环 link 列表插入开头

circular link list insertion at beginning

我在开头进行插入,但我的代码将其插入到最后。我正在考虑这个问题,但我认为我的逻辑是正确的。 我认为首先我创建一个指针 p 并将其初始化为 head 然后递增它直到它不等于 head 然后创建一个新的 link。这是正确的做法吗?

在这里,

#include<stdio.h>
#include<stdlib.h>

typedef struct node{

    int data;
    struct  node *next;
        
}sll;

void traversal(sll* head){

    sll* p;
    p=head;
       
    do
    {
        printf("%d\n",p->data);
        p=p->next;
    }while (p!=head);
    
}

sll* insertionstart(sll* head,int data){

        sll* ptr=(sll*)malloc(sizeof(sll));
        ptr->data=data;
       
        sll* p=head;
         do
        {
           p= p->next;
    }   while (p->next!=head);
        
         p->next=ptr;
        ptr->next=head;
        
        return head;
        
        
}

int main(){
    sll* ptr;
    sll* head;
    sll* second;
    sll* third;
    sll* fourth;
    sll* fifth;

    

    head = (sll*) malloc(sizeof(sll));
    second = (sll*) malloc(sizeof(sll));
    third = (sll*) malloc(sizeof(sll));
    fourth = (sll*) malloc(sizeof(sll));
    fifth = (sll*) malloc(sizeof(sll));


    head -> data=56;
    head ->next=second;

    
    second -> data=3;
    second->next=third;

    
    third -> data=18;
    third ->next=fourth;

    
    fourth -> data=90;
    fourth ->next=fifth;

    fifth -> data=76;
    fifth ->next=head;

    traversal(head);
    printf("*******************\n");
    head=insertionstart(head,42);
    traversal(head);

    return 0;
}

如果你想让新元素成为新的头部,那么只需在 insertionstart 中进行此更改:

return head;  -->  return ptr;