双向链表-创建-打印-测长-查找-插入-删除

双向链表

创建-打印-测长-查找-插入-删除

#include <iostream>
using namespace std;

typedef struct DbNode
{
	int data ;
	struct DbNode *left;
	struct DbNode *right;
}DbNode;
//根据数据创建节点
DbNode *Create(int data)
{
	DbNode *pnode = NULL;
	pnode = (DbNode *)malloc(sizeof(DbNode));
	pnode->data = data;
	//printf("%d\n",data);
	pnode->left = pnode ->right = NULL ;
	return pnode ;
}

//插入新节点,总是在表尾插入;返回表头节点;
DbNode *AppendNode(DbNode *head ,int data)
{
	DbNode *p = head, *q;
	DbNode *pnode = Create(data);
	while(p!= NULL)
	{
		q = p;
		p = p->right;
	}
	q->right = pnode;
	pnode->left = q;
	return head ;
}
//实现双向链表的测长
int Getlength(DbNode *head)
{
	int count = 1;
	DbNode *p = head, *q;
	if(head==NULL)
	{
		return 0;
	}
	else
	{
		while(p!=NULL)
		{
		q = p->right;
			if(q!=NULL)
			{
				count++;
			}
		p = p->right;
		}
	}
	//printf("%d\n",count);
	return count;
}
//双向链表的打印
void Dbprint(DbNode *head)
{
	DbNode *p = head;
	int length = Getlength(head);
	if(p!=NULL)
	while(length>0)
	{
		printf("The list data :%d\n",p->data);
		p = p->right;
		--length;
	}
}
//实现双向链表节点的查找
DbNode *FindNode(DbNode *head,int data)
{
	int length = Getlength(head);
	DbNode *pnode = head;
	if(pnode!=NULL)
	{
		while(length>0)
		{
			if(pnode->data == data)
			{
				printf("The List find node:%d\n",pnode->data);
				return pnode;
			}
			else
			{
				pnode = pnode->right;
			}
			--length;
		}
	}
	return NULL;
}
//双向链表的插入
DbNode *InsertNode(DbNode *head,int data,int pos)
{
	DbNode *pnode = Create(data), *p = head;
	int length = Getlength(head); 

	if(p== NULL||length<=pos)
	{
		printf("The list NULL or Beyond\n");
		return NULL;
	}
	while(pos>0&&length>pos)
	{
		p = p->right;
		--pos;
	}
	if(p->right != NULL)
	{
		pnode->right= p->right;
		pnode->left = p;
		p->right = pnode;
	}
	else
	{
		pnode->right = NULL;
		pnode->left = p;
		p->right = pnode;
	}
	return head;
}

//双向链表节点的删除
DbNode *DeleteNode(DbNode* head ,int data)
{
	DbNode *pnode = FindNode(head,data);
	printf("the list delete node data:%d\n",data);
	if(pnode!=NULL)
	{
		if(pnode->left == NULL)
		{
			head = pnode->right;
			if(head!=NULL)
			{
				head->left = NULL;
			}
		}
		else if(pnode->right ==NULL)
		{
			pnode->left->right = NULL;
		}
		else 
		{
			pnode->left->right = pnode->right;
			pnode->right->left = pnode->left;
		}
	}
	free(pnode);
	return head;
}
int main()
{
	DbNode *head = Create(0);
	for(int i = 1;i<10;i++)
	{
		head = AppendNode(head,i);
	}
	FindNode(head,3);
	InsertNode(head,25,8);
	head = DeleteNode(head,9);
	Dbprint(head);
   return 0;
}

The List find node:3
The List find node:9
the list delete node data:9
The list data :0
The list data :1
The list data :2
The list data :3
The list data :4
The list data :5
The list data :6
The list data :7
The list data :8

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GZFSJK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值