首页 > 其他分享 >链表linklist

链表linklist

时间:2023-04-08 13:58:24浏览次数:35  
标签:linklist cur val void list next 链表 linkNode

 

 

 

#pragma once
#include <stdbool.h>

typedef int Data;

// 定义节点结构
typedef struct linkNode
{
    Data data;
    struct linkNode* next;

}linkNode;

// 创建链表
linkNode* createList();

// 创建节点
linkNode* createNode(Data val);

// 插入
//头插入
void pushfront(linkNode* list, Data val);
//尾插入
void push_back(linkNode* list, Data val);
//指定位置插入(下标)
void insert_pos(linkNode* list, int pos, Data val);
//指定位置插入(在指定元素之后)
void insert_item(linkNode* list, linkNode* item, Data val);
// 查找元素
linkNode* find(linkNode* list, Data data);


// 删除
//头删
void pop_front(linkNode* list);
//尾删
void pop_back(linkNode* list);
//指定元素删除
void removeOne(linkNode* list, Data val);
void removeA1l(linkNode* list, Data val);  // 删除所有val
bool isempty(linkNode* list);

// 遍历
void show_list(linkNode* list);
#include "LinkList.h"
#include <stdio.h>
#include <malloc.h>
#include <string.h>

linkNode* createList()
{
    linkNode* head = malloc(sizeof(linkNode));
    if (!head)
    {
        printf("head malloc failed");
        return NULL;
    }
    memset(head, 0, sizeof(linkNode));
    return head;
}

linkNode* createNode(Data val)
{
    linkNode* newNode = malloc(sizeof(linkNode));
    if (!newNode)
    {
        printf("newNode malloc falied"); return NULL;
    }
    newNode->data = val;
    newNode->next = NULL;
    return newNode;
}

void pushfront(linkNode* list, Data val)
{
    linkNode* newNode = createNode(val);
    newNode->next = list->next;
    list->next = newNode;
}

void push_back(linkNode* list, Data val)
{
    linkNode* newNode = createNode(val);
    linkNode* cur = list;
    while (cur->next)
    {
        cur = cur->next;
    }
    cur->next = newNode;
}

void insert_pos(linkNode* list, int pos, Data val)
{
    linkNode* cur = list;
    linkNode* newNode = createNode(val);

    while (pos-- && cur->next)
    {
        cur = cur->next;
    }

    newNode->next = cur->next;
    cur->next = newNode;
}

void insert_item(linkNode* list, linkNode* item, Data val)
{
    linkNode* newNode = createNode(val);
    newNode->next = item->next;
    item->next = newNode;
}

linkNode* find(linkNode* list, Data val)
{
    linkNode* curNode = list->next; while (curNode)
    {

        if (curNode->data == val)
        {
            return curNode;
        }
        curNode = curNode->next;
    }
    return NULL;

}

void pop_front(linkNode* list)
{
    linkNode* temp = list->next;
    list->next = list->next->next;
    free(temp);
}

void pop_back(linkNode* list)
{
    linkNode* cur = list;
    linkNode* temp = NULL;
    while (cur->next && cur->next->next)
    {

        cur = cur->next;
    }
    free(cur->next);
    cur->next = NULL;
}

void removeOne(linkNode* list, Data val)
{
    if (isempty(list))
        return;
    linkNode* cur = list;
    while (cur->next)
    {
        if (cur->next->data == val)
        {
            break;
        }
        cur = cur->next;
    }
    //ɾ³ý
    if (cur->next)
    {
        linkNode* temp = cur->next;
        cur->next = cur->next->next;
        free(temp);
    }
}

void removeA1l(linkNode* list, Data val)
{
    if (isempty(list))
        return;
    linkNode* cur = list;
    linkNode* temp = NULL;
    while (cur->next)
    {
        if (cur->next->data == val)
        {
            temp = cur->next;
            cur->next = temp->next;lian
            free(temp);
            temp = NULL;
        }
        else
        {
            cur = cur->next;
        }

    }
}

bool isempty(linkNode* list)
{
    return list->next == NULL;
}

void show_list(linkNode* list)
{
    linkNode* cur = list->next;
    while (cur)
    {
        printf("%d ", cur->data);
        cur = cur->next;
    }
    printf("\n");
}

 

标签:linklist,cur,val,void,list,next,链表,linkNode
From: https://www.cnblogs.com/miwaiwai/p/17298405.html

相关文章

  • Redis 源码解析之通用双向链表(adlist)
    Redis源码解析之通用双向链表(adlist)概述Redis源码中广泛使用adlist(Agenericdoublylinkedlist),作为一种通用的双向链表,用于简单的数据集合操作。adlist提供了基本的增删改查能力,并支持用户自定义深拷贝、释放和匹配操作来维护数据集合中的泛化数据value。adlist的数......
  • 链表的回文判断—Java实现
    对于这个题,主要是老是局限于方法内的变量,未想到借助外部变量辅助:具如下,不可用数除法,会溢出异常:即使是取最大的long也会溢出,常规方法不再赘述,具体以代码如下:1packageProblemSolve;23publicclassSolution5{4privateListNodefrontNode;5publicboolean......
  • 142. 环形链表 II
     解法一:①首先判断是否有环,若无环,则快指针或其下一指针指向空;若有环,则从快慢指针相遇的位置继续出发,直到再次相遇,遍历次数即为环长len。②两指针从头结点重新开始,让其中一指针先出发len步,而后另一指针再出发,相遇节点即为环起点。/***Definitionforsingly-linkedlist.*......
  • 链表练习4
    已知整型链表,设计算法,删除所有结点值为x的结点,删除的结点个数通过形参返回。#include<stdio.h>#include<stdlib.h>typedefstructnode{intdata;structnode*next;}Node,*LinkList;LinkListcreate(){LinkListh,r,s;h=(LinkList)malloc(sizeof(Node));r=h;inta;sc......
  • 141. 环形链表
     141. 环形链表解法一:所到之处,寸草不生第一种解法自己写的,巧妙运用了链表的val,只要遍历过,就将节点的值设置为1e9,时间空间复杂度都达到了完美的统一(doge)/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*L......
  • 单向链表找到链表的中点
    偶数为n/2奇数为(n+1)/2点击查看代码ListNode*slow=head,*fast=head;while(fast->next!=nullptr&&fast->next->next!=nullptr){slow=slow->next;fast=fast->next->next;}注:需要判断头结点是否为空......
  • 链表反转-JavaDG实现
    对于链表的反转,用常规的迭代法,是很简单的,使用两个指针;对于用递归法,则是很经典题了,我就觉得对于递归方法和常用的迭代法,大家最好都熟悉掌握,不要刻意的去避免哪一点;1•链表反转2○常规的迭代实现:3publicListNodereverseList(ListNodehea......
  • 单链表进阶OJ版--->随机指针问题
    朋友们,晚上好!!今天,推出一篇单链表的随机指针问题!!相较于之前的链表OJ题,本期的链表难度有所提升!!下面请看题:>有一个链表,链表每个结点额外增加一个随机指针random,并且随机指针可以指向链表的任何结点以及空结点至于本题的要求是:复制带随机指针的链表如下图所示:>本题的难度,大致......
  • 反转一个单链表
    示例:输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL进阶:你可以使用迭代或者递归来反转链表。你能否用两种方法来解决这个问题。思路我写在了代码当中,欢迎指正。/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;......
  • 四种语言刷算法之重排链表
    力扣143. 重排链表1、C/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/voidreorderList(structListNode*head){structListNode*p=head;intcount=0;while(p){p......