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);
}
相关推荐
lueluelue475 小时前
LeetCode:链表
算法·leetcode·链表
隐积6 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
橘子汽水1688 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
名字还没想好☜9 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
初级代码游戏10 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
酷在前行11 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
cxr82811 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
2601_9555181812 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·标准演化·ansic·性能与可移植性
废弃的小码农12 小时前
功能测试--Day07--Python编程基础
开发语言·python
fengci.12 小时前
Microweber CMS 未授权路径穿越漏洞(CVE-2026-65694)
android·开发语言·前端·学习·php