(数据结构)带头结点的双向链表操作——C实现

带头结点的双向链表

声明单链表结点类型

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

操作

链表初始化

//链表初始化
void InitDuLinkList(DuLinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		return;
	}
	plist->prior = plist->next = NULL;
}

为了实现以下插入,删除等一系列操作,先封装以下功能:

获取节点个数

int GetLength(DuLinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		return -1;
	}

	int length = 0;
	DuLinkList p = plist->next;

	while(p != NULL)
	{
		length++;
		p=p->next;
	}

	return length;
}

根据位置找结点

DuLinkList FindNodeOfPos(DuLinkList plist,int pos)
{
	assert(plist != NULL);
	if(plist == NULL || pos < 0)
	{
		return NULL;
	}
	DuLinkList p = plist;
	while(pos && p != NULL)
	{
		p=p->next;
		pos--;
	}
	return p;
}

申请节点

static DuLinkList _ApplyNode(int val,DuLinkList prior,DuLinkList next)
{
	DuLinkList s = (DuLinkList)malloc(sizeof(DuLNode));
	assert(s != NULL);
	if (s == NULL)
	{
		printf("Insert Fail : Apply Spave Error\n");
		return NULL;
	}

	s->data = val;	
	s->prior = prior;
	s->next = next;


	return s;
	
}

插入

1.新节点的prior和next
2.pos位置下一个节点的prior(特殊处理pos是最后一个节点)
3.pos未知节点的next

int Insert(DuLinkList plist,int val, int pos)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		return 0;
	}

	if(pos < 0 || pos > GetLength(plist))
	{
		return 0;
	}

	DuLinkList p = FindNodeOfPos(plist, pos);

	DuLinkList s = _ApplyNode(val, p, p->next);
	if(s == NULL)return -1;

	if(p->next != NULL)
	{
		p->next->prior = s;
	}
	p->next = s;

	return 1;
}

头插

int Insert_Head(DuLinkList plist,int val)
{
	return Insert(plist, val ,0);
}

尾插

int Insert_Tail(DuLinkList plist,int val)
{
	return Insert(plist, val ,GetLength(plist));
}

删除

1.pos位置的前一个节点的next
2.pos位置的后一个结点的prior,如果pos是最后一个结点,则不需要处理
3.将pos位置释放

void Delete(DuLinkList plist , int pos)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		return;
	}

	DuLinkList p = FindNodeOfPos(plist,pos);
	if(p == NULL || p == plist)return;

	p->prior->next=p->next;
	if(p->next != NULL)
	{
		p->next->prior = p->prior;
	}

	free(p);
}

头删

void Delete_Head(DuLinkList plist )
{
	Delete(plist,1);
}

尾删

void Delete_Tail(DuLinkList plist)
{
	Delete(plist,GetLength(plist));
}

判空

int ListEmpty(DuLinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		return 1;
	}

	if(plist->next == NULL)
	{
		return 1;
	}

	return 0;
}

置空

void Clear(DuLinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		return ;
	}

	while(!ListEmpty(plist))
	{
		Delete_Head(plist);
	}
}

显示

void Show(DuLinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		return;
	}
	DuLinkList p = plist->next;

		while(p)
	{
		printf("%d ——> ",p->data);
		p = p ->next; 
	}
	printf("NULL\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值