双向链表,单向链表//循环

2023-11-15

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char datatype[20];
typedef struct node
{
    union 
    {
        int len;
        datatype data;
    };
    struct node *prev;//储存前驱节点地址
    struct node *next;//储存后继节点地址

}*doubleLink,Node;


doubleLink creatHead();
doubleLink creat();
void InsertHead(doubleLink L,datatype e);
void doubleLinkshow(doubleLink L);
void doublerear(doubleLink L,datatype e1);
void doubleLinkdeletbyHead(doubleLink L);
void doubleLinkdeletbyrear(doubleLink L);


int InsertBypos(doubleLink L,int pos,datatype e);
void doubleLinkbydata(doubleLink L,datatype e3);
#endif

test.c

#include "head.h"
//创建头节点
//成功返回头节点,失败返回NULL
doubleLink creatHead()
{
    doubleLink L=(doubleLink)malloc(sizeof(Node));
    if(L==NULL)
        return NULL;
    L->len=0;//头节点的数据域赋值,链表为0
    L->prev=NULL;
    L->next=NULL;
    return L;
}
doubleLink creat()
{
    doubleLink p=(doubleLink)malloc(sizeof(Node));
    if(p==NULL)
        return NULL;
    strcpy(p->data,"");
    p->prev=NULL;
    p->next=NULL;
    return p;
    
}
//头插
void InsertHead(doubleLink L,datatype e)
{
    if(L==NULL)
    {
        printf("1");
        return;
    }
    doubleLink p=creat();
    strcpy(p->data,e);
    p->next=L->next;
    p->prev=L;
    if(L->next!=NULL)
    {
        L->next->prev=p;
        
    }
    L->next=p;
    L->len++;
}
//尾插
void doublerear(doubleLink L,datatype e1)
{
    if(L==NULL)
        return;
    doubleLink p=creat();
    if(p==NULL)
        return;
    doubleLink q=L;
    while(q->next)
    {
        q=q->next;
    }
    strcpy(p->data,e1);
    q->next=p;
    p->prev=q;
    L->len++;
}
//双向链表遍历
//双向有两个方向
void doubleLinkshow(doubleLink L)
{
    //正向打印
    printf("正向遍历\n");
    doubleLink p=L;
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%s\t",p->data);
    }
    printf("\n逆向遍历\n");
    while(p!=L)
    {
        printf("%s\t",p->data);
        p=p->prev;
    }
    printf("\n");
}
//头删
void doubleLinkdeletbyHead(doubleLink L)
{
    if(L==NULL)
    {
        printf("链表为空,不可删除\n");
        return;
    }
    doubleLink p=L->next;
    L->next=p->next;
    if(p->next!=NULL)
    p->next->prev=L;
    free(p);
    p=NULL;
    L->len--;
}
//尾删
void doubleLinkdeletbyrear(doubleLink L)
{
    if(L->len==0)
    {
        printf("删除失败\n");
        return;
    }
    doubleLink p=L;
    while(p->next)
    {
        p=p->next;
    }
    p->prev->next=NULL;
    free(p);
    p=NULL;
    L->len--;
}
//按位置插入
int InsertBypos(doubleLink L,int pos,datatype e)
{
    if(L==NULL||pos<1||pos>L->len+1)
    {
        return -1;
    }
    doubleLink p=L;
    doubleLink k=creat();
    if(k==NULL)
        return -1;
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }
    strcpy(k->data,e);
    k->next=p->next;
    k->prev=p;
    if(p->next==NULL)
    p->next->prev=k;
    p->next=k;
    L->len++;
    return 0;
}
void doubleLinkbydata(doubleLink L,datatype e3)

{
    doubleLink p=L;
    for(int i=0;i<L->len;i++)
    {
        p=p->next;
        if(strcmp(p->data,e3)==0)
        {
            doubleLink q=p->next;
            q->prev=p->prev;

            p->prev->next=q;
                    p->prev->next=p->next;
            free(p);
            p=NULL;
        }
        L->len--;
    }
}

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
    doubleLink L=creatHead();
    if(L==NULL)
    {
        printf("头节点创建失败\n");
        return -1;
    }
    //头插
