数据结构-单链表

单链表

线性表:

  • 有限的序列
  • 序列中的每一个元素都有唯一的前驱和后继,除了开头和结尾两个节点

请添加图片描述

顺序表:分配一块连续的内存去存放这些元素

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

请添加图片描述

单链表操作:

  • 增加
    • 头插法
    • 尾插法
  • 删除
    • 删除节点 先将节点拿出,先前节点指向被拿出节点的下一节点,再将拿出节点进行释放(个人理解)
    • 只需要找到对应节点,将对应节点的前一个节点指向这个节点的后继,之操作一个指针

头插法

在这里插入图片描述

尾插法

在这里插入图片描述

头节点

  • 在链表前插入一个头节点,保存链表的个数,一般的第一个元素是从头节点的next开始计数

在这里插入图片描述

代码复现

#include <stdio.h>
#include <stlib.h>
typedef struct Node {
	 int data;
    struct Node* next;
}Node;
Node* initList(){
    Node* list=(Node*)malloc(sizeof(Node));
    list->data=0;//list指向结构体的指针 
    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;
    list=list->next;
    while(list->next){//跳出循环的条件是list指向链表的最后一个节点
        list=list->next;
    }
    list->next=node;//连接新节点
    head->data++;
}
void delete(Node* list,int data){
    Node* pre=list;//删除节点的前一个节点
    Node* current=list->next;//需要删除的节点
    list=list->next;
    while(current){//不是要删除的节点跳出循环
        if(current->data==data){//如果要删除的节点数据等于链表中的数据
            pre->next=current->next;//删除节点的前一个节点的下一条连接当前删除节点的下一条
            free(current);
            break;
        }
        pre=current;//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);
    headInsert(list,2);
    headInsert(list,3);
    headInsert(list,4);
    headInsert(list,5);
    tailInsert(list,6);
    tailInsert(list,7);
    tailInsert(list,8);
    tailInsert(list,9);
    tailInsert(list,10);
    printList(list);
    //delete(list,5);
    //delete(list,10);
    //delete(list,6);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值