目录:
单链表的概念⭐:
链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。
单链表的优缺点⭐:
优点:适合头插头删,按需进行扩容释放
缺点:不适合中间插入删除
意义:作为学习复杂数据结构的子结构(图的邻接表,哈希桶)
OJ题很多,再今后的笔试中考到概率也较大
代码实现🚕:
最基本的单链表实现🌈:
typedef int SLTDataType;
typedef struct SLTistNode
{
int data; //val
struct SListNode* next; //存储下一个节点的地址
}SListNode, SLN;
SListNode* slist = NULL;
SListNode* n1 = malloc(sizeof(SListNode));
SListNode* n2 = malloc(sizeof(SListNode));
SListNode* n3 = malloc(sizeof(SListNode));
slist = n1;
n1->data = 1;
n2->data = 2;
n3->data = 3;
n1->next = n2;
n2->next = n3;
n3->next = NULL;
代码声明结构体定义🌈:
typedef int SLTDataType;
typedef struct SLTistNode
{
int data; //val
struct SListNode* next; //存储下一个节点的地址
}SListNode, SLN;
void SListNodePrint(SListNode* phead);
void SListPushBack(SListNode** pphead, SLTDataType x);//尾插
void SListPushFront(SListNode** pphead, SLTDataType x);//头插
void SListPopBack(SListNode** pphead); //尾删
void SListPopFront(SListNode** pphead); //头删
SListNode* SListFind(SListNode* phead, SLTDataType x);
void SListInsert(SListNode** pphead, SListNode* pos, SLTDataType x);//pos之前插入
void SListInsertAfter(SListNode* pos, SLTDataType x);// pos之后插入
void SListErase(SListNode** pphead, SListNode* pos);//pos删除
void SListEraseAfter(SListNode* pos); //pos后删除
void SListDestroy(SListNode** pphead); //清空
打印函数🌈
/*这里用assert断言过于暴力导致程序直接停止,链表是可能为空的,如果有判断需求可以用if来判断*/
SListNode* cur = phead;
while(cur)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
扩容函数🌈
//接收x的值,开辟一个新空间将x放入再返回
SListNode* BuySListNode(SLTDataType x)
{
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
if(newnode == NULL)
{
printf("malloc fail!");
exit(-1);
}
else
{
newnode->data = x;
newnode->next = NULL;
}
return newnode;
}
尾插尾删函数🌈
void SListPushBack(SListNode** pphead, SLTDataType x)
{
assert(pphead);
SListNode* newnode = BuySListNode(x);
if(*pphead == NULL)
{
*pphead = newnode;
}
else
{
//遍历一遍找尾
SListNode* tail = *pphead;
while(tail->next)
{
tail = tail->next;
}