#if 0
    datatype e;
    for(int i=0;i<5;i++)
    {
        printf("\n输入插入的值:");
        scanf("%s",e);
        InsertHead(L,e);
    }

    doubleLinkshow(L);
#endif
    //尾插
    datatype e;
        for(int i=0;i<5;i++)
        {
            scanf("%s",e);
            doublerear(L,e);
        }
    doubleLinkshow(L);

//    doubleLinkdeletbyHead(L);

//    doubleLinkdeletbyrear(L);
//    doubleLinkshow(L);
//按位置插入
#if 0
    int pos;
    datatype e2;
    printf("\n输入擦入的位置:");
    scanf("%d",&pos);
    printf("\n输入插入的值");
    scanf("%s",e2);
    InsertBypos(L,pos,e2);
    //双向链表遍历
#endif
    //按元素插入
    datatype e3;
    printf("请输入元素");
    scanf("%s",e3);
    doubleLinkbydata(L,e3);
    doubleLinkshow(L);
    return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#include "head.h"
#include <stdio.h>
#include <stdlib.h>
typedef float datatype;
typedef struct node
{
union
{
int len;
datatype data;
};
struct  node *next;
struct  node *prev;
}*Looplink,Node;
Looplink creathead();
Looplink creatnode();
void Inserthead(Looplink L,datatype e);
void Looplinkshow(Looplink L);
void Insertreal(Looplink L,datatype e);
void deletehead(Looplink L);
void deletereal(Looplink L);
void Insertbypos(Looplink L,int pos,datatype e);
#endif
#include "head.h"
Looplink creathead()
{
    Looplink L=(Looplink)malloc(sizeof(Node));
    if(L==NULL)
    {
        return NULL;
    }
    L->len=0;
    L->next=L;
    L->prev=L;
    return L;
}
Looplink creatnode()
{
    Looplink p=(Looplink)malloc(sizeof(Node));
    if(p==NULL)
    {
        return NULL;
    }
    p->data=0;
    p->next=NULL;
    p->prev=NULL;
    return p;
}
void Inserthead(Looplink L,datatype e)
{
    if(L==NULL)
    {
        return;
    }
    Looplink p=creatnode();
    if(p==NULL)
    return;
    p->data=e;
    p->next=L->next;
    p->prev=L;
    L->next->prev=p;
    L->next=p;
    L->len++;

}
void Looplinkshow(Looplink L)
{
    printf("\n正向打印");
    Looplink p=L;
    while(p->next!=L)
    {
        p=p->next;
        printf("%.2f\t",p->data);

    }
    printf("\n逆向打印");
    while(p!=L)
    {
        printf("%.2f\t",p->data);
        p=p->prev;
    }
    printf("\n");
}
void Insertreal(Looplink L,datatype e)
{
    if(L==NULL)
        return;
    Looplink q=L->prev;
    Looplink p=creatnode();
    if(p==NULL)
        return;
    p->data=e;
    p->next=q->next;
    p->prev=q;
    q->next->prev=p;
    q->next=p;
    L->len++;

}
void deletehead(Looplink L)
{
    if(L->len==0)
    {
        printf("删除失败\n");
        return;
    }
    Looplink p=L->next;
    L->next=p->next;
    p->next->prev=L;
    free(p);
    p=NULL;
    L->len--;
}
void deletereal(Looplink L)
{
    if(L->len==0)
    {
        printf("删除失败\n");
        return;
    }
    Looplink q=L->prev;
    L->prev=q->prev;
    q->prev->next=L;
    free(q);
    q=NULL;
    L->len--;
}
void Insertbypos(Looplink L,int pos,datatype e)
{
    if(L==NULL)
        return;
    if(pos<1||pos>L->len+1)
        return;
    Looplink p=L;
    for(int i=0;i<pos;i++)
    {
        p=p->next;
    }
    Looplink q=creatnode();
    q->data=e;
    q->next=p;
    q->prev=p->prev;
    p->prev=q;
    p->prev->next=q;
    L->len++;


    
}

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
    Looplink L=creathead();
    if(L==NULL)
        return -1;
#if 0
    for(int i=0;i<5;i++)
    {
        datatype e;
        scanf("%f",&e);
        Inserthead(L,e);
    }
    Looplinkshow(L);
