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);
}
相关推荐
虾球xz6 分钟前
CppCon 2018 学习:THE MOST VALUABLE VALUES
开发语言·c++·学习
阿蒙Amon1 小时前
C#扩展方法全解析:给现有类型插上翅膀的魔法
开发语言·c#
尘浮7281 小时前
60天python训练计划----day59
开发语言·python
Chef_Chen2 小时前
从0开始学习R语言--Day39--Spearman 秩相关
开发语言·学习·r语言
不学会Ⅳ2 小时前
Mac M芯片搭建jdk源码环境(jdk24)
java·开发语言·macos
好开心啊没烦恼3 小时前
Python 数据分析:计算,分组统计1,df.groupby()。听故事学知识点怎么这么容易?
开发语言·python·数据挖掘·数据分析·pandas
lljss20204 小时前
Python11中创建虚拟环境、安装 TensorFlow
开发语言·python·tensorflow
Python×CATIA工业智造7 小时前
Frida RPC高级应用:动态模拟执行Android so文件实战指南
开发语言·python·pycharm
我叫小白菜8 小时前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
森焱森8 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机