C 線性表的鏈式存儲實現及插入、刪除等操作示例

一、鏈式存儲的優勢

線性表的存儲可以通過順序存儲或鏈式存儲實現,其中順序存儲基於數組實現(見本人上一篇博客),在進行插入刪除等操作時,需對錶內某一部分元素逐個移動,效率較低。而鏈式結構不依賴於地址連續的存儲空間,可以克服數組表現線性表的缺陷。

二、基於鏈式存儲線性表的基本操作

2.1 PtrToLNode Creat(int length):創建一個長度爲length的線性表

//創建長度爲length的鏈表
PtrToLNode Creat(int length)
{
	PtrToLNode pHead = (PtrToLNode)malloc(sizeof(struct LNode));//鏈表頭
	PtrToLNode p0 = pHead;//新創建鏈表節點地址
	PtrToLNode p1 = pHead;//鏈表尾節點地址
	p0->Data = 0;
	int i = 1;
	for (i = 1; i < length; i++)
	{
		p0 = (PtrToLNode)malloc(sizeof(struct LNode));
		p0->Data = i;
		p1->pNext = p0;//新創建節點的首地址是上一節點的pNext
		p1 = p0;//更新尾節點
	}
	p1->pNext = NULL;//最後有一個節點的pNext爲NULL
	return pHead;
}

2.2 int Length(PtrToLNode ptr):求表頭爲ptr的鏈表的長度

//求表長
int Length(PtrToLNode ptr)
{
	int len = 0;
	while (ptr != NULL)
	{
		len++;
		ptr = ptr->pNext;
	}
	return len;
}

3.3 int FindKth(PtrToLNode ptr, int n):求表頭爲ptr的鏈表第n個結點的Data值

//求第n個結點的Data
int FindKth(PtrToLNode ptr, int n)
{
	if (n > Length(ptr))
	{
		printf("該節點不在鏈表範圍內");
		system("pause");
		return -1;
	}
	int i = 1;
	for (i = 1; i < n; i++)
	{
		ptr = ptr->pNext;
	}
	int result = ptr->Data;
	return result;
}

3.4 int Find(PtrToLNode ptr, int num):求表頭爲ptr的鏈表中第一個Data值爲num的節點的序號

//求鏈表中第一個Data值爲num的節點的序號
int Find(PtrToLNode ptr, int num)
{
	int n = 1;//序號從1開式計
	while (ptr->Data != num && n <= Length(ptr))
	{
		n++;
		ptr = ptr->pNext;
	}
	if (n > Length(ptr))
	{
		printf("該鏈表內無Data爲%d的節點\n", num);
		system("pause");
		return -1;
	}
	return n;
}

3.5 PtrToLNode Insert(PtrToLNode ptr, int n, int num):在第n個節點處插入Data值爲num的節點

//在第n個節點處插入Data值爲num的節點
PtrToLNode Insert(PtrToLNode ptr, int n, int num)
{
	PtrToLNode head = ptr;
	if (n > Length(ptr) + 1)
	{
		printf("請重新輸入插入位置");
		system("pause");
		return NULL;
	}
	if (n == 1)//n=1即插入新的表頭
	{
		PtrToLNode pNewHead = (PtrToLNode)malloc(sizeof(struct LNode));
		pNewHead->Data = num;
		pNewHead->pNext = ptr;
		return pNewHead;
	}
	int i = 1;
	for (i = 1; i < n-1; i++)//找出第n-1個節點的首地址
	{
		ptr = ptr->pNext;
	}
	PtrToLNode pTem = ptr->pNext;
	PtrToLNode pNew = (PtrToLNode)malloc(sizeof(struct LNode));
	pNew->Data = num;
	ptr->pNext = pNew;
	pNew->pNext = pTem;
	return head;
}

3.6 PtrToLNode Delete(PtrToLNode ptr, int n):刪除第n個節點

//刪除第n個節點
PtrToLNode Delete(PtrToLNode ptr, int n)
{
	PtrToLNode head = ptr;
	if (n > Length(ptr))
	{
		printf("請重新輸入刪除位置");
		system("pause");
		return NULL;
	}
	if (n == 1)
	{
		PtrToLNode pNewHead = ptr->pNext;
		free(ptr);//注意將刪除的節點free掉
		return pNewHead;
	}
	int i = 1;
	for (i = 1; i < n - 1; i++)//找出第n-1個節點的首地址
	{
		ptr = ptr->pNext;
	}
	PtrToLNode pTem = (ptr->pNext)->pNext;
	free(ptr->pNext);
	ptr->pNext = pTem;
	return head;
}

注:本程序中節點序號都是從1計起

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