C語言 單鏈表的實現

    鏈表由多個節點構成,節點之間可以靈活的插入、刪除。鏈表以結構體的自引用原理,可以在內存中以不連續的方式動態分配內存來存儲數據,這樣的結構體就是鏈表的一個節點。 一個節點分爲兩個域:一個是數據域,一個是指針域,這方便鏈表在存儲數據的同時可以方便地找到下一個節點。

    相比於數組:數組定義相對簡單些,是以連續的內存存儲數據,在定義時就確定了長度,這樣相比於鏈表的動態存儲,數組就存在有可能數據不夠長或內存浪費的缺點。

    對於單鏈表,在此從建立鏈表開始,實現鏈表的增添、刪除和輸出鏈表內容。由於鏈表是動態存儲,節點的內存是基於malloc函數動態分配的,所以刪除節點時或銷燬鏈表時一定記得手動釋放內存,避免內存泄露。

例:

#include <stdio.h>
#include <stdlib.h>
//定義節點類型
typedef struct Node
{
	int data;
	struct Node* next;
}Node;
//創建鏈表
Node* createlb()
{
	Node* head=(Node*)malloc(1*sizeof(Node));
	head->next=NULL;
	return head;

}
//添加節點(從最後添加)
void add_node(Node* head,int _data)
{
	Node* curr=head;
	Node* newnode=(Node*)malloc(1*sizeof(Node));
	newnode->next=NULL;
	newnode->data=_data;
	while(curr->next!=NULL)
	{
		curr=curr->next;
	}
	curr->next=newnode;
}
//輸出鏈表內容
void printlb(Node* head)
{
	Node* curr=head->next;
	while(curr!=NULL)
	{
		printf("%d\n",curr->data);
		curr=curr->next;
	}
}
//刪除節點
void delete_node(Node* head,int old_data)
{
	Node* curr=head->next;
	Node* temp1=head;
	Node* temp2=NULL;
	while(curr!=NULL)
	{
		if(curr->data==old_data)
		{
			temp1->next=curr->next;
			temp2=curr;
			free(temp2);
			temp2=NULL;
		}
		else
		{
			temp1=temp1->next;
		}
		curr=curr->next;
	}
}
//釋放節點
void freelb(Node* head)
{
	Node* curr=head->next;
	Node* temp=head;
	while(curr!=NULL)
	{
		curr=curr->next;
		free(temp);
		temp=NULL;
		temp=curr;
	}
	head=NULL;
}
int main(int argc, char const *argv[])
{
	Node* head=createlb();
	int i;
	for(i=0;i<10;i++)
	{
		add_node(head,i+1);
	}
	add_node(head,3);
	add_node(head,3);
	printlb(head);

	printf("\n");
	delete_node(head,3);
	delete_node(head,1);
	printlb(head);
	freelb(head);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章