C的数据结构---双向链表

 1.插入思想

 2.删除思想

优点:

双向链表在单链表的基础上增加了指向前驱的指针

功能上双向链表可以完全代替单链表使用

双向链表的Next,Pre和Current操作可以搞笑的遍历链表中的元素

 

#pragma once
#include <crtdbg.h> 
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef void BidLinkList;

typedef struct BidListNode      //结点
{
	struct BidListNode *next;   //指向后继
	struct BidListNode *pre;    //指向前驱
}BidListNode;

typedef struct HeadNode
{
	BidListNode head;
	BidListNode *cursor;
	int lenth;
}HeadNode;

BidLinkList* BidLinkList_Creat();  //创建链表

void BidLinkList_Destroy(BidLinkList *list); //销毁链表

void BidLinkList_Clear(BidLinkList *list);  //清空链表

int BidLinkList_Length(BidLinkList *list); //链表的当前长度

void BidLinkList_Insert(BidLinkList *list, BidListNode *node, int pos); //链表插入结点

BidListNode* BidLinkList_Get(BidLinkList *list, int pos);  //获取某位置结点

BidListNode* BidLinkList_Delete(BidLinkList *list, int pos); //删除某位置结点

BidListNode* BidLinkList_Reset(BidLinkList *list);     //重置游标,指向链表的第一个元素

BidListNode* BidLinkList_Current(BidLinkList *list);   //当前游标指向的数据元素

BidListNode* BidLinkList_DeleteNode(BidLinkList *list, BidListNode *node); //直接删除链表中的某个数据元素

BidListNode* BidLinkList_Next(BidLinkList *list);  //把当前游标返回,并且游标下移

 

#include "Bid_link_list.h"


BidLinkList* BidLinkList_Creat()  //创建链表
{
	HeadNode *tlist = (HeadNode*)malloc(sizeof(HeadNode));
	assert(tlist != NULL);
	tlist->cursor = NULL;
	tlist->head.next = NULL;
	tlist->head.pre = NULL;
	tlist->lenth = 0;
	return (BidLinkList*)tlist;
}

void BidLinkList_Destroy(BidLinkList *list) //销毁链表
{
	HeadNode *tlist = (HeadNode*)list;
	free(tlist);
}

void BidLinkList_Clear(BidLinkList *list)  //清空链表
{
	assert(list != NULL);
	HeadNode *tlist = (HeadNode*)list;
	tlist->lenth = 0;
	tlist->head.next = NULL;
	tlist->head.pre = NULL;
	tlist->cursor = NULL;
}

int BidLinkList_Length(BidLinkList *list)  //链表的当前长度
{
	assert(list != NULL);
	HeadNode *tlist = (HeadNode*)list;
	return tlist->lenth;
}

BidListNode* BidLinkList_Get(BidLinkList *list, int pos)  //获取某位置结点
{
	assert(list != NULL && pos >= 0);
	HeadNode *tlist = (HeadNode*)list;
	BidListNode *pCur = &tlist->head;
	for (int i = 0; i < pos && (pCur->next != NULL); i++)
	{
		pCur = pCur->next;
	}
	return pCur->next;
}


void BidLinkList_Insert(BidLinkList *list, BidListNode *node, int pos) //链表插入结点
{
	assert(list != NULL && node != NULL && pos >= 0);
	HeadNode *tlist = (HeadNode*)list;
	BidListNode *pCur = &tlist->head;
	for (int i = 0; i < pos && (pCur->next != NULL); i++)
	{
		pCur = pCur->next;
	}
	BidListNode *next = pCur->next;

	pCur->next = node;
	node->next = next;  //后继
	

	node->pre = pCur;	      //前驱

	if (next != NULL)         //插入第一个元素时,需要特殊处理
	{
		next->pre = node;
	}

	if (tlist->lenth == 0)
	{
		tlist->cursor = node;
	}

	//0号位置插入
	if (pCur == &tlist->head)
	{
		node->pre = NULL;
	}
  
	tlist->lenth++;
}