#endif
    //尾插
    for(int i=0;i<5;i++)
    {
        datatype e1;
        scanf("%f",&e1);
        Insertreal(L,e1);
    }
    //遍历
    Looplinkshow(L);
//    deletehead(L);
//    deletehead(L);
//    Looplinkshow(L);
    //尾删
//    deletereal(L);
//    deletereal(L);
//    按位置插入
    int pos;
    datatype e;
    printf("输入插入位置");
    scanf("%d",&pos);
    printf("输入插入值");
    scanf("%f",&e);
    Insertbypos(L,pos,e);
    Looplinkshow(L);
    return 0;
}
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
union
{
int len;
datatype data;
};
struct  node *next;
}*Looplink,Node;
Looplink createHead();
Looplink createnode();
void InsertHead(Looplink L,datatype e);
void Looplinkshow(Looplink L);
void Insertreal(Looplink L,datatype e);
void deletreal(Looplink L);
void deletHead(Looplink L);
void josepho(Looplink L,int m,int n);
#endif

#include "head.h"

//

//

Looplink createHead()

{

Looplink L=(Looplink)malloc(sizeof(Node));

if(L==NULL)

{

printf("创建失败\n");

return NULL;

}

L->len=0;

L->next=L;

return L;

}

Looplink createnode()

{

Looplink p=(Looplink)malloc(sizeof(Node));

if(p==NULL)

{

printf("创建失败\n");

return NULL;

}

p->data=0;

p->next=NULL;

return p;

}

//头插

void InsertHead(Looplink L,datatype e)

{

if(L==NULL)

return;

Looplink p=createnode();

if(p==NULL)

{

return;

}

p->data=e;

p->next=L->next;

L->next=p;

L->len++;

}

//遍历链表

void Looplinkshow(Looplink L)

{

Looplink p=L;

while(p->next!=L)

{

p=p->next;

printf("%d\t",p->data);

}

printf("\n");

}

void Insertreal(Looplink L,datatype e)

{

if(L==NULL)

return;

Looplink q=L;

for(int i=0;i<L->len;i++)

{

q=q->next;

}

Looplink p=createnode();

if(p==NULL)

return;

p->data=e;

p->next=q->next;

q->next=p;

L->len++;

}

void deletreal(Looplink L)

{

if(L->len==0)

{

printf("链表为空,无删除值\n");

return;

}

Looplink p=L;

for(int i=0;i<L->len-1;i++)

{

p=p->next;

}

p->next=L;

free(p->next);

L->len--;

}

void deletHead(Looplink L)

{

if(L->len==0)

return;

Looplink p=L->next;

L->next=p->next;

free(p);

p=NULL;

L->len--;

}

void josepho(Looplink L,int m,int n)

{

int i,j;

Looplink p=L;

for(i=0;i<n;i++)

{

for(j=0;i<m-1;j++)

{

p=p->next;

if(p==L)

j--;

}

Looplink q=p->next;

if(q==L)

q=L->next;

printf("%d\t",q->data);

p->next=q->next;

free(q);

q=NULL;

}

}

#include "head.h"
int main(int argc, const char *argv[])
{
    Looplink L=(Looplink)malloc(sizeof(Node));
    if(L==NULL)
    {
        return -1;
    }
    //头插:永远在第一个节点的位置插入
#if 0
    int n;
    printf("\n输入元素个数");
    scanf("%d",&n);
    datatype e;
#endif
#if 0
    for(int i=0;i<n;i++)
    {
        printf("输入第%d个值",i+1);
        scanf("%d",&e);
        InsertHead(L,e);
    }
#endif
#if 0
    for(int i=0;i<n;i++)
    {
        printf("输入第%d个值",i+1);
        scanf("%d",&e);
        Insertreal(L,e);
    }
#endif

        Insertreal(L,8);
    //约瑟夫环
        int n,m;
    printf("\n输入元素个数");
    scanf("%d",&n);
    datatype e;

    for(int i=0;i<n;i++)
    {    
        printf("输入第%d个值",i);
        scanf("%d",&e);
        Insertreal(L,e);
    }
    

    printf("请输入循环多少为一次");
    scanf("%d",&m);
    josepho(L,m,n);

    Looplinkshow(L);

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双向链表,单向链表//循环 的相关文章

随机推荐