链表

链表

特征

  • n个节点离散分配。
  • 彼此通过指针相连。
  • 每一个节点只有一个前驱节点,一个后续节点。
  • 首节点没有前驱节点,尾节点没有后续节点。

专业术语:

  • 首节点:第一个有效节点。
  • 尾节点:最后一个有效节点。
  • 头节点:第一个有效节点之前的节点,并不存放有效数据,只是为了方便对指针操作。
  • 头指针:指向头节点的指针变量,对链表进行处理只需要知道头指针
  • 尾指针:指向尾节点的指针变量。

链表的分类

  1. 单链表:每个节点有一个指针域。
  2. 双链表:每个节点有两个指针域,分别指向前一个节点和后一个节点。
  3. 循环链表:能通过一个节点找到所有节点。

链表的实现

链表的定义:

typedef struct Node	//链表的定义
{
	int m_Data;
	struct Node* m_Next;
}Node;

判断链表是否为空的方法:

/*
	Return value:
		链表为空时返回true
	Parameter:
		list:链表的头指针
*/
bool IsEmpty(const Node* const list)	//判断链表是否为空
{
	return list->m_Next == NULL;
}

判断某个节点是否为最后一个节点的方法:

/*
	Return value:
		为最后一个节点时返回true
	Parameter:
		position:需要判断的节点的指针
*/
bool IsLast(const Node* const position)	//判断该节点是否为最后一个节点
{
	return position->m_Next == NULL;
}

查找某个元素的方法:

/*
	Return value:
		返回查找元素的位置
	Parameter:
		data:需要查找的数据
		list:链表的头指针
*/
Node* Find(const int data, const Node* list)	//查找某个元素
{
	Node* position;
	for (position = list->m_Next; position != NULL && position->m_Data!= data; position=position->m_Next);
	return position;
}

查找某个元素的前驱元的方法:

/* 
	Return value:
		  返回指向前驱元的指针
	Parameter:
		data:要查找的元素
		list:链表
*/
Node* FindPrevious(const int data, Node* const list)	//查找某个元素的前驱元
{
	Node* position = list;
	for (; position->m_Next != NULL && position->m_Next->m_Data != data; position = position->m_Next);
	return position;
}

删除某个元素的方法:

/*
	Return value:
		无返回值
	Parameter:
		data:要删除的元素
		list:链表的头指针
*/
void Delete(const int data, Node* const list)	//删除某个元素
{
	Node* previous = FindPrevious(data, list);
	if (!IsLast(previous)) {
		Node* tmp = previous->m_Next;
		previous->m_Next = tmp->m_Next;
		free(tmp);
	}
}

插入某个元素的方法:

/*
	Return value:
		无返回值
	 Parameter:
		data:要添加的元素
		position:元素添加在position之后
*/
void Insert(const int data, Node* position)	//插入某个元素
{
	assert(position);
	Node* tmp = (Node*)malloc(sizeof(Node));
	if (tmp == NULL) {
		return;
	}
	tmp->m_Data = data;
	tmp->m_Next = position->m_Next;
	position->m_Next = tmp;
}

查询节点中数据的方法:

/*
	Return value:
		返回某个节点中的数据
	Parameter:
		position:要查询的节点
*/
int Retrieve(Node* position)	//查询节点中的数据
{

	return position->m_Data;
}

清空链表的方法:

/*
	Return value:
		返回删除数据后的链表头指针
	Parameter:
		list:要删除数据的链表
*/
Node* MakeEmpty(Node* const list)	//清空链表
{
	Node* position = list->m_Next;
	list->m_Next = NULL;
	while (position) {
		Node* tmp = position->m_Next;
		free(position);
		position = tmp;
	}
	return list;
}

删除整个链表的方法:

/*
	Return value:
		返回空指针
	Parameter:
		list:要删除的链表
*/
Node* DeleteList(Node* list)	//删除整个链表
{
	while (list) {
		Node* tmp = list->m_Next;
		free(list);
		list = tmp;
	}
	return list;
}

还可用游标实现,在此不做实现

posted @ 2025-10-13 23:59  单身喵  阅读(3)  评论(0)    收藏  举报