Bootstrap

数据结构——单链表(C语言写法)

目录:

单链表的概念⭐:

链表是一种物理存储结构上非连续非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。

image-20220320170844970

单链表的优缺点⭐:

优点:适合头插头删,按需进行扩容释放

缺点:不适合中间插入删除

意义:作为学习复杂数据结构的子结构(图的邻接表,哈希桶)

​ 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;
        }
  
;