/*把链表设置为空*/
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;
}
这个是对链表的操作----自认为可以当做链表属性的操作
- 链表的初始化-------通过使指向链表的指针(plist)为空来实现.
- 链表是否满了----------通过创建一个指向节点的指针(pt),看能否为此指针分配指向节点的空间来判断.
- 链表是否为空------------通过判断指向链表的指针(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;).