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);
}
相关推荐
Clarence Liu21 小时前
Go Context 深度解析:从源码到 RESTful 框架的最佳实践
开发语言·后端·golang
中年程序员一枚21 小时前
Python防止重复资源的链接mysql方法
开发语言·python·mysql
果然途游21 小时前
完整Java后端学习路径
java·开发语言·学习笔记
l1t21 小时前
Javascript引擎node bun deno比较
开发语言·javascript·算法·ecmascript·bun·精确覆盖·teris
sang_xb21 小时前
Android 系统的权限管理最佳实践
android·开发语言
信看21 小时前
树莓派CAN(FD) 测试
开发语言·python
爱吃大芒果21 小时前
Flutter 列表优化:ListView 性能调优与复杂列表实现
开发语言·hive·hadoop·flutter·华为
啃火龙果的兔子21 小时前
Java 学习路线及学习周期
java·开发语言·学习
电饭叔1 天前
自定义重载运算符--《python语言程序设计》2018版--第8章20题使用Rational类求和数列之一
开发语言·python
济南壹软网络科技有限公司1 天前
高并发电商实战:基于Java生态的多元化盲盒系统技术实现方案
java·开发语言·开源·盲盒源码·盲盒定制开发