数据结构之单链表

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));
    


}
原文地址:https://www.cnblogs.com/zxjie/p/3104260.html