双向循环链表的头插法和尾插法

我们平常学链表的时候会学单向不循环链表,单向循环链表,双向不循环链表,双向循环链表及内核链表,各种格式的链表。今天我因为忘记双向循环链表的头插法和尾插法的顺序了,特意写一篇文章来巩固一下。首先我根据顺序画一张图(尾插法)

双向循环链表的头插法和尾插法_第1张图片

                                                                       尾插法示意图

//尾插法
void inser_stu_trail(Stu *new,Stu *head)
{
    new->prev = head->prev;
    new->next = head;

    head->prev->next = new;
    head->prev = new;
}

 头插法如下

双向循环链表的头插法和尾插法_第2张图片

                                                                 头插法示意图

//头插法
void inser_stu_head(Stu *new,Stu *head)
{
    new->next = head->next;
    new->prev = head;

    head->next->prev = new;
    head->next = new;

}

示例中的新节点用了new 来表示,这样感觉不是很好,因为很多语言中的new 都是一个特殊的词。

下面是一个emo测试代码

#include 
#include 
#include 
typedef struct Student
{
    char name;
    int age;
    int grade;
    struct Student *prev;
    struct Student *next;

}Stu;

Stu *init_mode()
{
    Stu *new = (Stu*)malloc(sizeof(Stu));
    if(new == NULL)
    {
        perror("new malloc is failed\n");
        return NULL;
    }
    memset(new,0,sizeof(Stu));
    new->next=new;
    new->prev=new;
    

    return new;
}

//头插法
void inser_stu_head(Stu *new,Stu *head)
{
    new->next = head->next;
    new->prev = head;

    head->next->prev = new;
    head->next = new;

}

//尾插法
void inser_stu_trail(Stu *new,Stu *head)
{
    new->prev = head->prev;
    new->next = head;

    head->prev->next = new;
    head->prev = new;
}

void display(Stu *head)
{
    Stu *p=head->next;
    while(p!=head)
    {
        printf("姓名:%c,年龄:%d,成绩:%d\n",p->name,p->age,p->grade);
        p=p->next;
    }

}


int main()
{
    
    Stu *head = (Stu*)malloc(sizeof(Stu));
    if(head == NULL)
    {
        perror("head malloc is failde");
        return -1;
    }
    head->next=head;
    head->prev=head;
    char name_buf[10]={0};
    int age=20;
    int grade=92;
    Stu *s;
    for(char name='a';name<='g';name++,age++,grade++)
    {
        s=init_mode();
        s->name = name;
        s->age=age;
        s->grade=grade;
        
        inser_stu_trail(s,head);
    }

    display(head);
    return 0;

}

你可能感兴趣的:(重拾C语言,链表,数据结构)