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;).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章