zoukankan      html  css  js  c++  java
  • 数据结构之单链表

    1建立只有头结点的空表

    2判断链表是否为空,返回1为空,0非空

    3单链表的创建,头插法

    4单链表的创建,尾插法

    5顺序打印出单链表的数据

    6取得链表中第loc个元素,返回取得的元素

    7在第loc个元素前插入a,返回值1代表插入成功,0代表插入失败

    8删除第loc个元素,返回值表示删除的值

    9//返回单链表的长度

    10判断单链表是否有环,返回值为环的长度

    11求出环的开始位置,返回开始位置的数据域

    12单链表的逆转

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    typedef struct Node
    {
        int data;
        struct Node *next;
    }linklist;
    //linklist  *head;
    //建立只有头结点的空表
    linklist *listinit()
    {
        linklist *list;
        list=(linklist *)malloc(sizeof(linklist));
        if(list==NULL)
            exit(0);
        list->next=NULL;
        return list;
    }
    //判断链表是否为空,返回1为空,0非空
    int listisempty(linklist *list)
    {
        if(!list->next)
        {
            return 1;
        }
        else 
        {
            return 0;
        }
    }
    //单链表的创建,头插法
    linklist *listcreatehead(linklist *head,int n)
    {
        linklist *p=NULL;
        int i=0,a=0;
        head=(linklist *)malloc(sizeof(linklist));
        head->next=NULL;
        for(i=0;i<n;i++)
        {
            p=(linklist*)malloc(sizeof(linklist));
            scanf("%d",&a);
            p->data=a;
            p->next=head->next;
            head->next=p;
        }
        return head;
    }
    //单链表的创建,尾插法
    linklist *listcreatetail(linklist *head,int n)
    {
        linklist *p=NULL,*r=NULL;
        int i=0,a=0;
        head=(linklist *)malloc(sizeof(linklist));
        r=(linklist *)malloc(sizeof(linklist));
        head->next=NULL;
        r=head;
        for(i=0;i<n;i++)
        {
            p=(linklist*)malloc(sizeof(linklist));
            scanf("%d",&a);
            p->data=a;
            r->next=p;
            r=p;
        }
        r->next=NULL;
        return head;
        
    }
    //顺序打印出单链表的数据
    void listdisplay(linklist *list)
    {
        linklist *p;
        p=(linklist*)malloc(sizeof(linklist));
        if(list->next==NULL)
            printf("单链表为空\n");
        p=list->next;
        while(p!=NULL)
        {
            
            printf("%d  ",p->data);    
            p=p->next;
        }
        printf("\n");
    }
    //取得链表中第loc个元素,返回取得的元素
    int listgetelem(linklist *list,int loc)
    {
        int i=1;
        linklist *r;
        r=(linklist *)malloc(sizeof(linklist));
        r=list->next;
        while(i<loc&&r!=NULL)
        {    
            i++;
            r=r->next;
        }
        if(!r||i<loc)
        {
            printf("参数不正确\n");
            return 0;
        }
        return r->data;
    }
    //在第loc个元素前插入a,返回值1代表插入成功,0代表插入失败
    linklist *listinsert(linklist *list,int loc,int a)
    {
        int i=1;
        linklist *r,*s;
        r=(linklist *)malloc(sizeof(linklist));
        s=(linklist *)malloc(sizeof(linklist));
        r=list->next;
        while(i<loc-1&&r!=NULL)
        {
            i++;
            r=r->next;
        }
        if(!r->next||i<loc-1)
        {
            printf("插入位置不正确\n");
            exit(0);
        }
        s->data=a;
        s->next=r->next;
        r->next=s;
        return s;
    }
    //删除第loc个元素,返回值表示删除的值
    int listdelete(linklist *list,int loc)
    {
        int i=1;
        linklist *r=NULL,*s=NULL;
        r=(linklist *)malloc(sizeof(linklist));
        s=(linklist *)malloc(sizeof(linklist));
        r=list->next;
        while(i<loc-1&&r!=NULL)//定位到前一个元素
        {    
            i++;
            r=r->next;
        }
        if(!r->next||i<loc-1)
        {
            printf("参数不正确\n");
            return 0;
        }
    
        s=r->next;
        r->next=s->next;
        free(s);
        return 1;
    
    }
    //返回单链表的长度
    int listlength(linklist *list)
    {
        int length=0;
        linklist *r;
        r=(linklist *)malloc(sizeof(linklist));
        r=list->next;
        while(r!=NULL)
        {
            length++;
            r=r->next;
        }
        return length;
    }
    
    //判断单链表是否有环,返回值为环的长度
    int listcircle(linklist *list)
    {
        int circlelen=1;
        linklist *fast=NULL,*slow=NULL,*p;
        fast=(linklist *)malloc(sizeof(linklist));
        slow=(linklist *)malloc(sizeof(linklist));
        p=(linklist *)malloc(sizeof(linklist));
        fast=list;
        slow=list;
        for(;fast!=NULL&&fast->next!=NULL;)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow)
            {
                p=slow->next;
                for(;p!=slow;)
                {
                    circlelen++;
                    p=p->next;
                }
                return circlelen;
            }
        }
        return 0;
    }
    //求出环的开始位置,返回开始位置的数据域
    int listcirclestart(linklist *list)
    {
        int i=0;
        int circlelen=listcircle(list);
        linklist *p,*q;
        p=(linklist *)malloc(sizeof(linklist));
        q=(linklist *)malloc(sizeof(linklist));
        p=list->next;
        for(;p!=NULL;)
        {
            q=p;
            for(i=0;i<circlelen;i++)
            {
                q=q->next;
            }
            if(q==p)
            {
                return q->data;
            }
            p=p->next;
        }
        return 0;
    }
    //单链表的逆转
    void listreverse(linklist *list)
    {
        linklist *p,*q;
        p=(linklist *)malloc(sizeof(linklist));
        q=(linklist *)malloc(sizeof(linklist));
        p=list->next;
        q=p->next;
        p->next=NULL;
        while(q)
        {
            p=q;
            q=q->next;
            p->next=list->next;
            list->next=p;
        }
    
    }
    //测试
    void main()
    {
        linklist *head1=NULL,*insertp=NULL,*list=NULL;
        insertp=(linklist *)malloc(sizeof(linklist));
        list=(linklist *)malloc(sizeof(linklist));
        head1=listcreatetail(head1,4);
        printf("head1 is empty:%d\n",listisempty(head1));
        printf("head1:");
        listdisplay(head1);
        printf("length of head1 :%d\n",listlength(head1));
        insertp=listinsert(head1,2,100);
        listdisplay(head1);
        printf("head1第几个元素:%d\n",listgetelem(head1,5));
        listdelete(head1,3);
        printf("after delete :");
        listdisplay(head1);
        printf("head1 reverse:");
        listreverse(head1);
        listdisplay(head1);
        printf("是否有环(环的长度):%d\n",listcircle(head1));
        //构造环
        list=head1->next;
        while(list->next!=NULL)
        {
            list=list->next;
        }
        list->next=insertp;
        printf("是否有环(环的长度):%d\n",listcircle(head1));
        printf("环的开始元素为:%d\n",listcirclestart(head1));
        
    
    
    }
  • 相关阅读:
    Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
    Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序
    Bzoj 1984: 月下“毛景树” 树链剖分
    面试题14:调整数组顺序使奇数位于偶数前面
    面试题13:在O(1)时间删除链表结点
    面试题12:打印1到最大的n位数
    面试题11:数值的整数次方
    面试题10:二进制中1的个数
    [找程序员代写推荐]不要说你工作多久,多厉害!这些题不从网上找答案,你能做出来吗???
    [原]Android开发技巧--ListView
  • 原文地址:https://www.cnblogs.com/zxjie/p/3104260.html
Copyright © 2011-2022 走看看