BidListNode* BidLinkList_Delete(BidLinkList *list, int pos) //删除某位置结点
{
	assert(list != NULL && pos >= 0);
	HeadNode *tlist = (HeadNode*)list;
	BidListNode *pCur = &tlist->head;
	for (int i = 0; i < pos && (pCur->next != NULL); i++)
	{
		pCur = pCur->next;
	}
	BidListNode *tmp = pCur->next;
	pCur->next = tmp->next;

	if (tmp->next != NULL)   //处理尾删   
	{
		tmp->next->pre = pCur;
		if (pCur == &tlist->head)  //处理头删 
		{
			tmp->next->pre = NULL;
		}
	}
	if (tlist->cursor == tmp)
	{
		tlist->cursor = tlist->cursor->next;
	}
	tlist->lenth--;
	return tmp;
}

BidListNode* BidLinkList_Reset(BidLinkList* list)     //重置游标,指向链表的第一个元素
{
	assert(list != NULL);
	HeadNode *tlist = (HeadNode*)list;
	tlist->cursor = tlist->head.next;
	return tlist->cursor;
}

BidListNode*BidLinkList_Current(BidLinkList *list)   //当前游标指向的数据元素
{
	assert(list != NULL);
	HeadNode *tlist = (HeadNode*)list;
	return tlist->cursor;
}

BidListNode* BidLinkList_DeleteNode(BidLinkList *list, BidListNode *node) //直接删除链表中的某个数据元素
{
	assert(list != NULL && node != NULL);
	HeadNode* tlist = (HeadNode*)list;
	BidListNode* pCur = &tlist->head;
	BidListNode* tmp = NULL;
	int i = 0;
	//查找node在链表中的位置
	for (; i < tlist->lenth; i++)
	{
		if (pCur->next == node)
		{
			tmp = pCur->next;
			break;
		}
		pCur = pCur->next;
	}
	if (tmp != NULL)
	{
		BidLinkList_Delete(list, i);
	}
	return tmp;
}

BidListNode* BidLinkList_Next(BidLinkList *list)  //把当前游标返回,并且游标下移
{
	assert(list != NULL);
	HeadNode* tlist = (HeadNode*)list;
	assert(tlist->cursor != NULL);
	BidListNode *tmp = tlist->cursor;
	tlist->cursor = tmp->next;
	return tmp;
}

struct Value
{
	BidListNode node;
	int v;
};

int main()
{
	BidLinkList *list = BidLinkList_Creat();
	struct Value v1, v2, v3, v4, v5;
	v1.v = 1; v2.v = 2, v3.v = 3, v4.v = 4, v5.v = 5;

	BidLinkList_Insert(list, (BidListNode*)&v1, BidLinkList_Length(list));
	BidLinkList_Insert(list, (BidListNode*)&v2, BidLinkList_Length(list));
	BidLinkList_Insert(list, (BidListNode*)&v3, BidLinkList_Length(list));
	BidLinkList_Insert(list, (BidListNode*)&v4, BidLinkList_Length(list));
	BidLinkList_Insert(list, (BidListNode*)&v5, BidLinkList_Length(list));
	
	for (int i = 0; i < BidLinkList_Length(list); i++)
	{
		struct Value *pv = (struct Value*)BidLinkList_Get(list, i);
		printf("%d  ", pv->v);
	}
	printf("\n");
	BidLinkList_Delete(list, BidLinkList_Length(list) - 1); //尾删
	BidLinkList_Delete(list, 0);  //头删

	for (int i = 0; i < BidLinkList_Length(list); i++)
	{
		struct Value *pv = (struct Value*)BidLinkList_Next(list);
		printf("%d  ", pv->v);
	}
	printf("\n");
	BidLinkList_Destroy(list);
	_CrtDumpMemoryLeaks();
	system("pause");
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值