双环形链表(增删查改)

list.h

#include<stdlib.h>
#include<stdio.h>

typedef struct node
{
	int data;
	struct node *pPre;
	struct node *pNext;

}NODE, *PNODE;

//双链表的头尾
typedef struct List
{
	struct node *head;
	struct node *tail;


}Dlist;

void init(Dlist *p);
void adddataback(Dlist *p, int data);
void showall(Dlist *p);

void adddatahead(Dlist *p, int data);
PNODE find(Dlist *p, int data);
void change(Dlist *p, int data,int newdata);
void  deletedata(Dlist *p, int data);
void inserthead(Dlist *p, int data, int newdata);
void insertback(Dlist *p, int data, int newdata);

list.c

#include"list.h"

void init(Dlist *p)
{
	p->head = p->tail = NULL;//初始化

}

void adddataback(Dlist *p, int data)
{
	PNODE pnew = malloc(sizeof(NODE));
	pnew->data = data;
	pnew->pNext = NULL;
	pnew->pPre = NULL;

	if (p->head==NULL &&p->tail==NULL)
	{
		p->tail = p->head = pnew;
		pnew->pPre = pnew->pNext = pnew;//插入一个节点
	}
	else if	(p->head==p->tail)//仅有一个节点
	{
		p->head->pPre = pnew;
		p->head->pNext = pnew;

		pnew->pPre = p->head;
		pnew->pNext = p->head;

		p->tail = pnew;//保存尾部

	}
	else
	{
		pnew->pPre = p->tail;
		pnew->pNext = p->head;

		p->tail->pNext = pnew;
		p->head->pPre = pnew;

		p->tail = pnew;
	}

}

void showall(Dlist *p)
{
	if (p->head==NULL&&p->tail==NULL)
	{
		return;
	}
	else if(p->head==p->tail)
	{
		PNODE p1 = p->head;
		printf("%d %p %p %p\n", p1->data, p1, p1->pPre, p1->pNext);
	}
	else
	{
		PNODE p2 = p->head;
		for (; p2->pNext!=p->head; p2=p2->pNext)
		{
			printf("%d %p %p %p\n", p2->data, p2, p2->pPre, p2->pNext);
		}
		printf("%d %p %p %p\n", p2->data, p2, p2->pPre, p2->pNext);
	}

}

