首页 > 其他分享 >链表二

链表二

时间:2022-09-18 14:23:41浏览次数:66  
标签:Node List void list number 链表

继上次的链表一,已经熟悉了链表大致的结构,这篇则是讲基本链表的最终形态

首先来确定一下需要学习链表的哪些东西:添加、打印、寻找、删除和清除

  • void add(List* pList, int number);//添加结点
  • void print(List* list);//打印链表
  • void seek(List* list, int number);//寻找链表中的某个值
  • void del(List* list, int number);//删除结点
  • void clear(List* list);//清除链表

上一篇中,添加结点时候都是从头指针(head)开始,这使得工作效率很低,这次我们想引入一个指针,使它每次都指向链表的最后一个结点

typedef struct _list{
    Node* head;
    Node* tail;
}List;

所以在逻辑上也需要变化

void add(List* pList, int number)
{
    Node* p = (Node*)malloc(sizeof(Node));
    p->value = number;
    p->next = NULL;
    Node* last = plist->tail;
    if (last)
    {
        last->next = p;
        plist->tail = p;//使它永远指向新加入的那个结点
    }
    else
    {
        plist->head = p;
        plist->tail = p;//使它永远指向新加入的那个结点
    }
}

接下来是打印,与上次一样,只不过head在list里了

void print(List* list)
{
    Node* p;
    for (p = list->head; p; p = p->next)
    {
        printf("%d\t", p->value);
    }
    printf("\n");
}

在上次这段代码中,输出时候会弹窗,但是变成函数之后并没有这种情况

void seek(List* list, int number)
{
    Node* p;
    int isFound = 0;
    for (p = list->head; p; p = p->next)
    {
        if (p->value == number)
        {
            printf("找到了!\n");
            isFound = 1;
            break;
        }
    }
    if (isFound == 0)
    {
        printf("没找到!\n");
    }
}

删除的话也没什么变化

void del(List* list, int number)
{
    Node* p;
    Node* q = NULL;
    for (q, p = list->head; p; q = p, p = p->next)
    {
        if (p->value == number)
        {
            if (q)
            {
                q->next = p->next;
            }
            else
            {
                list->head = p->next;
            }
            free(p);
            break;
        }
    }
}

最后是清除

void clear(List* list)
{
    Node* p;
    Node* q;
    for (p = list->head; p; p = q)
    {
        q = p->next;
        free(p);
    }
    printf("清除完毕!");
}

到这基本链表就结束了,有机会会更新数据结构的内容

标签:Node,List,void,list,number,链表
From: https://www.cnblogs.com/Iguang/p/16704734.html

相关文章

  • Go-单链表
    单链表-往最后面插入复制packagemainimport"fmt"typeHeroNodestruct{ noint namestring nicknamestring next*HeroNode}//在单链表......
  • 一文理解golang中的链表
    每节运煤车就是单链表里的元素,每节车厢里的煤炭就是元素中保存的数据。前后车通过锁链相连,作为单链表运煤车,从1号车厢开始,每节车厢都知道后面拉着哪一节车厢,却不知道前面是......
  • [leetcode 876] 链表的中间节点
    [leetcode876]链表的中间节点给定一个头结点为head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例1:输入:[1,2,3,4,5]输出:此列......
  • [数据结构10分钟入门] 面向初学者从零实现 -- 单链表
    一、链表是什么链表是一种通过指针串联在一起的线性结构,在内存中是分散存储的(数组在内存中连续分布),链表由一系列节点组成,每个节点都由数据域和指针域组成。主要有三种类......
  • 浅谈双指针技巧(一)---通过双指针判断链表成环问题
    双指针是算法中非常重要的一个解决问题的思路。双指针顾名思义,就是有两个指针。根据双指针的方向及速度,我们一般将双指针分为以下几种场景1、快慢双指针2、左右双指针所谓......
  • JS版数据结构-链表
    链表代码随笔(JS)/**链表节点*/classNode{el=null;next=null;constructor(el=null,next=null){this.el=el;this.next=next;}}......
  • leetcode 114. Flatten Binary Tree to Linked List 二叉树展开为链表(简单)
    一、题目大意给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。......
  • leetcode206:反转链表
    packagecom.mxnet;importjava.util.Stack;publicclassSolution206{publicstaticvoidmain(String[]args){}/***给你单链表的头节点......
  • 删除链表的倒数第N个节点
    删除链表的倒数第N个节点给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例1:输入:head=[1,2,3,4,5],n=2输出:[1......
  • leetcode-链表-19
    /***<p>给你一个链表,删除链表的倒数第&nbsp;<code>n</code><em>&nbsp;</em>个结点,并且返回链表的头结点。</p>**<p>&nbsp;</p>**<p><strong>示例1:</strong><......