c语言(链表代码分析)

先谈谈链表的基本概念,这个是对这个链表概念的加深

/*把链表设置为空*/
void InitializeList(List*plist)
{
	*plist = NULL;
}
/*如果链表为空,返回true*/
bool ListIsEmpty(const List*plist)
{
	if (*plist == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

/*如果链表已满,返回true*/
bool ListIsFull(const List*plist)
{
	Node * pt;
	pt = (Node*)malloc(sizeof(Node));
	bool full;

	if (pt == NULL)
	{
		full = true;
	}
	else
	{
		full = false;
	}

	free(pt);
	return full;
}

/*返回节点的数量*/
unsigned int ListItemCount(const List*plist)
{
	unsigned int count = 0;
	Node* pnode = *plist;
	while (pnode != NULL)
	{
		count++;
		pnode = pnode->next;
	}
	return count;
}

这个是对链表的操作----自认为可以当做链表属性的操作

  1. 链表的初始化-------通过使指向链表的指针(plist)为空来实现.
  2. 链表是否满了----------通过创建一个指向节点的指针(pt),看能否为此指针分配指向节点的空间来判断.
  3. 链表是否为空------------通过判断指向链表的指针(plist)所指向的内容(*plist)是否为空来判断.
/*创建存储项的节点,并将其太能加到链表中*/
bool AddItem(Item item, List*plist)
{
	Node *pnew ;
	Node *scan = *plist;

	pnew = (Node*)malloc(sizeof(Node));

	if (pnew == NULL)
		return false;

	CopyToNode(item, pnew);
	pnew->next = NULL;

	if (scan == NULL)
	{
		*plist = pnew;
	}
	else
	{
		while (scan->next!=NULL)
		{
			scan = scan->next;
		}
		scan->next = pnew;
	}

	return true;

}

/*访问每一个节点,并执行pfun指向的函数*/

void Traverse(const List *plist, void(*pfun)(Item item))
{
	Node *pnode = *plist;
	while (pnode != NULL)
	{
		(*pfun)(pnode->item);
		pnode = pnode->next;
	}
}

/*释放由malloc()分配的内存*/

void EmptyTheList(List * plist)
{
	Node* psave;

	while (*plist !=NULL)
	{
		psave = (*plist)->next;
		free(*plist);
		*plist = psave;
	}
}

链表的方法:

1. 添加项(也就是添加节点):通过使用操作链表的指针(头指针尾指针,"current"指针)来实现
具体实现步骤
(1)声明两个指针:一个指向链表地址(Node *scan = *plist;),一个指针作为"current"(Node *pnew 😉
(2)对"current"指针进行初始化(分配空间,初始化)—这里定义了一个辅助函数

/*------------------------------局部函数定义--------------------------*/
static void CopyToNode(Item item, Node*pnode)
{
	pnode->item = item;
}

这个是让节点中的成员变量(pnode->item)去指向要添加的项(项就是结构typedef后的结果)
(3)对链表的判断—如果链表没创建,那就让链表的地址(*plist )去指向"current"指针,从而达到将链表的第一项就是这个指针指向的项;如果链表已经创建,那就去找链表的最后一项(scan = scan->next;) ((scan->next!=NULL)),然后最后一项的"小尾巴"指向"current"指针.

2.用函数作用:用函数作用于新节点中的项,用新节点指针去指向链表中的节点
(1)创建新节点指针,指向链表的地址(Node *pnode = *plist;)(*plist是指针,并不是值)
(2)让函数作用于节点中的项((*pfun)(pnode->item)😉
(3)连续性:让这个指针去指向"current节点"的地址(pnode = pnode->next;)
*3.释放链表内存:用free去作用,需要注意要保护节点的小尾巴(psave = (plist)->next;).

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bussyman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值