void adddatahead(Dlist *p, int data)
{
	PNODE pnew=malloc(sizeof(NODE));
	pnew->data = data;
	pnew->pNext = NULL;
	pnew->pPre = NULL;

	if (p->head==NULL&&p->tail==NULL)
	{
		p->head = p->tail = pnew;
		pnew->pNext = pnew;
		pnew->pPre = pnew;
	}
	else if(p->head==p->tail)
	{
		p->head->pNext = pnew;
		pnew->pNext = p->head;

		p->tail->pPre = pnew;
		pnew->pPre = p->tail;

		p->head = pnew;
	}
	else
	{
		p->head->pPre = pnew;
		pnew->pPre = p->tail;

		p->tail->pNext = pnew;
		pnew->pNext = p->head;

		p->head = pnew;
		
	}


	

}
PNODE find(Dlist *p, int data)
{
	if (p->head==NULL&&p->tail==NULL)
	{
		return NULL;

	}
	else if (p->head==p->tail)
	{
		if (p->head->data == data) {
			return p->head;
		}
		else
		{
			return NULL;
		}
	}
	else
	{
		PNODE pnew = p->head;
		while (pnew->pNext!=p->head)
		{
			if (pnew->data == data)
			{
				return pnew;
			}
			else
			{
				pnew = pnew->pNext;
			}
		}
		if (pnew->data == data)
		{
			return pnew;
		}
		else
		{
			return NULL;
		}
	}

}
void change(Dlist *p, int data, int newdata)
{
	if (p->head == NULL && p->tail == NULL)
	{
		printf("change error");

	}
	else if (p->head == p->tail)
	{
		if (p->head->data == data)
		{
			p->head->data=newdata;
		}
	
	}
	else
	{
		PNODE pnew = p->head;
		while (pnew->pNext != p->head)
		{
			if (pnew->data == data)
			{
				 pnew->data=newdata;
				 break;
			}
			else
			{
				pnew = pnew->pNext;
			}
		}
		if (pnew->data == data)
		{
			pnew->data = newdata;
		}
		
	}



}
void  deletedata(Dlist *p, int data)
{
	if (p->head==NULL&&p->tail==NULL)
	{
		printf("delete error");

	}
	else if (p->head==p->tail)
	{
		if (p->head->data==data)
		{
			free(p->head);
		}

	}
	else
	{
		PNODE p1=p->head;
		if (p1->data == data)
		{
			p->head->pPre->pNext = p->head->pNext;
			p->head->pNext->pPre = p->head->pPre;
			p->head = p->head->pNext;
			free(p1);
			return;

		}
		PNODE p2 = NULL;
		while (p1->pNext!=p->head)
		{
			
			if (p1->data == data)
			{
				p2->pNext = p1->pNext;
				p1->pNext->pPre = p2;
				free(p1);
				return;

			}
			else
			{
				p2 = p1;
				p1 = p1->pNext;
			}

		}
		if (p1->data == data)
		{
			p2->pNext = p1->pNext;
			p1->pNext->pPre = p2;
			p->tail = p1->pPre;
			free(p1);
			return;

		}
	}
	
	 


}
void inserthead(Dlist *p, int data, int newdata)
{
	PNODE pnew = malloc(sizeof(NODE));
	pnew->data = newdata;
	pnew->pNext = NULL;
	pnew->pPre = NULL;

	if (p->head==NULL&&p->tail==NULL)
	{
		printf("inserthead error");
	}
	else if (p->head==p->tail)
	{
		if (p->head->data==data)
		{
			pnew->pNext = p->head;
			pnew->pPre = p->head;

			p->head->pNext = pnew;
			p->head->pPre = pnew;

			p->head = pnew;
			p->tail = pnew->pPre;
		}
	}
	else
	{
		
		
			PNODE p1 =p->head, p2 = p1->pPre;
			while (p1->pNext!=p->head)
			{
				if (p1->data==data)
				{
					pnew->pNext = p1;
					pnew->pPre = p2;

					p2->pNext = pnew;
					p1->pPre = pnew;
					
					p->head = pnew;
					return;
				}
				else
				{
					p2 = p1;
					p1 = p1->pNext;
				}
			}
			if (p1->data == data)
			{
				pnew->pNext = p1;
				pnew->pPre = p2;

				p2->pNext = pnew;
				p1->pPre = pnew;
				return;
			}
		
	}
	
	

}








void insertback(Dlist *p, int data, int newdata)
{
	PNODE pnew = malloc(sizeof(NODE));
	pnew->data = newdata;
	pnew->pPre = NULL;
	pnew->pPre = NULL;
	if (p->head==NULL&&p->tail==NULL)
	{
		printf("insertback error");

	}
	else if(p->head==p->tail)
	{
		if (p->head->data==data)
		{
			p->head->pNext = pnew;
			pnew->pNext = p->tail;

			p->tail->pPre = pnew;
			pnew->pPre = p->head;
			
			p->tail = pnew;
		}

	}
	else
	{
		PNODE p1 = p->head,p2=p1->pNext;
		while (p1->pNext!=p->head)
		{
			if (p1->data == data)
			{
				p1->pNext = pnew;
				pnew->pNext = p2;

				p2->pPre = pnew;
				pnew->pPre = p1;
				return;
				
				
			}
			else
			{
				p1 = p2;
				p2 = p2->pNext;
			}
			
		}
		if (p1->data == data)
		{
			p1->pNext = pnew;
			pnew->pNext = p2;

			p2->pPre = pnew;
			pnew->pPre = p1;

			p->tail = pnew;
			return;


		}
		
	}





}

main.c

#include"list.h"

void main()
{
	Dlist dlist;
	init(&dlist);
	

	adddataback(&dlist, 1);
	adddatahead(&dlist, 5);
	adddatahead(&dlist, 6);
	adddatahead(&dlist, 7);
	adddatahead(&dlist, 8);

	printf("\n\n\n");
	showall(&dlist);

	deletedata(&dlist, 1);
	printf("\n\n\n");
	showall(&dlist);

	inserthead(&dlist, 8, 9);
	printf("\n\n\n");
	showall(&dlist);

	insertback(&dlist, 8, 10);
	printf("\n\n\n");
	showall(&dlist);

	


	
	


	system("pause");
}

猜你喜欢

转载自blog.csdn.net/haku_yyf/article/details/79825649
今日推荐