C语言——链表实现

前言

开发过程中需要实现一个fifo,使用单向链表方式进行完成;linux自带list,但是和使用灵活度不高,因此决定自己实现一个链表来完成fifo的操作;

注意事项

单向链表其实更合适堆的结构,先进后出;但是我的使用场景深度不会很深,因此使用单向链表+尾部插入的方式就可以简单的实现fifo;

代码实现

点击查看代码
typedef struct _NODE_S
{
	int u32Val;
	struct _NODE_S *pstNext;
}NODE_S;

NODE_S* LIST_CreateNode(int u32Val)
{
	NODE_S *pstNodeTmp = (NODE_S*)malloc(sizeof(NODE_S));
	pstNodeTmp->u32Val = u32Val;
	pstNodeTmp->pstNext = NULL;
	return pstNodeTmp;
}
void LIST_Write(NODE_S *pstHead, NODE_S *pstNew)
{
	while (pstHead->pstNext != NULL)
	{
		pstHead = pstHead->pstNext;
	}
	pstHead->pstNext = pstNew;
}
int LIST_CheckNull(NODE_S *pstHead)
{
	if (pstHead->pstNext == NULL)
	{
		printf("list is null \n");
		return 1;
	}	
	else
		return 0;
}
int LIST_Read(NODE_S *pstHead)
{
	if (LIST_CheckNull(pstHead)) return -1;
	int u32Val = pstHead->pstNext->u32Val;
	NODE_S *pstFreeTmp = pstHead->pstNext;
	pstHead->pstNext = pstHead->pstNext->pstNext;
	free(pstFreeTmp);
	return u32Val;
}
void LIST_Print(NODE_S *pstHead)
{
	do{
		printf("Val = %d,\n", pstHead->u32Val);
		pstHead = pstHead->pstNext;
	} while (pstHead != NULL);
}

int main()
{
	NODE_S *pstListHead = LIST_CreateNode(0);
	unsigned int u32Val;
	LIST_Write(pstListHead, LIST_CreateNode(1));
	LIST_Write(pstListHead, LIST_CreateNode(2));
	LIST_Print(pstListHead);
	LIST_Write(pstListHead, LIST_CreateNode(3));
	LIST_Print(pstListHead);
	LIST_Write(pstListHead, LIST_CreateNode(5));
	LIST_Print(pstListHead);

	u32Val = LIST_Read(pstListHead);
	printf("u32Val = %d \n", u32Val);

	u32Val = LIST_Read(pstListHead);
	printf("u32Val = %d \n", u32Val);

	u32Val = LIST_Read(pstListHead);
	printf("u32Val = %d \n", u32Val);

	u32Val = LIST_Read(pstListHead);
	printf("u32Val = %d \n", u32Val);

	u32Val = LIST_Read(pstListHead);
	printf("u32Val = %d \n", u32Val);

	LIST_Print(pstListHead);

	while (1);
	return 0;
}
posted @ 2021-11-04 11:10  爱喝拿铁  阅读(131)  评论(0)    收藏  举报