双向链表与双向循环链表(删,查)

一、双向链表

 1.main.c

 

#include"head.h"
int main(int argc, char const *argv[])
{
    double_linklist *L=creat(1);//1头节点  0普通节点
	/*menue();*/
	
    /*datatype e;
    int n;
    printf("输入插入的个数:");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    printf("输入头插的字符:");
    scanf(" %c",&e);
    insert_head(L,e);
    }*/

    //尾插
    datatype a;int n;
    printf("输入尾插的个数:");
    scanf(" %d",&n);
     for(int i=0;i<n;i++)
    {
    printf("输入尾插的字符:");
    scanf(" %c",&a);
    input_rear(L,a);
    }
    
    //输出
    printf("输出结果:");
    output(L);

    //头删
    /*delete_head(L);
    output(L);*/

    //尾删
    /*delete_rear(L);
    output(L);*/

    //按位置插入

    /*int pos; datatype f;
    printf("输入按位置插入的位置:");
    scanf("%d",&pos);
    printf("输入插入的值:");
    scanf(" %c",&f);
    input_pos(L,f,pos);
    output(L);*/

    //按位置删除
    /*int pos;
    printf("输入要删除的位置:");
    scanf("%d",&pos);
    delete_pos(L,pos);
    output(L);
    puts("");*/


    //按位置修改
    /*datatype b;int pos;
    printf("输入修改的位置:");
    scanf("%d",&pos);
    printf("输入按位置修改后的值:");
    scanf(" %c",&b);
    revise_pos(L,b,pos);
    output(L);
    puts("");*/

    //按位置查找
    int pos;
    printf("输入要查找的位置:");
    scanf("%d",&pos);
    find_pos(L,pos);
    puts("");

    return 0;
}

 2.text.c

 

#include"head.h"
double_linklist *creat(int flag)
{
    double_linklist *L=(double_linklist *)malloc(sizeof(struct Node));
    if(L==NULL)
  {
    return NULL;
    }
    //成功返回地址
    if(flag==1)
    {
     L->len=0;
    }
    else if(flag==0)
    {
    L->data=0;
    L->next=NULL;
    L->prev=NULL;
	}
    return L;
}

//头插
int insert_head(double_linklist *L,datatype e)
{
    //1,判断是否创建成功
    if(L==NULL)
    {
    return -1;
    }
    //2,创建成功
	double_linklist *s=creat(0);
    if(s==NULL)
    {
    return -1;
    }
     s->data=e;
//指针域
	s->next=L->next;
	s->prev=L;
    if(L->next!=NULL)
    {
    L->next->prev=s;
    }
    L->next=s;
    L->len++;
    return 0;
}

//尾插
int input_rear(double_linklist *L,datatype e)
{
	if(L==NULL)
	{
		printf("尾插失败\n");
		return -1;
	}
	double_linklist *p=L;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	double_linklist *s=creat(0);
	s->data=e;
	p->next=s;
	s->prev=p;
	L->len++;
	return 0;
}
//输出
void output(double_linklist *L)
{
	if(L==NULL||L->next==NULL)
	{
		printf("遍历失败\n");
		return;
	}
	double_linklist *p=L;
	puts("正向遍历:");
	while(p->next!=NULL)
	{
		p=p->next;
		printf(" %c",p->data);
	}
	puts("");
	/*puts("反向遍历:");
	while(p->prev!=NULL)
	{
		printf(" %c",p->data);
		p=p->prev;
	}
	puts("");*/
}

//头部删除
int delete_head(double_linklist *L)
{
	if(L==NULL||L->next==NULL)
	{
		printf("不需要头删\n");
		return -1;
	}
	double_linklist *q=L;
	q=L->next;
	L->next=q->next;
	if(q->next!=NULL)
	{
		q->next->prev=L;
	}
	free(q);
	q=NULL;
	L->len--;
	printf("头删成功\n");
	return 0;
}

//尾部删除
int delete_rear(double_linklist *L)
{
	if(L==NULL||L->next==NULL)
	{
		printf("不需要头尾删\n");
		return -1;
	}
	double_linklist *p=L;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	p->prev->next=NULL;
	free(p);
	p=NULL;
	L->len--;
	printf("尾删成功\n");
	return 0;
}

//按位置插入
int input_pos(double_linklist *L,datatype f,int pos)
{
	if(L==NULL||pos<1||pos>L->len+1)
	{
		printf("按位置插入失败\n");
		return -1;
	}
	double_linklist *p=L;
	for(int i=0;i<pos-1;i++)
	{
		p=p->next;
	}
	double_linklist *s=creat(0);
	s->data=f;
	s->next=p->next;
	s->prev=p;
	if(p->next!=NULL)
	{
		p->next->prev=s;
	}
	p->next=s;
	L->len++;
	return 0;
}

//按位置删除
int delete_pos(double_linklist *L,int pos)
{
	if(L==NULL||L->next==NULL||pos<1||pos>L->len)
	{
		printf("无法删除\n");
		return -1;
	}
	double_linklist *p=L;
	for(int i=0;i<pos-1;i++)//这里要删除pos,找到pos-1就行了
	{
		p=p->next;//现在p在pos-1这里
	}
	double_linklist *q=p->next;//在定义一个q让他成为pos这个位置方便后面转换
	p->next=q->next;
	if(q->next!=NULL)
	{
		q->next->prev=p;
	}
	free(q);
	q=NULL;
	printf("按位置删除成功\n");
}

//按位置修改
int revise_pos(double_linklist *L,datatype b,int pos)
{
	if(L==NULL||L->next==NULL||pos<1||pos>L->len)
	{
		printf("无法修改\n");
		return -1;
	}
	double_linklist *p=L;
	for(int i=0;i<pos;i++)
	{
		p=p->next;
	}
	p->data=b;
	printf("按位置修改成功\n");
	return 0;
}

