单链表的基本操作

线性表:n个相同类型的数据元素的有限序列
第一个元素没有直接前驱,最后一个元素没有直接后继,除此之外每个数据元素都已一个直接前驱和直接后继

线性表的存储结构:顺序存储和链式存储
顺序存储:用一组地址连续的存储单元依次存放线性表的各个元素
链式存储:用一组任意的存储单元来存放线性表的结点

单链表的基本操作:

#ifndef Link_h__
#define Link_h__

typedef int datatype;
typedef struct _NODE
{
	datatype num;
	struct _NODE *next;
}NODE, *PNODE;

//增加结点
void InsertNode(PNODE *pNode, datatype value);

//前插节点
void InsertHead(PNODE *pNode, datatype value);

//删除结点
void DeleteNode(PNODE *pNode, int value);

//查询节点
NODE *SearchNode(NODE *pNode, int value);

//修改结点的值
int ChangeNodeNum(PNODE *pNode, datatype oldnum, datatype newnum);

//显示所有结点的值
void ShowNodeNum(NODE *pNode);

//链表的逆转
NODE *Reserve(PNODE pNode);

//链表的排序
void Sort(PNODE pNode);

//删除头结点
void DeleteHead(PNODE *pHead);
#endif // Link_h__


以上函数的实现:

#include "Link.h"

//增加结点
void InsertNode(PNODE *pNode, datatype value)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	pNew->num = value;
	pNew->next = NULL;

	if (*pNode == NULL)
	{
		*pNode = pNew;
	}
	else
	{
		NODE *p = *pNode;
		while (p->next != NULL)
		{
			p = p->next;
		}
		p->next = pNew;
	}
}

//前插节点
void InsertHead(PNODE *pNode, datatype value)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	pNew->num = value;
	pNew->next = NULL;

	if (NULL == (*pNode))
	{
		*pNode = pNew;
	}
	else
	{
		pNew->next = (*pNode);
		(*pNode) = pNew;
	}
}

//删除结点
void DeleteNode(PNODE *pNode, int value)
{
	NODE *pValue = (*pNode);
	NODE *pPrev = NULL;

	while (pValue != NULL)
	{
		while (pValue != NULL && pValue->num != value)
		{
			pPrev = pValue;
			pValue = pValue->next;
		}

		if (NULL == pValue)
		{
			break;
		}
		if (NULL == pPrev)
		{
// 			DeleteHead(pNode);
// 			pValue = *pNode;

			PNODE pPos = *pNode;
			*pNode = pPos->next;
			free(pPos); 
			pPos = NULL;
			pValue = *pNode;
		}
		else
		{
			pPrev->next = pValue->next;
			free(pValue);
			pValue = NULL;
		}
	}
}

//删除头结点
void DeleteHead(PNODE *pHead)
{
	if (*pHead != NULL)
	{
		PNODE pPos = *pHead;
		*pHead = pPos->next;
		free(pPos);
		pPos = NULL;
	}
}

//查询节点
NODE *SearchNode(NODE *pNode, int value)
{
	PNODE pHead = pNode;

	while (pHead != NULL)
	{
		if (value == pHead->num)
		{
			return pHead;
		}
		pHead = pHead->next;
	}
	return NULL;
}

//修改结点的值
int ChangeNodeNum(PNODE *pNode, datatype oldnum, datatype newnum)
{
	PNODE pHead = *pNode;

	while (pHead != NULL)
	{
		if (pHead->num == oldnum)
		{
			pHead->num = newnum;
			return 1;
		}
		pHead = pHead->next;
	}
	return 0;
}

//显示所有结点的值
void ShowNodeNum(NODE *pNode)
{
	while (pNode != NULL)
	{
		printf("%d, ", pNode->num);
		pNode = pNode->next;
	}
	printf("\b\b  \n");
}

//链表的逆转
NODE *Reserve(PNODE pNode)
{
	if (NULL == pNode || NULL == pNode->next)
	{
		return pNode;
	}

	NODE *p1 = pNode;
	NODE *p2 = p1->next;
	NODE *p3 = NULL;

	while (p2 != NULL)
	{
		p3 = p2->next;
		p2->next = p1;
		p1 = p2;
		p2 = p3;
	}

	pNode->next = NULL;
	pNode = p1;

	return pNode;
}

//链表的排序
void Sort(PNODE pNode)
{
	for (PNODE p1 = pNode; p1 != NULL; p1 = p1->next)
	{
		for (PNODE p2 = pNode; p2 != NULL; p2 = p2->next)
		{
			if (p1->num > p2->num)
			{
				NODE Temp;
				Temp.num = p1->num;
				p1->num = p2->num;
				p2->num = Temp.num;
			}
		}
	}
}

测试代码:

#include "Link.h"

int main(void)
{
	NODE *Head = NULL;

	InsertNode(&Head, 5);
	InsertNode(&Head, 6);
	InsertNode(&Head, 7);
	InsertNode(&Head, 8);
	InsertNode(&Head, 9);
	InsertHead(&Head, 4); 
	InsertHead(&Head, 3);
	InsertHead(&Head, 2);
	InsertHead(&Head, 1);

	/*
	NODE *pFind = SearchNode(Head, 4);
	printf("找到的数为%d, 地址为%x\n", pFind->num, pFind);
	*/

	/*
	int result = ChangeNodeNum(&Head, 3, 100);
	if (1 == result)
	{
		printf("修改成功\n");
	}
	else
	{
		printf("修改失败\n");
	}
	*/
	
	ShowNodeNum(Head);

	DeleteNode(&Head, 1);
	ShowNodeNum(Head);

	/*
	Sort(Head);
	ShowNodeNum(Head);
	*/

	/*
	PNODE p = Reserve(Head);
	ShowNodeNum(p);
	*/

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值