首页 > 其他分享 >手撕链表(自存)

手撕链表(自存)

时间:2024-05-10 23:08:25浏览次数:21  
标签:自存 ListNode val list List next 链表 curr

#include<stdio.h>
#include<stdlib.h>

typedef int E;

typedef struct node {
    E val;
    struct node* next;
}ListNode;

ListNode* list_creat() {
    ListNode* list = malloc(sizeof(ListNode));
    return list;
}

void push_back(ListNode* List, E val) {
    if (!List)
    {
        printf("List is NULL!");
        exit(1);
    }
    ListNode* p = malloc(sizeof(ListNode));
    if (!p) {
        printf("error");
        exit(1);
    }
    p->val = val;
    p->next = NULL;//尾插法,新元素next为空
    ListNode* tail = List;
    while (tail->next) {
        tail = tail->next;
    }
    tail->next = p;
}

void push_front(ListNode** List, E val) {
    ListNode* p = malloc(sizeof(ListNode));
    if (!p) {
        printf("error");
        exit(1);
    }
    p->val = val;
    p->next = *List;
    *List = p;
}

E pop_back(ListNode *List) {
    if (List == NULL)
    {
        printf("error");
        exit(1);
    }
    ListNode* pre, * curr;
    pre = NULL;
    curr = List;
    while (curr) {
        pre = curr;
        curr = curr->next;
    }
    E value = curr->val;
    free(curr);
    pre->next = NULL;
    return value;
}

E pop_front(ListNode** List) {
    E value = (*List)->val;
    ListNode* p = malloc(sizeof(ListNode));
    p = *List;
    *List = p->next;
    free(p);
    return value;
}

void destroy_list(ListNode* List) {
    ListNode* curr, * next;
    curr = List;
    while (curr) {
        next = curr->next;
        free(curr);
        curr = next;
    }
    free(List);
}

int main(void) {
ListNode* list = list_creat();
push_back(list, 1);
push_back(list, 4);
push_back(list, 8);
push_back(list, 9);
add_before_head(&list, 10);
return 0;
}

 

 

标签:自存,ListNode,val,list,List,next,链表,curr
From: https://www.cnblogs.com/Uiney117/p/18185206

相关文章

  • 力扣刷题笔记-21 合并两个有序链表
    其实不回答就是答案双指针classSolution{publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){ListNodedummy=newListNode(-1);ListNodep=dummy;ListNodep1=list1,p2=list2;while(p1!=null&&p2!=nu......
  • 删除单向链表中数据最小的结点
    (1)算法的基本设计思想要找到链表中数据最小的结点,可以使用4指针法。具体步骤如下:定义4个指针,分别命名为MinNodeprev、MinNode、CurrentNodePrev、CurrentNode,MinNodeprev、CurrentNodePrev指向链表的头结点,MinNode、CurrentNode指向链表的首结点。同时移动CurrentNodePrev、Cur......
  • 23. 合并 K 个升序链表
    23.合并K个升序链表https://leetcode.cn/problems/merge-k-sorted-lists/?envType=study-plan-v2&envId=top-interview-150 思路K个升序链表,依据显然的规则:当前最小的值,肯定出自于K个升序链表的K个表头中,对这K个表头使用最小堆(priority_queue)进行管理,pop出的堆顶值,就......
  • 关于单向不循环链表的创建、插入、删除、遍历、检索
    关于单向不循环链表的创建、插入、删除、遍历、检索单向不循环链表公式初始化单向不循环链表构建单向不循环链表结构体//创建结构体类型typedefstructone_way_node{//数据域chardata[DATA_LEN];//指针域structone_way_node*next;}ONE_WAY_NOD......
  • Leetcode --- 203. 移除链表元素
    题目描述给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。示例1: 示例输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]输入:head=[7,7,7,7],val=7输出:[]参考实现方式1、使用递归实现......
  • 自定义单链表(非循环)的基本接口函数
    文件描述及头文件包含/********************************************************************* 文件名称: 单链表(非循环)的基本接口程序* 文件作者:[email protected]* 创建日期:2024/05/07* 文件功能:对单链表的增删改查功能的定义* 注意事项:No......
  • 自定义单链表(非循环)反转的基本函数接口
    题干structListNode*ReverseList(structListNode*head){if(head==NULL||head->next==NULL){returnhead;}else{structListNode*Phead=head;structListNode*temp=head->next;Phead->next=NULL;......
  • 双向循环链表的实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......
  • 双向链表实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......
  • 单向循环链表的实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......