双向循环链表

目录

一、链表的概念

1. 链表的概念

2. 链表相邻结点不连续

二、双向循环链表的相关函数

1. 创建链表结点(增)

(1)创建结点

(2)尾插结点

2. 删除链表结点(删)

3. 查找链表结点(查)

4. 修改链表结点(改)

三、归纳总结

四、源码链接


一、链表的概念

1. 链表的概念

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表示意图
双向循环链表示意图

2. 链表相邻结点不连续

由图可知,00A99740+12=00A9974C!=00A99788,即物理存储结构上相邻结点不连续

	ListPushBack(Head, 1);//尾插法生成结点
	ListPushBack(Head, 2);
	ListPrint(Head);      //打印链表
	ListFind(Head,1);     //查找结点
	ListFind(Head,2);
	printf("一个结点的内存大小为:%d\n",sizeof(ListNode));

链表相邻结点地址不连续

二、双向循环链表的相关函数

1. 创建链表结点(增)

(1)创建结点

a. 在堆上申请空间

	ListNode* Node = (ListNode*)malloc(sizeof(ListNode));
	if (NULL == Node){//判断申请空间是否失败
		assert(0);
		return 0;
	}

b. 存储数据

	Node->data= data;
	Node->next = NULL;
	Node->pre = NULL;

c. 返回结点地址

	return Node;

(2)尾插结点

假设结点newNode尾插在结点A后面

a. newNode的next指针指向头结点Head

newNode->next=Head ;

b. newNode的prev指针指向结点Head的prev所指向的结点(即A)

newNode->pre=Head->pre ;

c. A的next(即Head->pre->next)指向结点neNode

Head->pre->next = newNode;

d. newHead的prev指向结点P

Head->pre = newNode;
尾插图解

2. 删除链表结点(删)

a. 创建temp指针,指向Head->next所指向的结点

ListNode* temp = (*Head)->next;

b. 通过循环删除temp所指向的结点

	while (temp != *Head){
        //Head的next指向temp
		(*Head)->next = temp->next;
		free(temp);
		temp = (*Head)->next;
	}
        //删除temp所指向的结点后,temp再次指向Head->next所指向的结点

c. 删除头结点

	free(*Head);
	*Head = NULL;

3. 查找链表结点(查)

a. 创建指针temp,指向头结点Head的下一个结点

ListNode* temp = Head->next;

b. 使用while循环寻找结点

	while (temp!= Head){
		temp = temp->next;
	}

c.创建flag变量判断是否找到结点

若flag==0,则未找到结点;若flag==1,则未找到结点;

		int flag = 0;
        //找到结点
        if (temp->data ==x){
			printf("%d的地址为%p\n",x,temp);
			flag = 1;
			break;
		}
        //未找到结点
        if (0 == flag){
		    printf("%d不在链表中\n",x);
	    }

4. 修改链表结点(改)

a. 找到结点

ListNode* temp=ListFind(Head, x);

b. 修改内容

	LTDataType flag = 0;
	printf("请输入你要修改的数字:");
	scanf("%d",&flag);
	temp->data = flag;

三、归纳总结

带头双向循环链表是链表中结构最复杂的,但使用代码实现以后会发现结构会带来很多优势,实现反而简单了。

(1)链表在物理存储结构上不连续

(2)链表尾插,请注意结点的链接顺序,避免断连。

Head->prev先链接newNode,造成找不到结点A(即无法使用Head->prev找到结点A),出现A的next无法连接newNode的情况。

结点指针断连
结点指针断连

四、源码链接

小伙伴们,关于双向循环链表的源码就在这里了,请点击链接。欢迎关注,欢迎问答,我一定会尽力解答你们的疑惑的。
 

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值