双向循环链表

实现了双向链表的一些简单的功能 比如添加元素删除元素查找元素等

这个是.c文件
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

biLinkedList *create_bilist(void)
{
	biLinkedList *bl = malloc(sizeof(*bl));

	bl->first = NULL;
	bl->last  = NULL;

	return bl;
}

biLinkedList* create_list(void)
{
	//创建头
	biLinkedList *bl=create_bilist();
	int d;
	while(1)
	{
		scanf("%d",&d);
		if(d == 0)
		{
			break;
		}

		biNode *p = malloc(sizeof(*p));
		p->data = d;
		p->next=p->prev=NULL;

		add_a_biNode(bl,p);
	}
	return bl;
}

void add_a_biNode(biLinkedList * bl, biNode * p)
{
	if(bl == NULL||p == NULL)
	{
		return ;
	}
	
	if(bl->first == NULL)//链表为空的时候
	{
		p->next = p->prev = p;
		bl->first = bl->last = p;
		return ;
	}
	//1.找位置
	//从first 一直找到last 停下来
	int flag = 0;//PK找到与否的标记 1找到了 0没有找到
	biNode*pk = bl->first;
	do
	{
		if(pk->data>p->data)
		{
			flag = 1;//找到了
			break;
		}
		pk=pk->next;
	}
	while (pk!=bl->first);
	//2.插入
	if(flag)
	{
		//找到的就是第一个节点比p->data大
		if(pk == bl->first)//头插
		{
			p->next = bl->first;
			bl->last->next = p;

			p->prev = bl->last;
			bl->first->prev = p;

			bl->first = p;			
		}
		else
		{
			p->next = pk;
			p->prev = pk->prev;

			pk->prev->next = p;
			pk->prev = p;
		}
	}
	else//尾插
	{
		p->next=bl->first;
		p->prev=bl->last;

		bl->first->prev = p;
		bl->last->next = p;

		bl->last = p;
	}
}
/*删除x的值*/
//双向循环链表
void delete_all_x(biLinkedList*bl,ElemType x)
{
	if(bl == NULL || bl->first == NULL )
	{
		return ;
	}

	biNode* pk = bl->first;

	while(1)
	{	
		int flag = 0;
		do
		{
			if(pk->data == x)
			{
				flag = 1;
				break;
			}
			pk=pk->next;
		}while(pk != bl->first );
		//删除
		if(flag == 0)
		{
			return ; 
		}
		//需要删除的是第一个元素
		if(pk == bl->first)
		{
			//判断有几个元素
			//如果只有一个元素
			if(pk->next == NULL)
			{
				bl->first = NULL;
				bl->last  = NULL;
				free(pk);
				pk=NULL;
				return ;
			}
			else
			{
				bl->last->next =pk->next;
				pk->next->prev =bl->last;
				bl->first=bl->first->next;
				pk->next=pk->prev=NULL;
				free(pk);
				pk=NULL;
			}
		}
		else
		{
			//如果删除的是最后一个元素
			if(pk == bl->last)
			{
				bl->last=bl->last->prev;
				
				bl->last->next = bl->first;
				bl->first->prev = bl->last;
				pk->next = pk->prev =NULL;
				free(pk);
				pk=NULL;
				return ;
			}
			else
			{
				pk->prev->next=pk->next;
				pk->next->prev=pk->prev;
				pk->next = pk->prev =NULL;
				free(pk);
				pk=NULL;
			}
		}
		pk=bl->first;

	}
}
/*删除整个链表*/
void delete_bilist(biLinkedList* bl)
{
	if(bl==NULL||bl->first==NULL)
	{
		return ;
	}
	biNode* p = bl->first;
	while(1)
	{
		
		p = bl->first;
		//如果只有一个
		if(p->next==bl->first)
		{
			bl->first=bl->last=NULL;
			p->next=p->prev=NULL;
			free(p);
			p=NULL;
			break;
		}
		else
		{
			
			bl->first=bl->first->next;
			
			bl->last->next=bl->first;
			bl->first->prev=bl->last;
			
			p->next=p->prev=NULL;
			free(p);
			p=NULL;
		}
	}
}


void print_list(biLinkedList* bl)
{
	if(bl == NULL || bl->first == NULL)
	{
		return ;
	}
	printf("-----------------------------\n");

	biNode* p = bl->first;
	do
	{
		printf("%d ",p->data);
		p = p->next;	
	}
	while (p!=bl->first);
	printf("\n");

	printf("-----------------------------\n");

	p = bl->last;
	do
	{
		printf("%d ",p->data);
		p = p->prev;	
	}
	while (p!=bl->last);
	printf("\n");

	printf("-----------------------------\n");
		
}

/*以下是测试主函数*/
void main(void)
{
	biLinkedList *bl = create_list();
	print_list(bl);
	//delete_all_x( bl, 2);
	delete_bilist(bl);
	free(b1);
	//print_list(bl);
}

这个是.h文件


#ifndef _LIST_H_
#define _LIST_H_

typedef int ElemType;//数据元素的类型 
	
//数据节点
typedef struct biNode
{
	ElemType data;//数据域
	
	struct biNode *next;//指向后继节点
	struct biNode *prev;//指向前驱节点
}biNode;
//头结点

typedef struct biLinkedList
{
	struct biNode* first;//指向双向链表的第一个节点
	struct biNode* last;//指向双向链表的最后一个节点
//.....
}biLinkedList;

biLinkedList * create_bilist(void);
biLinkedList *create_list(void);
void add_a_biNode(biLinkedList*bl,biNode* p);
void print_list(biLinkedList* bl);
void delete_all_x(biLinkedList*bl,ElemType x);
void delete_bilist(biLinkedList* bl);

#endif


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值