//按位置查找
int find_pos(double_linklist *L,int pos)
{
	if(L==NULL||L->next==NULL||pos<1||pos>L->len)
	{
		printf("无法查找\n");
		return -1;
	}
	double_linklist *p=L;
	for(int i=0;i<pos;i++)
	{
		p=p->next;
	}
	printf("此位置的数据是:%c",p->data);
	return 0;
}

 3.head.h

 

#ifndef N
#define  N
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef  char  datatype;
typedef struct Node
{
    //数据域
    union
    {
            int len;
            datatype  data;
    };
    struct Node *next;
    struct Node *prev;
    
}double_linklist;

void menue();
double_linklist *creat(int flag);
void output(double_linklist *L);

int insert_head(double_linklist *L,datatype e);
int input_rear(double_linklist *L,datatype e);

int delete_head(double_linklist *L);
int delete_rear(double_linklist *L);

int input_pos(double_linklist *L,datatype f,int pos);
int delete_pos(double_linklist *L,int pos);

int revise_pos(double_linklist *L,datatype b,int pos);
int find_pos(double_linklist *L,int pos);

#endif

二、双向循环链表

1.main.c

#include"head.h"
int main(int argc, char const *argv[])
{
   loop_double_linklist *L=creat(1);//1头节点  0普通节点
	/*menue();*/

    //头插
    /*int n;datatype e;
    printf("输入头插几个元素:");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    printf("输入要头插的元素:");
    scanf("%f",&e);
    insert_head(L,e);
    }
    puts("");
    output(L);*/
    puts("");

    //尾插
    int n;datatype a;
     printf("输入尾插几个元素:");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    printf("输入要尾插的元素:");
    scanf("%f",&a);
    insert_rear(L,a);
    }
    puts("");
    output(L);
    puts("");

    //头删
    /*delete_head(L);
    puts("");
    output(L);
    puts("");*/

    //尾删
    delete_rear(L);
    puts("");
    output(L);
    puts("");

2.text.c

#include"head.h"
/*void menue()
{
	puts("****************");
	puts("1.双向循环链表头插");//永远在头结点后面插入
	puts("2.双向循环链表遍历");
	puts("3.双向循环链表尾插");
	puts("");
	puts("4.单项链表头删");
	puts("5.单项链表尾删");
	puts("");
	puts("0.退出整个程序:");
	puts("");
}*/
loop_double_linklist *creat(int flag)
{
    loop_double_linklist *L=(loop_double_linklist *)malloc(sizeof(struct Node));
    if(L==NULL)
  {
    return NULL;
    }
    //成功返回地址
    //成功之后初始化
    if(flag==1)//头节点,需要让len为0
    {
     L->len=0;
     L->next=L;//双向需要让自己的next和prev都指向自己
     L->prev=L;
    }
    else if(flag==0)//普通节点,就是数据域为0
    {
    L->data=0;
    L->next=NULL;//普通节点都指向NULL,后面还要指向
    L->prev=NULL;
    }
    return L;
}

//双向循环头插
int insert_head(loop_double_linklist *L,datatype e)
{
        if(L==NULL)
        {
            printf("不需要头插\n");
            return -1;
        }
        loop_double_linklist *s=creat(0);
        if(s==NULL)
        {
            return -1;
        }
        s->data=e;
        s->next=L->next;
        s->prev=L;
        L->next->prev=s;
        L->next=s;
        L->len++;
        return 0;
}

//输出
void output(loop_double_linklist *L)
{
    puts("正向输出");
    loop_double_linklist *p=L;
    while(p->next!=L)
    {
            p=p->next;
            printf("%.1f\t",p->data);
    }
    puts("\n逆向输出");
    while(p->prev!=L->prev)
    {
        printf("%.1f\t",p->data);
        p=p->prev;
    }
    puts("");
}

//尾插
int insert_rear(loop_double_linklist *L,datatype a)
{
    if(L==NULL)
    {
        printf("尾插失败\n");
        return -1;
    }
    loop_double_linklist *p=L->prev;
    loop_double_linklist *s=creat(0);
    if(s==NULL)
    {
        printf("s创建失败\n");
        return -1;
    }
    s->data=a;
    s->prev=p;
    s->next=L;
    L->prev=s;
    p->next=s;
    return 0;
}

//头删
int delete_head(loop_double_linklist *L)
{
    if(L==NULL||L->next==NULL)
    {
        printf("无法头删\n");
        return -1;
    }
    loop_double_linklist *p=L->next;
    L->next=p->next;
    p->next->prev=L;
    free(p);
    p=NULL;
    printf("头删成功\n");
    return 0;
    }

//尾删
int delete_rear(loop_double_linklist *L)
{
    if(L==NULL||L->next==NULL)
    {
        printf("无法尾删\n");
        return -1;
    }
    loop_double_linklist *p=L->prev;
    p->prev->next=L;
    L->prev=p->prev;
    free(p);
    p=NULL;
    printf("尾删成功\n");
    return 0;
}

3.head.h

#ifndef N
#define  N
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef  float datatype;
typedef struct Node
{
    //数据域
    union
    {
            int len;
            datatype  data;
    };
    struct Node *next;
    struct Node *prev;
    
}loop_double_linklist;

void menue();
loop_double_linklist *creat(int flag);
void output(loop_double_linklist *L);

int insert_head(loop_double_linklist *L,datatype e);
int insert_rear(loop_double_linklist *L,datatype a);

int delete_head(loop_double_linklist *L);
int delete_rear(loop_double_linklist *L);


#endif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值