自己用C语言结构体实现一个环形链表(增删查改)

环形链表.h

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




typedef struct Linknode
{
	int data;
	struct Linknode *pNext;

}node, *PNODE;//node结构体变量,PNODE代表一个指针指向结构体

PNODE addback(PNODE phead, int data);//尾部插入
PNODE addfront(PNODE phead, int data);
PNODE changedata(PNODE phead, int data, int newdata);
PNODE deletedata(PNODE phead, int data);//删除
PNODE insertback(PNODE phead, int data, int newdata);
PNODE inserthead(PNODE phead, int data, int newdata);

PNODE findfirst(PNODE phead, int data);//查找的数据

void showall(PNODE phead);

环形链表.c

#include"环形链表.h"

PNODE addback(PNODE phead, int data)//尾部插入
{
	PNODE pnew = malloc(sizeof(node));
	pnew->data = data;//分配空间
	if (phead==NULL)
	{
		phead = pnew;
		pnew->pNext = phead;//一个节点的环

	}
	else
	{
		//循环到尾部
		PNODE p = phead;
		while (p->pNext!=phead)
		{
			p = p->pNext;

		}
		p->pNext = pnew;//连接上新的
		pnew->pNext = phead;//链道开头
	}
	return phead;

}
PNODE addfront(PNODE phead, int data) //头部插入
{
	PNODE pnew = malloc(sizeof(node));
	pnew->data = data;
	if (phead==NULL)
	{
		phead = pnew;
		pnew->pNext = phead;

	}
	else
	{
		PNODE p = phead;
		while (p->pNext!=phead)
		{
			p = p->pNext;

		}
		p->pNext = pnew;
		pnew->pNext = phead;
		phead = pnew;
	}
	return phead;
	



}

void showall(PNODE phead) //展示
{
	if (phead==NULL)
	{
		return;

	}
	else if (phead->pNext==phead)
	{
		printf("%d %p %p\n", phead->data, phead, phead->pNext);//打印一个节点的情况
	}
	else
	{
		PNODE p = phead;
		while (p->pNext!=phead)
		{

			printf("%d %p %p\n", p->data, p, p->pNext);
			p = p->pNext;//循环

		}
		printf("%d %p %p\n", p->data, p, p->pNext);
	}
	

}

PNODE findfirst(PNODE phead, int data)//查找
{
	if (phead==NULL)
	{
		return NULL;

	}
	else if(phead->pNext==phead)
	{
		if (phead->data==data)
		{
			return phead;
		}
		else
		{
			return NULL;
		}

	}
	else
	{
		PNODE p = phead;
		while (p->pNext!=phead)
		{
			if (p->data==data)
			{
				return p;
			}
			p = p->pNext;//循环

		}
		if (p->data==data)
		{
			return p;
		}
		return NULL;
	}




}

PNODE deletedata(PNODE phead, int data)//删除
{

	PNODE p1 = NULL;
	PNODE p2 = NULL;
	p1 = phead;
	if (p1->data==data)
	{
		 p2 = phead;
		while (p1->pNext!=phead)
		{
			p1 = p1->pNext;
		}
		p1->pNext = phead->pNext;
		free(p2);
		phead = p1->pNext;
		return phead;
	}
	else
	{
		while (p1->pNext!=phead)
		{
			if (p1->data==data)
			{
				p2->pNext = p1->pNext;
				free(p1);
				return phead;

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

		}
		if (p1->data==data)
		{
			p2->pNext = p1->pNext;
			free(p1);
			return phead;
		}
	}
	



}

PNODE changedata(PNODE phead, int data,int newdata)	//修改
{
	if (phead==NULL)
	{
		printf("changedata error");

	}
	else if (phead->pNext == phead)
	{
		if (phead->data==data)
		{
			phead->data = newdata;
		}
		else
		{
			printf("changedata error");
		}
			
	}
	else
	{
		PNODE p = phead;
		while (p->pNext!=phead)
		{
			if (p->data==data)
			{
				p->data = newdata;
				
			}
			p = p->pNext;

		}
		if (p->data == data)
		{
			p->data = newdata;
			
		}
		

	}

	return phead;
}

PNODE insertback(PNODE phead, int data,int newdata)	//后插
{
	PNODE pnew = malloc(sizeof(node));
	pnew->data = newdata;
	if (phead->pNext==phead)
	{
		if (phead->data==data)
		{
			phead->pNext = pnew;
			pnew->pNext = phead;
			return phead;

		}

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

			}
			else
			{
				p = p->pNext;
			}

		}
		if (p->data == data)
		{
			pnew->pNext = p->pNext;
			p->pNext = pnew;
			return phead;

		}
	}
	


}

PNODE inserthead(PNODE phead, int data, int newdata)//前插
{
	PNODE pnew = malloc(sizeof(node));
	pnew->data = newdata;
	if (phead->pNext==phead)
	{
		if (phead->data==data)
		{
			pnew->pNext = phead;
			phead->pNext = pnew;
			phead = pnew;
			return phead;

		}
		

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

		}
		else
		{
			PNODE p1=phead,p2 = NULL;
			while (p1->pNext != phead)
			{
				if (p1->data == data)
				{
					pnew->pNext = p1;
					p2->pNext = pnew;
					return phead;

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

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

			}

		}
		
	
	}




}

main.c

#include"环形链表.h"

void main()
{
	//printf("%d,%d", sizeof(node), sizeof(PNODE));
	PNODE phead = NULL;//头结点

	for (int i = 0; i < 10; i++)
	{
		phead = addback(phead, i);//插入数据
	}
	phead = addfront(phead, 11);
	phead= changedata(phead, 8,12);
	phead = deletedata(phead, 12);
	phead = insertback(phead, 7,12);
	phead = inserthead(phead, 11, 99);
	phead = inserthead(phead, 99, 100);
	phead = inserthead(phead, 9, 101);
	showall(phead);


	system("pause");

}

猜你喜欢

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