C语言双向链表

1.思维导图

2.单向循环链表的所有操作

创建

cs 复制代码
loopLinkPtr create()
{
	loopLinkPtr H=(loopLinkPtr)malloc(sizeof(loopLink));
    if (NULL==H)
	{
        printf("创建失败\n");
        return NULL;
    }
    H->len = 0;
    H->next = H;
	printf("创建成功\n");
    return H;
}

输出结果:

判空

cs 复制代码
int empty(loopLinkPtr H)
{
    if(NULL == H)
    {
        printf("判空失败!\n");
        return -1;
    }        
    return H->len == 0;
    //return H->next == H;
}

输出结果:

尾插

cs 复制代码
int t_add(loopLinkPtr H, DataType e)
{
    if(NULL == H)
    {
        printf("尾插失败!\n");
        return 0;
     }
  
    loopLinkPtr p = (loopLinkPtr)malloc(sizeof(loopLink));
    if(NULL == p)
    {
        printf("申请节点失败!\n");
        return 0;
    }
    p->data = e;
    p->next = NULL;

    loopLinkPtr q = H;
    while(q->next != H)
    {
        q = q->next;

    }

    q->next = p;
    p->next = H;

    H->len++;
	show(H);
    return 1;
}

输出结果:

遍历

cs 复制代码
void show(loopLinkPtr H)
{
    if(NULL == H || empty(H))
    {
        printf("遍历失败!\n");
        return;

    }

    loopLinkPtr p = H;
    for(int i=0; i<H->len; i++)
    {
        p = p->next;
        printf("%d ",p->data);
    }
	printf("\n");
}

输出结果:

尾删

cs 复制代码
int t_del(loopLinkPtr H)
{
    if (NULL==H||H->next==H)
	{
        printf("删除失败\n");
        return 0;
    }
	loopLinkPtr p = H->next; 
	loopLinkPtr q = H;       
    while (p->next != H)
	{
        q = p;
        p = p->next;
    }
    q->next = H; 
    free(p);
	p=NULL;
	H->len--;
    show(H);
    return 1;
}

输出结果:

销毁

cs 复制代码
void a_free(loopLinkPtr H)
{
	if(NULL == H)
	{    
		printf("销毁失败\n");
		return;
    }
	loopLinkPtr p=H->next;
	while(p!=H)
	{
		loopLinkPtr q=p;
		p=p->next;
		free(q);
		q=NULL;
	}
	free(H);
	H=NULL;
    printf("销毁完成\n");
    return;
}

输出结果:

完整代码

looplink.c

cs 复制代码
#include"looplink.h"

loopLinkPtr create()
{
	loopLinkPtr H=(loopLinkPtr)malloc(sizeof(loopLink));
    if (NULL==H)
	{
        printf("创建失败\n");
        return NULL;
    }
    H->len = 0;
    H->next = H;
	printf("创建成功\n");
    return H;
}

int empty(loopLinkPtr H)
{
    if(NULL == H)
    {
        printf("判空失败!\n");
        return -1;
    }
    return H->len == 0;
}

void show(loopLinkPtr H)
{
    if(NULL == H || empty(H))
    {
        printf("遍历失败!\n");
        return;

    }

    loopLinkPtr p = H;
    for(int i=0; i<H->len; i++)
    {
        p = p->next;
        printf("%d ",p->data);
    }
	printf("\n");
}

int t_add(loopLinkPtr H, DataType e)
{
    if(NULL == H)
    {
        printf("尾插失败!\n");
        return 0;
     }
  
    loopLinkPtr p = (loopLinkPtr)malloc(sizeof(loopLink));
    if(NULL == p)
    {
        printf("申请节点失败!\n");
        return 0;
    }
    p->data = e;
    p->next = NULL;

    loopLinkPtr q = H;
    while(q->next != H)
    {
        q = q->next;

    }

    q->next = p;
    p->next = H;

    H->len++;
	show(H);
    return 1;
}

int t_del(loopLinkPtr H)
{
    if (H == NULL||H->next == H)
	{
        printf("删除失败\n");
        return 0;
    }
	loopLinkPtr p = H->next; 
	loopLinkPtr q = H;       
    while (p->next != H)
	{
        q = p;
        p = p->next;
    }
    q->next = H; 
    free(p);
	p=NULL;
	H->len--;
    show(H);
    return 1;
}

void a_free(loopLinkPtr H)
{
	if(NULL == H)
	{    
		printf("销毁失败\n");
		return;
    }
	loopLinkPtr p=H->next;
	while(p!=H)
	{
		loopLinkPtr q=p;
		p=p->next;
		free(q);
		q=NULL;
	}
	free(H);
	H=NULL;
	printf("销毁完成\n");
	return;
}

looplink.h

cs 复制代码
#ifndef __LOOPLINK_H__
#define __LOOPLINK_H__

#include<stdio.h>
#include<stdlib.h>

typedef int DataType;

typedef struct node
{
    union
    {
        int len;
        DataType data;
    };
    struct node *next;
}loopLink,*loopLinkPtr;

loopLinkPtr create();

int empty(loopLinkPtr H);

void show(loopLinkPtr H);

int t_add(loopLinkPtr H,DataType e);

int t_del(loopLinkPtr H);

void a_free(loopLinkPtr H);
#endif

main.c

cs 复制代码
#include"looplink.h"
int main()
{
	loopLinkPtr H=create();
	printf("%d\n",empty(H));
	t_add(H,50);
	t_add(H,40);
	t_add(H,30);
	t_add(H,20);
	t_add(H,10);
	t_del(H);
	t_del(H);
	t_del(H);
	t_del(H);
	a_free(H);
}
相关推荐
Fanxt_Ja1 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下1 小时前
最终的信号类
开发语言·c++·算法
echoarts1 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix2 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题2 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说3 小时前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔3 小时前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔3 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
liujing102329293 小时前
Day03_刷题niuke20250915
c语言
我是菜鸟0713号3 小时前
Qt 中 OPC UA 通讯实战
开发语言·qt