2024.3.15

发布于:2024-03-17 ⋅ 阅读:(62) ⋅ 点赞:(0)

1.单向循环链表

代码:

#include"loop.h"
//创建单向循环链表
loop_p create_loop_list()
{
	loop_p H = (loop_p)malloc(sizeof(loop));
	if(H==NULL)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	H->len=0;
	H->next=H;
	return H;
}
//创建节点
loop_p create_loop(datatype data)
{
	loop_p new = (loop_p)malloc(sizeof(loop));
	if(new==NULL)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	new->data=data;
	return new;
}
//判空
int empyt_loop(loop_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return -1;
	}
	return H->next==H?1:0;
}
//输出
void show_loop(loop_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(empyt_loop(H))
	{
		printf("链表为空\n");
		return;
	}
	loop_p p = H->next;
	while(p!=H)
	{
		printf("%d->",p->data);
		p=p->next;
	}
	printf("NULL\n");
}
//头插
void insert_head(loop_p H,datatype data)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	loop_p new = create_loop(data);
	new->next=H->next;
	H->next=new;
	H->len++;
}
//头删
void dele_head(loop_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(empyt_loop(H))
	{
		printf("链表为空,无需删除\n");
		return;
	}
	loop_p del = H->next;
	H->next = del->next;
	free(del);
	H->len--;
}
//尾插
void insert_tail(loop_p H,datatype data)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	loop_p p = H->next;
	while(p->next!=H)
	{
		p=p->next;
	}
	loop_p new = create_loop(data);
	new->next=p->next;
	p->next=new;
	H->len++;
}
//尾删
void dele_tail(loop_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(empyt_loop(H))
	{
		printf("链表为空,无需删除\n");
		return;
	}
	loop_p p = H;
	while(p->next->next!=H)
	{
		p=p->next;
	}
	loop_p del = p->next;
	p->next H;
	free(del);
	H->len--;
}
//按位置插入
void insert_pos(loop_p H,datatype data,int pos)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(pos<1||pos>H->len+1)
	{
		printf("位置不合理\n");
		return;
	}
	loop_p p = H->next;
	loop_p new = create_loop(data);
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}
	new->next = p->next;
	p->next = new;
	H->len++;
}
//按位置删除
void dele_pos(loop_p H,int pos)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(empyt_loop(H))
	{
		printf("链表为空,无需删除\n");
		return;
	}
	if(pos<1||pos>H->len)
	{
		printf("位置不合理\n");
		return;
	}
	loop_p p = H->next;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	loop_p del = p->next;
	p->next = del->next;
	free(del);
	H->len--;
}
//删除单向循环列表的头结点
void dele_head_loop(loop_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	loop_p p = H->next;
	while(p->next!=H)
	{
		p=p->next;
	}
	p->next=H->next;
	free(H);
	return p->next;
}
//打印输出没有头的单向循环链表
void show_nohead_loop(loop_p fir)
{
	if(fir==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	loop_p p = fir;
	do
	{	
		printf("%d->",p->data);
		p=p->next;
	}
	while(p!=fir);
	
}

2.双向链表

代码:

#include"double.h"
//创建双向链表
double_p create_double()
{
    double_p H = (double_p)malloc(sizeof(node));
    if(H==NULL)
    {
        printf("空间申请失败\n");
        return NULL;
    }
    H->len = 0;
    H->pri = NULL;
    H->next = NULL;
    return H;
}
//创建节点
double_p create_node(datatype data)
{
    double_p new = (double_p)malloc(sizeof(node));
    if(H==NULL)
    {
        printf("空间申请失败\n");
        return NULL;
    }
    new->data = data;
    return new;
}
//头插
void insert_head(double_p H,datatype data)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    double_p new = create_node(data);
    new->next = H->next;
    if(H->next!=NULL)
    {
        H->next->pri = new;
    }
    H->next = new;
    new->pri = H;
    H->len++;
}
//判空
int empty_double(double_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return -1;
	}
	return H->next==NULL?1:0;
}
//输出
void show_double(double_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(empty_double(H))
	{
		printf("链表为空\n");
		return;
	}
	double_p p = H->next;
	while(p!=NULL)
	{
		printf("%d->",p->data);
		p=p->next;
	}
	printf("NULL\n");
}
//头删
void dele_head(double_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(empty_double(H))
	{
		printf("链表为空,无需删除\n");
		return;
	}
	double_p del = H->next;
	H->next = del->next;
	del->next->pri = H;
	free(del);
	H->len--;
}
//尾插
void insert_tail(double_p H,datatype data)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	double_p new = create_node(data);
	double_p p = H;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	p->next = new;
	new->pri = p;
	new->next = NULL;
	H->len++;
}
//按位置插入*
void insert_pos(double_p H,datatype data,int pos)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	double_p new = create_node(data);
	double_p p = H->next;
	for(int i=0;i<pos-1;i++)
	{
		p=p->next;
	}
	new->next = p->next;
	if(p->next!=NULL)
	{
		p->next->pri=new;
	}
	p->next=new;
	new->pri=p;
	H->len++;
}
//按位置删除
void dele_pos(double_p H,int pos)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(empty_double(H))
	{
		printf("链表为空,无需删除\n");
		return;
	}
	if(pos<0||pos>H->len)
	{
		printf("位置不合理\n");
		return;
	}
	double_p p = H->next;
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}
	double_p del = p->next;
	p->next = del->next;
	del->next->pri = p;
	free(del);
	H->len--;

}

结果:

3.思维导图

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到