【C语言 数据结构自学笔记】—— 单链表

[自学笔记] 基于C语言的数据结构

第一节 单链表

  • 线性表:

    1. 有限的序列。
    2. 序列中的每个元素都有唯一的前驱和后继。
  • 顺序表:分配一块连续的内存去存放这些元素,例如数组

  • 链表:内存不是连续的,元素会各自被分配一块内存,内存和内存之间用指针相连。

  • 单链表操作:

    • 增加:

      1. 头插法:

        在链表的最头部插入一个单元,只需要将该单元的Next指向下一个单元的地址即可

      2. 尾插法:

      ​ 在链表的结尾插入一个单元,首先需要将该单元指向NULL,还要将原本链表的结尾指向该单元的地址,完成链表的衔接。

    • 删除:

      ​ 删除一个节点,首先要将想要删除的节点的前一个节点的next指向想要删除的节点的后继,之后释放(free)掉该节点的内存占用。

  • 代码实现

#include "stdio.h"
#include "stdlib.h"

//定义一个链表的基本单元的结构体
typedef struct Node {
    int data;
    struct Node* next; //定义一个指向Node类型的指针next
} Node;

//初始化一个链表,无节点,指向空
Node* initList(){
    Node* list = (Node*)malloc(sizeof(Node));//定义一个指向Node大小空间地址的一个指针,新建一个空间
    list -> data = 0;//该链表中元素的个数
    list -> next = NULL;
    return list;
}

//头插法
void headInsert(Node*list , int data){
    Node* node = (Node*)malloc(sizeof(Node));
    node -> data = data;
    node -> next = list -> next;//该节点指向原本的头节点
    list -> next = node;//头结点指向新插入的节点
    list -> data++;//节点数量++
}

//尾插法
void tailInsert(Node* list , int data){
    Node* head = list;//定义一个指针用于遍历
    Node* node = (Node*)malloc(sizeof(Node));
    node -> data = data;
    node -> next = NULL;
    head = head -> next;//获取链表的首地址
    while(head -> next){//遍历,找到最后一个节点
        head = head -> next;
    }
    head -> next = node;//最后一个节点指向插入的节点
    list -> data++;//节点数量++
}

//删除
void deleat(Node* list , int data){
    Node* pre = list;//要删除节点之前的节点
    Node* current = list -> next;//要删除节点所指向的节点
    while(current){
        if(current -> data == data){//遍历找到想要删除的节点,并完成删除
            pre -> next = current -> next;
            free(current);//释放删除节点的空间
            break;
        }
        pre = current;
        current = current -> next;
    }
    list -> data--;//节点数据--
}

//输出链表
void PrintList(Node*list){
    list = list -> next;
    while(list){
        printf("%d" , list -> data);
        list = list -> next;
    }
    printf("\n");
}

int main()
{
	Node* list = initList();
    headInsert(list,1);
    tailInsert(list,2);
    tailInsert(list,1);
    PrintList(list);
    deleat(list,2);
    PrintList(list);
}

自学资源来自bilibili

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值