基础学习第三弹

今天被老师拉去做“苦力”没有学多少。。。惭愧
接第二弹

循环链表

与单链表区别在于尾结点的指针不是NULL,而是指向head
算法没什么大的区别,注意尾结点p2->next=NULL改为p2->next=head;
遍历时,p1->next!=NULL改为p1->next!=head;

  • 循环链表的创建算法
#include <malloc.h>

tyepdef struct node
{
    int num;
    struct node *next;
}stud;

stud *create(int n)
{   
    stud *head,*p1,*p2;
    head=p1=p2=NULL;
    for(int i=0;i<n;i++)
    {
    p1=(stud *)malloc(sizeof(stud));
    p1->num=i;
    if(i==0)
        head=p1;
    else
        p2->next=p1;
    p2=p1;
    }
    p2->next=head;//!!!!!!!
    return head;
}
  • 循环链表的查找算法
stud *find(stud *head,int i)
{   
    stud *p1;
    p1=head;
    while(p1!=NULL)
    {
        if(p1->num==i)
        {
            break;
        }
        else
        {
            p1=p1->next;
            if(p1==head)//!!!!!!!
            {
            p1=NULL;
            }
        }
    }
    return p1;
}
  • 循环链表的删除算法
bool del(stud *head ,int i)
{   
    bool consq=false;
    if(head)
    {
        stud *p1,*p2;
        p1=head;
        while(p1->num!=i&&p1->next!=head)//!!!
        {
            p2=p1;
            p1=p1->next;
        }
        if(p1->num==i)
        {
            if(p1==head)//!!!!
            {
                head=p1->next;
            }
            else
            {
                p2->next=p1->next;
            }
            free(p1);//!!!!
            consq=true;
        }
    }
    return consq
}

都是不考虑重复元素的,碰到重复的情况,算法需要进行调整。目前想法是碰到一个删除一个,直到遍历完成,而不是这里的先遍历,一旦碰到符合条件的就停止进行处理。还需考虑有序无序。

  • 循环链表的插入算法
stud *insert(stud *head,stud *p)
{   
    if(!head)
        {
        head=p;
        p->next=head;            //!!!!!
        }
    else
    {
        stud *p1,*p2;
        p1=head;
        while(p->num >p1->num && p1->next!=head)
        {
            p2=p1;
            p1=p1->next;
        }
        if(p->num<=p1->num)
        {
            if(p1==head)
            {
                head=p;
                p->next=head;//书上没加,我觉得应该加一个
            }
            else
            {
                p2->next=p;
                p->next=p1;
            }
        }
        else                //注意点!单链表我没加,略微不同,我觉得单链表那书上也写这个有点多余
        {
            p1->next=p;
            p->next=head;
        }
    }
}

双向链表

待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值