2024年C C++最全单链表的基本操作(头结点)_头结点算位序吗,35岁的程序员被裁

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

//特定下标处插入值
bool insert(LinkList *head, int pos, ElemType val)
// 删除某个节点
bool listDelete(LinkList *head, int pos)


在某个特定下标处插入一个结点或者删除一个结点。插入值时需要找到pos-1处,将新的结点尾插;删除结点时找到pos-1处,使其指向pos的next,同时释放pos处结点。   
 其实单链表“位序”的概念已淡化,这里只是将其实现,加深对单链表的理解。



//1.判断非空 2.删除头结点之后第一个结点
void pop_front(LinkList *head)
//1.判断非空 2.删除倒数第一个结点
void pop_back(LinkList *head)


无论是尾删还是头删,首先要考虑链表是否为空,然后找到相应的位置删除结点。   
 通过上面四个函数的实现,我们可以发现插入和删除时,最重要的是找到指向想要位置的前驱,而并不是指向想要位置的指针。比如pop\_back()函数,虽然我们想要删除尾结点,但最重要的是找到倒数第二个结点,这里我们通过一个临时变量寄存。



//单链表中数据节点的个数
int listLength(LinkList *head)
//链表是否为空
bool is_empty(LinkList *head)
//升序排序
void sort(LinkList *head)
//查找值
LNode* find(LinkList *head, ElemType key)
//仅显示,不修改
void showList(LinkList head)


这些函数都很简单,这里都不详述。   
 综上,我们可以看到,单链表的优势在于插入和删除。如果实现随机访问,元素个数等,链表就要诸多不便了。


#### 三、代码


再次重申,本篇文章对单链表的操作都是在建立**头结点**的基础上,就像一个火车头和后面多节车厢一样,无论后面车厢如何添加、删除,我们的火车头永远是“固定”的。



#include <stdio.h>
#include <assert.h>
#include <malloc.h>

#define ElemType int

typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;

typedef LNode* LinkList;

//创建一个头结点
void InitList(LinkList *head)
{
*head = (LNode *)malloc(sizeof(LNode));
assert(*head != NULL);

(\*head)->next = NULL;

}

//头插法建立单链表
void createListH(LinkList *head)
{
for(int i=1;i<=10;i++)
{
LNode *s = (LNode *)malloc(sizeof(LNode)); //s为新创建结点
assert(s!=NULL);

    s->data = i;
    s->next = (\*head)->next;

    (\*head)->next = s;
}

}

//尾插法建立单链表
void createListrR(LinkList *head)
{
LNode *p = *head;

for(int i=1;i<=10;i++)
{
    LNode \*s = (LNode \*)malloc(sizeof(LNode));  //s为新创建结点
    assert(s!=NULL);

    s->data = i;
    s->next = p->next;
    p->next = s;

    p = s; //指向最后一个结点地址
}

}

//单链表中数据节点的个数
int listLength(LinkList *head)
{
LNode *p = *head;

int count=0;

while(p->next != NULL)
{
    p = p->next;
    count ++;
}

return count;

}

//链表是否为空
bool is_empty(LinkList *head)
{
return ((*head)->next == NULL);
}
//升序排序
void sort(LinkList *head)
{
LNode *p,*q;
ElemType temp;

for (p =(\*head)->next; p != NULL; p = p->next)
{
     for (q = p->next; q != NULL; q = q->next)
    {
       if (p->data > q->data)
        {
            temp = q->data;
            q->data = p->data;
            p->data = temp;
        }
    }
}

}

//特定下标处插入值
bool insert(LinkList *head, int pos, ElemType val)
{
int n = 0;
LNode *p = *head;
while (n < pos && p != NULL)
{
n++;
p = p->next;
}
if (n != pos || NULL == p)
{
return false;
}

LNode \*pNew = (LNode \*)malloc(sizeof(LNode));
if (NULL == pNew)
{
    printf("Error in dynamic allocating memory!");
}
pNew->data = val;
pNew->next = p->next;
p->next = pNew;
return true;

}

// 删除某个节点
bool listDelete(LinkList *head, int pos)
{
int n = 0;
LNode *p = *head;

while (n < pos && p != NULL)
{
    n++;
    p = p->next;
}
if (n != pos || NULL == p)
{
    return false;
}
//判断位置合法
if(p->next == NULL)
{
    return false;
}
LNode \*q = p->next;
p->next = p->next->next;
free(q);

return true;

}

LNode* find(LinkList *head, ElemType key)
{
LNode *p = *head;
//为NULL或找到p
while (p != NULL && p->data != key) { p= p->next; }

return p;

}

//1.判断非空 2.删除头结点之后第一个结点
void pop_front(LinkList *head)
{
if((*head)->next == NULL)
{
printf(“error: seqList is empty\n”);
return;
}

LNode \*q = (\*head)->next;

(\*head)->next = q->next;
free(q);

}
//1.判断非空 2.删除倒数第一个结点
void pop_back(LinkList *head)
{
if((*head)->next == NULL)
{
printf(“error: seqList is empty\n”);
return;
}

LNode \*p = \*head;
LNode \*prev = NULL;//存p结点之前的结点
while (p->next != NULL)
{
    prev = p;
    p = p->next;
}
//prev为倒数第二个结点
//p为倒数第一个结点
prev->next = p->next;

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

7883812)]
[外链图片转存中…(img-SAbpGQiF-1715537883812)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值