C 在开始处插入循环链接列表

C 在开始处插入循环链接列表,c,linked-list,insertion,C,Linked List,Insertion,我在开始时插入,但我的代码在最后插入。我正在考虑这个问题,但我认为我的逻辑是正确的。 我想,首先我做一个指针p,初始化它为head,然后增加它,直到它不等于head,然后创建一个新的链接。这是正确的方法吗 在这里 #include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *next; }sll; void traversal(sl

我在开始时插入,但我的代码在最后插入。我正在考虑这个问题,但我认为我的逻辑是正确的。 我想,首先我做一个指针p,初始化它为head,然后增加它,直到它不等于head,然后创建一个新的链接。这是正确的方法吗

在这里

#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;
}
#包括
#包括
类型定义结构节点{
int数据;
结构节点*下一步;
}sll;
空隙穿越(sll*头部){
sll*p;
p=水头;
做
{
printf(“%d\n”,p->data);
p=p->next;
}而(p!=头);
}
sll*插入开始(sll*头部,整数数据){
sll*ptr=(sll*)malloc(sizeof(sll));
ptr->data=数据;
sll*p=水头;
做
{
p=p->next;
}while(p->next!=头部);
p->next=ptr;
ptr->next=头部;
回流头;
}
int main(){
sll*ptr;
sll*头部;
sll*秒;
sll*第三;
sll*第四;
sll*第五;
水头=(sll*)马洛克(sizeof(sll));
第二个=(sll*)malloc(sizeof(sll));
第三个=(sll*)malloc(sizeof(sll));
第四个=(sll*)malloc(sizeof(sll));
第五名=(sll*)malloc(sizeof(sll));
头部->数据=56;
头->下一个=秒;
第二->数据=3;
第二->下一个=第三个;
第三->数据=18;
第三->下一个=第四个;
第四->数据=90;
第四->下一个=第五个;
第五->数据=76;
第五->下一个=头部;
横向(头部);
printf(“*********************\n”);
头部=插入开始(头部,42);
横向(头部);
返回0;
}

如果希望新元素成为新的头,只需在
插入开始中进行此更改即可:

return head;  -->  return ptr;

如果希望新元素成为新的头,只需在
insertionstart
中进行此更改:

return head;  -->  return ptr;

贝兹爵士,我认为在循环ll中,首先p指向最后一个元素p->next=ptr,因此我将其递增。要在开头插入,必须有一些代码更改
指针以指向新节点。此时,您的函数总是只返回旧的
。主席先生,这里的p是递增的,而p=头也是递增的
p
的副本。改变
p
头部没有影响。如果您不相信这一点,只需在调试器中运行程序,并在程序运行时检查指针值。另外,如果它确实改变了
head
,那么
p->next=head
没有意义,因为
head
会不断变化。是的,先生,如果我移除返回的head,它就在开始打印。贝兹先生,我认为在循环ll中,首先p转到最后一个元素p->next=ptr,因此我正在增加它。要在开始插入,您必须有一些代码来更改
head
指向新节点的指针。此时,您的函数总是只返回旧的
。主席先生,这里的p是递增的,而p=头也是递增的
p
的副本。改变
p
头部没有影响。如果您不相信这一点,只需在调试器中运行程序,并在程序运行时检查指针值。另外,如果它确实改变了
head
,那么
p->next=磁头
将毫无意义,因为磁头
将不断变化。是的,先生,如果我移除返回磁头,它将在开始时打印。