本文小編為大家詳細介紹“C語言數據結構之單鏈表怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C語言數據結構之單鏈表怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在學習鏈表以前,我們存儲數據用的方式就是數組。使用數組的好處就是便于查找數據,但缺點也很明顯。
使用前需聲明數組的長度,一旦聲明長度就不能更改
插入和刪除操作需要移動大量的數組元素,效率慢
只能存儲一種類型的數據.
為了解決上述的問題,我們就可以使用鏈表來存儲數據。
概念:鏈表是一種物理存儲結構上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的

結點:鏈表中每一個元素稱為“結點”,每個結點都應包括兩個部分:一為用戶需要用的實際數據;二為下一個結點的地址,
頭結點:在單鏈表的第一個結點之前附設一個結點,這個節點不存儲數據,稱之為頭結點

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDateType; //鏈表中存儲的數據類型,可換成其他
typedef struct SListNode
{
SLDateType date;
struct SListNode* next; //指向下一個節點的指針
}SListNode;SListNode* BuyListNode(SLDateType x)
{
SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));
if (NULL == newNode)
{
printf("malloc error\n"); //內存開辟失敗
exit(-1);
}
else
{
newNode->date = x; // 給新節點賦值
newNode->next = NULL;
}
return newNode;
}void SListPushFront(SListNode** pphead/*要改動頭指針,所以要傳遞二級指針*/, SLDateType x)
{
SListNode* newNode = BuyListNode(x); //申請節點
newNode->next = *pphead;
*pphead = newNode;
}
void SListPushBack(SListNode** pphead, SLDateType x)
{
SListNode* newNode = BuyListNode(x);
if (*pphead == NULL) //若頭指針為空,則鏈表為空鏈表,直接將新節點接到頭指針后
{
*pphead = newNode;
}
else
{
SListNode* tail = *pphead;
while (tail->next != NULL) //找鏈表的尾部
{
tail = tail->next;
}
tail->next = newNode;//將新節點接到尾部
}
}
void SListPopBack(SListNode** pphead)
{
assert(pphead);
if (*pphead == NULL)//鏈表為空,則不進行任何操作
{
return;
}
else if ((*pphead)->next == NULL) //鏈表只有一個節點
{
free(*pphead);
*pphead = NULL;
}
else//其余情況
{
SListNode* tail = *pphead; //鏈表的尾部節點
SListNode* pre = NULL;//鏈表尾的前一個節點
while (tail->next != NULL)//找尾
{
pre = tail;
tail = tail->next;
}
pre->next = tail->next; //將尾節點的指針域賦值給前一個節點的指針域
free(tail);
}
}
void SListPopFront(SListNode** pphead)
{
assert(pphead);
if (*pphead == NULL) //鏈表為空什么也不做
{
return;
}
else
{
SListNode* head = *pphead;//記錄原本的第一個節點
*pphead = head->next; //讓頭指針指向第二個節點
free(head);//釋放第一個節點
}
}
SListNode* SListFind(SListNode* phead, SLDateType x)
{
SListNode* cur = phead;
while (cur != NULL)
{
if (cur->date == x) //找到則返回該節點
{
return cur;
}
cur = cur->next;
}
return NULL; //未找到則返回空
}void SListInsert(SListNode** pphead, SListNode* pos/*要插入的位置*/, SLDateType x)
{
assert(pphead);
assert(pos);
if (*pphead == pos)
{
SListPushFront(pphead, x);
}
else
{
SListNode* cur = *pphead; //當前所指向的位置
SListNode* pre = NULL; //前一個節點
while (cur != pos)
{
pre = cur;
cur = cur->next;
}
SListNode* newNode = BuyListNode(x);
pre->next = newNode;
newNode->next = cur;
}
}void SListErase(SListNode** pphead, SListNode* pos/*要插入的位置*/)
{
assert(pphead);
assert(pos);
if (*pphead == pos)
{
SListPopFront(pphead);
}
else
{
SListNode* cur = *pphead;
SListNode* pre = *pphead;
while (cur != pos)
{
pre = cur;
cur = cur->next;
}
pre->next = cur->next;
free(cur);
}
}void SListDestory(SListNode** pphead)
{
if (*pphead == NULL)
{
return;
}
else
{
while (*pphead != NULL)
{
SListNode* cur = *pphead;
*pphead = cur->next;
free(cur);
}
}
}讀到這里,這篇“C語言數據結構之單鏈表怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。