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);
}
相关推荐
weixin_307779137 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天10 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel10 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog11 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_9620715712 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
\光辉岁月/13 小时前
5.java-数组
java·开发语言
Java后端的Ai之路13 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang13 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
时间的拾荒人13 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
郑州光合科技余经理13 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程