双向循环链表的基本操作

该博客主要围绕链表操作展开,详细介绍了如何实现链表的增加、删除、查找功能,同时还涉及链表的清空和销毁操作,这些操作在信息技术领域的数据结构处理中较为常见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现链表的增删查,清空,销毁

#pragma once

typedef int DataType;
//链表的节点结构
typedef struct DLinkList {
	struct  DLinkList*   next;
	struct  DLinkList*   prior;
	DataType data;
}DLinkList,*DLNode;

// 链表的初始化 
void DLLinkListInit(DLNode* L);

//创建一个新的节点
DLNode CreateNewNode(DataType data);

// 在链表的尾部插入值为data的元素 
void DLLinkListPushBack(DLNode L, DataType data);

// 删除链表最后一个元素 
void DLLinkListPopBack(DLNode L);

// 在链表的头部插入值为data的元素 
void DLLinkListPushFront(DLNode L, DataType data);

// 删除链表头部的元素 
void SLLinkListPopFront(DLNode L);

// 在链表pos位置插入值为data的元素 
void DLLinkListInsert(DLNode pos, DataType data);

// 删除链表中pos位置上的元素 
void DLLinkListErase(DLNode pos);

// 在链表中查找值为data的元素,找到返回该元素在链表中的地址,否则返回NULL
DLNode DLLinkListFind(DLNode L, DataType data);

// 检测链表是否为空,如果为空返回非0值,非空返回0
int DLLinkListEmpty(DLNode L);

// 返回链表中节点的的个数 
int DLLinkListSize(DLNode L);

//清空链表
void DLLinkListClear(DLNode L);

// 销毁链表 
void DLLinkListDestroy(DLNode* L);

//打印
void DLLinkListPrint(DLNode L);
//以下 L 代表头节点 
// 链表的初始化 
void DLLinkListInit(DLNode* L) {
	assert(L);
	(*L)= (DLNode)malloc(sizeof(DLinkList));
	if (*L == NULL) {
		return;
	}
	(*L)->next = *L;
	(*L)->prior = *L;
}

//创建一个新的节点
DLNode CreateNewNode(DataType data) {
	DLNode NewNode = (DLNode)malloc(sizeof(DLinkList));
	if (NewNode == NULL) {
		return;
	}
	NewNode->data = data;
	NewNode->next = NULL;
	NewNode->prior = NULL;
}

// 在链表的尾部插入值为data的元素 
void DLLinkListPushBack(DLNode L, DataType data) {
	DLNode NewNode = CreateNewNode(data);
	NewNode->next = L;
	NewNode->prior = L->prior;
	L->prior->next = NewNode;
	L->prior = NewNode;
}

// 删除链表最后一个元素 
void DLLinkListPopBack(DLNode L) {
	assert(L);
	if (L == L->next) {
		return;
	}
	DLNode LastNode = L->prior;
	LastNode->prior->next = L;
	L->prior = LastNode->prior;
	free(LastNode);
}

// 在链表的头部插入值为data的元素 
void DLLinkListPushFront(DLNode L, DataType data) {
	DLNode  NewNode = CreateNewNode(data);
	NewNode->next = L->next;
	NewNode->prior = L;
	L->next = NewNode;
	NewNode->next->prior = NewNode;
}

// 删除链表头部的元素 
void SLLinkListPopFront(DLNode L) {
	assert(L);
	if (L->next == L) {
		return;
	}
	DLNode FirstNode = L->next;
	L->next = FirstNode->next;
	FirstNode->next->prior = L;
	free(FirstNode);
}

// 在链表pos位置插入值为data的元素 ,插在data的前面
void DLLinkListInsert(DLNode pos, DataType data) {
	if (pos == NULL) {
		return;
	}
	DLNode NewNode = CreateNewNode(data);
	NewNode->next = pos;
	NewNode->prior = pos->prior;
	pos->prior = NewNode;
	NewNode->prior->next = NewNode;
}

// 删除链表中pos位置上的元素 
void DLLinkListErase(DLNode pos) {
	if (pos == NULL) {
		return;
	}
	pos->next->prior = pos->prior;
	pos->prior->next = pos->next;
	free(pos);
}

// 在链表中查找值为data的元素,找到返回该元素在链表中的地址,否则返回NULL 
DLNode DLLinkListFind(DLNode L, DataType data) {
	assert(L);
	DLNode TmpNode = L->next;
	while (TmpNode != L) {
		if (TmpNode->data == data) {
			return TmpNode;
		}
		TmpNode = TmpNode->next;
	}
    return NULL;
}

// 检测链表是否为空,如果为空返回非0值,非空返回0
int DLLinkListEmpty(DLNode L) {
	assert(L);
	if (L->next == L)
		return 1;
	return 0;
}
	

// 返回链表中节点的的个数 
int DLLinkListSize(DLNode L) {
	assert(L);
	int count = 0;
	DLNode TmpNode = L->next;
	while (TmpNode != L) {
		count++;
		TmpNode = TmpNode->next;
	}
	return count;
}


//清空链表
void DLLinkListClear(DLNode L) {
	DLNode TmpNode = L->next;
	while (TmpNode != L) {
		L->next = TmpNode->next;
		free(TmpNode);
		TmpNode = L->next;
	}
	L->next = L;
	L->prior = L;
}

// 销毁链表 
void DLLinkListDestroy(DLNode* L) {
	DLLinkListClear(*L);
	free(*L);
	*L = NULL;
}

//打印
void DLLinkListPrint(DLNode L) {
	assert(L);
	DLNode TmpNode = L->next;
	while(TmpNode != L) {
		printf("%d<--->", TmpNode->data);
		TmpNode = TmpNode->next;
	}
	printf("\n");
}


void main() {
	DLinkList *L;

	// 链表的初始化
	DLLinkListInit(&L);  

	// 在链表的尾部插入值为data的元素 
	DLLinkListPushBack(L, 1);
	DLLinkListPushBack(L, 2); 
	DLLinkListPushBack(L, 3);
	DLLinkListPushBack(L, 4);
	DLLinkListPushBack(L, 5);
	DLLinkListPrint(L);

	// 删除链表最后一个元素 
	DLLinkListPopBack(L);
	DLLinkListPrint(L);

	// 在链表的头部插入值为data的元素 
	DLLinkListPushFront(L,0);
	DLLinkListPrint(L);

	// 删除链表头部的元素 
	SLLinkListPopFront(L); 
	DLLinkListPrint(L);

	//在链表pos位置插入值为data的元素,插在data的前面 
	DLLinkListInsert(DLLinkListFind(L, 1),  6);
	DLLinkListPrint(L);

	//删除链表中pos位置上的元素 
	DLLinkListErase(DLLinkListFind(L, 6));
	DLLinkListPrint(L);

	//在链表中查找值为data的元素,找到返回该元素在链表中的地址,否则返回NULL 
	DLNode Node= DLLinkListFind(L,1);
	printf("%p\n", Node);

	//检测链表是否为空,如果为空返回0值,非空返回0
	int ret = DLLinkListEmpty(L);
	printf("%d\n", ret);
	
	// 返回链表中节点的的个数 
	int rett=DLLinkListSize(L);
	printf("%d\n", rett);

	//清空链表
	DLLinkListClear(L);

	// 销毁链表 
	DLLinkListDestroy(L);
	
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值