王道数据结构-----循环单双链表创建(代码展示)

循环单链表

循环单链表的特点是最后一个节点的指针不是指向NULL,而是指向头节点,形成一个环。这样做的优点是从任何一个节点出发都能访问到整个链表。

主要特点:
  • 有一个头节点,头节点的数据域可以不存储任何信息,也可以存储如链表长度等附加信息。
  • 最后一个节点的next指针指向头节点,形成一个环。
  • 在进行插入和删除操作时,需要特别小心地处理指针,以确保环不被破坏。
循环双链表

循环双链表是每个节点有两个指针,一个指向前一个节点(prior),一个指向下一个节点(next)。循环双链表的最后一个节点的next指向头节点,而头节点的prior指向最后一个节点。

主要特点:
  • 每个节点都有一个前驱指针和一个后继指针。
  • 头节点的prior指向最后一个节点,最后一个节点的next指向头节点。
  • 插入和删除操作时,需要同时修改两个方向的指针。

以下是代码展示

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

//循环单链表结构体 
typedef struct LNode{
	int data;							//定义单链表节点类型 
	struct LNode *next;				//每个节点存放一个数据元素 
} LNode,*LinkList;						//指针指向下一个节点 
//循环双链表结构体 
typedef struct DNode{
    int data;
    struct DNode *prior, *next;
}DNode, *DLinklist;

//初始化一个循环单链表
bool InitList(LinkList &L){
	L=(LNode *) malloc(sizeof(LNode));	//分配一个头节点 
	if(L==NULL)							//内存不足,分配失败 
		return false;
	L->next=L;							//头节点next指向头节点 
	return true;
} 
/*//判断循环单链表是否为空
bool Empty(LiinkList L){
	if(L->next==L){
		return true;
	}else{
		return false;
	}
}  
//判断节点p是否为循环单链表的表尾节点 
bool isTail(LiinkList L,LNode *p){
	if(p->next==L){
		return true;
	}else{
		return false;
	}
} 
 */

// 初始化双链表
bool InitDLinkList(DLinklist &K){
    K = (DNode *)malloc(sizeof(DNode));     // 分配一个节点 
    if(K == NULL){                           // 内存不足,分配失败 
        return false;
    }
    K->prior = K;                        // 头节点的prior指向头节点 
    K->next = K;                         // 头节点的next指向头节点 
    return true;
} 
/*//判断循环双链表是否为空
bool Empty(LinkList K){
	if(L->next==K){
		return true;
	}else{
		return false;
	}
}  
 */
int main(){
	// 初始化循环单链表
	LinkList L;
    InitList(L); 
    
    // 初始化循环双链表
	DLinklist K;
    InitDLinkList(K); 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值