数据结构---双向链表

#include
#include

typedef struct DuLNode {
	int data;
	struct DuLNode* prior;
	struct DuLNode* next;
}DuLNode,*DuLinkList;

//创建节点
void Create_Dul(DuLinkList &L) {
	L = (DuLinkList)malloc(sizeof(DuLNode));

}

//初始化

void Init_DuL(DuLinkList &L) {
	Create_Dul(L);
	DuLinkList p = L;
	if (!p) {
		printf("error");
		exit(0);
	}
	else
	{
		p->next = nullptr;
		p->prior = nullptr;
	}
	printf("初始化成功\n");
}

//判空
int IsEmpty_Dul(DuLinkList L) {
	return L->next == NULL;
}

//求链表长度
int Lenth_Dul(DuLinkList L) {
	
	int i = 0;
	DuLinkList p = L->next;
	while (p)
	{
		i++;
		p = p->next;
	}
	return i;
}

//插入
void Insert_Dul(DuLinkList &L, int i, int e) {
	if (i<1 || i>Lenth_Dul(L) + 1||!L) exit(0);//位置有误

	DuLinkList p = L;
	DuLinkList k = nullptr;
	int j = 0;
	while (p->next&&j<i-1)
	{
		p = p->next;
		++j;
	}

	k = (DuLinkList)malloc(sizeof(DuLNode));
	if (!k) exit(0);
	else
	{
		k->data = e;
		if (p->next) {
			k->prior = p;
			k->next = p->next;
			k->next->prior = k;
			p->next = k;
		}
		else {//如果是最后一个元素
			k->next = p->next;
			k->prior = p;
			p->next = k;
		}
		

	}

}

//删除
void Delete_Dul(DuLinkList L, int i) {
	if (i<1 || i>Lenth_Dul(L)||!L) exit(0);
	DuLinkList p = L;
	DuLinkList k = nullptr;
	int j = 0;
	while (p->next&&j<i-1)
	{
		p = p->next;
		++j;			
	}
	k = p->next;

	if (k) {
		p->next = k->next;
		k->next->prior = p;
		
	}
	else {
		p->next = NULL;
		
	}
	free(k);


}

//返回第i个元素的值
int GetElem_Dul(DuLinkList L, int i) {
	if (!L || i<1 || i>Lenth_Dul(L)) exit(0);
	DuLinkList p = L;
	for (int j = 0; j < i; j++) {
		p = p->next;
	}
	return p->data;
}

//获取元素的位置
int Locate_Dul(DuLinkList L, int e) {
	DuLinkList p = L->next;
	int i = 1;
	while (p)
	{
		if (p->data == e) return i;
		else
		{
			p = p->next;
			i++;
		}
		
	}
	return 0;//没找到

}

//清空数据
void ClearData_Dul(DuLinkList &L) {
	if (!L) exit(0);
	else {
		DuLinkList p = L->next;
		DuLinkList q;
		while (p)
		{
			q = p->next;
			free(p);
			p = q;
				
		}
		L->next = NULL;
	}
}

//清空整个表
void Destroy_Dul(DuLinkList& L) {
	if (!L) exit(0);
	else {
		ClearData_Dul(L);
		free(L);
	}
}

//打印
void Print_Dul(DuLinkList L) {
	if (!L) exit(0);
	DuLinkList p = L->next;
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
}

int main() {
	DuLinkList L=nullptr;
	Create_Dul(L);
	Init_DuL(L);

	int len = Lenth_Dul(L);
	printf("长度是%d\n", len);


	for (int i = 1; i < 10; i++)
	{
		Insert_Dul(L, 1, i);
	}
	Print_Dul(L);
	printf("\n");

	Delete_Dul(L, 2);
	Print_Dul(L);
	printf("\n");

	ClearData_Dul(L);
	printf("长度是%d", Lenth_Dul(L));

	Destroy_Dul(L);
	return 0;
}```

你可能感兴趣的:(数据结构)