王道数据结构实践代码----循环单链表的实现(C语言版)

王道数据结构实践代码----循环单链表的实现(C语言版)

前言

日期:2021年8月30日
书籍:王道2021年数据结构考研复习指导
代码内容:实现循环单链表的实现,包括初始化,插入新元素,删除新元素,输出,查询

代码展示

1.预编译内容

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

//设置bool
#define bool char
#define true 1
#define false 0

//定义顺序表的数据Elemtype
typedef int Elemtype;

/*定义结点和链表的数据结构*/
//【1】循环单链表的结点结构
typedef struct Node
{
   
    Elemtype data;
    struct Node *next;
}Node,*PNode;

//【2】循环单链表的链表结构
typedef struct CLinkList
{
   
    PNode head;//指向头节点
    PNode tail;//指向尾结点
    int length;
}CLinkList;

2.循环单链表的初始化

/*循环单链表的初始化*/
bool CLinkListInit(CLinkList *L)
{
   
    //[1]申请头结点
    PNode HeadNode = (PNode)malloc(sizeof(Node));
    //[2]判错
    assert(HeadNode);
    //[3]然单链表结构体和头结点结构体相连
    L->head = L->tail = HeadNode;
    L->length = 0;
    //[4]让头节点的next指针指向头指针
    HeadNode->next = L->head;
}

3.创建新节点

/*创建新节点*/
PNode CreatNode(Elemtype e)
{
   
    //[1]申请新节点的空间
    PNode newNode = (PNode)malloc(sizeof(Node));
    //[2]为新节点赋值
    newNode->data = e;
    newNode->next = NULL;
}

4.定位(按位序定位,按内容定位)

/*定位*/
//【1】按位序定位
PNode GetElem(CLinkList *L,int i)
{
   
    //[1]判断要定位的结点是否合法或特殊
    assert(L);//检查L链表是否存在
    if(i == 0) return L->head;//返回头指针的情况,用于按位删除或者插入时使用
    if(L->length < i || i < 1) return NULL;//检查输入的节点位序是否存在
    //[2]生成定位指针
    PNode p = L->head->next;
    //[3]循环定位
    while (i > 1)
    {
   
        p = p->next;
        i--;
    }
    //[4]返回p
    return p;
}
//【2】按内容值定位
PNode LocateElem(CLinkList *L,Elemtype e)
{
   
    //[1]判错
    assert(L);//检查L链表是否存在
    //[2]生成定位指针
    PNode p = L->head->next;
    //[3]循环定位
    for (int i = 1; i < L->length; i++)
    {
   
        if(p->data == e) return p;
        p = p->next;
    }
    return NULL;
}

5.王道书上的判空方式

/*王道书上的判空方式*/
//按照头结点的指针是否指向头指针为判空条件
bool IfEmpty(CLinkList *L)
{
   
    return (L->head->next == L->head);
}

6.插入新节点(头插法,尾插法,按位序插入)

/*插入新节点*/
//【1】头插法
bool CLinListHeadInsert
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值