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