首页 > 其他分享 >双向循环链表:(创建、插入、遍历、求长、查找、删除、排序、销毁)待测

双向循环链表:(创建、插入、遍历、求长、查找、删除、排序、销毁)待测

时间:2024-04-24 20:56:54浏览次数:15  
标签:head last 待测 结点 DoubleLList next 链表 new 求长

目录

一、双向循环链表存在的意义

数组这样的结构提供了连续内存的访问和使用,链表是对内存零碎空间的有效组织和使用,双向循环链表增大了访问的自由度。

二、节点的定义

{ //构造双向链表的结点,链表中所有结点的数据类型应该是相同的
   int data;
   struct node *pre;
   struct node *next;
}DoubleLList_t;

三:实现

1:创建链表(即创建一个空链表)

双向链表头结点是指向自己的:head->next = head;head->pre = head;

DoubleLList_t * createList()
{
	Node * head = (Node *)malloc(sizeof(Node));
	if (NULL == head)
		exit(-1);
	head->pre = head;
	head->next = head;
	return head;
}

image

2:创建新结点

DoubleLList_t * DoubleLList_NewNode(DataType_t data)
	DoubleLList_t* New = (DoubleLList_t*)calloc(1, sizeof(DoubleLList_t));//1.创建一个新结点并对新结点申请内存
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

	//2.对新结点的数据域和指针域(2个)进行初始化
	New->data = data;
	New->prev = NULL;
	New->next = NULL;

	return New;
}

3:遍历

(核心点:对头结点备份,用循环来tem->next指向下一个结点)

void traverseNList(Node* head)
{
	DoubleLList_t* tmp = head->next;//对头节点的地址备份
	while (tmp != head)
	{
		printf("%-3d", tmp->data);
		tmp = tmp->next;
	}
}

4:插入

头插入

void insertList(Node* head,int data)
{
     DoubleLList_t* last=head->next;
	Node * new=ode *)malloc(sizeof(Node));//或调用上面封装的函数接口DoubleLList_NewNode(data)
	if (NULL == last)
		exit(-1);
	
	while (last->next != head->next  ){ //遍历找出尾结点
	printf("%-3d", last->data);
	last = last->next;
	}
	last->next=new; //尾结点的地址指向
	new->prev=last;//新结点指向尾结点
	new->new=head->next;
	head->next->prev=new;
	head->next=new;
}

image

尾插入

DoubleLList_t * Tai_deletion(DoubleLList_t * head,int data){
  DoubleLList_t* last=head->next;
	Node * new=ode *)malloc(sizeof(Node));//或调用上面封装的函数接口DoubleLList_NewNode(data)
	if (NULL == last)
		exit(-1);
	
	while (last->next != head->next  ){ //遍历找出尾结点
	printf("%-3d", last->data);
	last = last->next;
	}
	
   new->prev=last;
   last->next=new;
   new->next=head->next;
   head->next->prev=new;
}

image

中间插入

DoubleLList_t * inserposition(){
  DoubleLList_t* p=head->next;
	Node * new=ode *)malloc(sizeof(Node));//或调用上面封装的函数接口DoubleLList_NewNode(data)
	if (NULL == last)
		exit(-1);
	while ((p->next!=p)&&(p->next!=head->next) ){ //遍历找出尾结点
	printf("%-3d", p->data);
	p = p->next;
	}
   new->next=p->next;
   p->next->prev=new;
   new->prev=p;
   p->next=new;
   }

标签:head,last,待测,结点,DoubleLList,next,链表,new,求长
From: https://www.cnblogs.com/wxp55/p/18156083

相关文章

  • 数据结构-双循环链表的插入
    数据结构-双循环链表插入/*************************************************/***@filename: DcirLLinkInsert*@brief对双向循环链表插入的功能实现*@[email protected]*@date2024/04/24*@version1.0:在下坂本,有何贵干*@property:none......
  • 单向链表的插入、与删除
    链表在C语言中,链表是一种常用的数据结构,它可以用来存储一系列的元素。链表中的每个元素都存储了下一个元素的地址,从而形成了一条链。这种结构使得在插入和删除元素时不需要像数组那样移动大量元素,因此它在插入和删除操作多的情况下有很大的优势。在C语言中,链表可以有多种实现方......
  • 数据结构-双循环链表的插入
    数据结构-双循环链表插入/*************************************************/***@filename: DcirLLinkInsert*@brief对双向循环链表插入的功能实现*@[email protected]*@date2024/04/24*@version1.0:在下坂本,有何贵干*@property:none......
  • 单向循环链表大纲
    单向循环链表大纲/*************************************************************filename:*author:[email protected]*date:2024/04/23*function:*note:None**CopyRight(c)2023-20241987032607......
  • 双向链表接口设计
    双向链表接口设计/***@filename:双向链表接口设计(非循环接口)*@brief*@[email protected]*@date2024/04/23*@version1.0:*@property:*@note*CopyRight(c)[email protected]*/构造双向循环链表结构体//指......
  • C语言单向循环链表的增删操作
    /***********************************************************************************************************设计单向循环链表的接口****Copyright(c)[email protected]**********************************************......
  • 删除单链表中最小值的结点
    /***********************************************filename:demo14.c*author:[email protected]*date:2024/4/2*function:设计1个函数,实现删除单链表中最小值的结点*note:None*CopyRight(c)2023-2024邮箱AllRightReseverd***********************************......
  • 数据结构:双向链表的创建·插入·删除
    数据结构:双向链表的创建·插入·删除/***@filename:数据结构:双向链表的创建·插入·删除*@brief:实现双向链表的创建·插入·删除*@author :[email protected]*@date :2024/04/23*@version:1.0*@note:none*CopyRight(c......
  • 双向链表(不循环)
    双向链表双向链表的原理与应用如果想要提高单向链表或者单向循环链表的访问速度,则可以在链表中的结点中再添加一个指针域,让新添加的指针域指向当前结点的直接前驱的地址,也就意味着一个结点中有两个指针域(prev+next),也被称为双向链表(DoubleLinkedList)。单向循环链表实现分析......
  • 双向不循环链表
    双向不循环链表/***********************************************************************************************************设计双向链表的接口****Copyright(c)[email protected]*******************************......