C语言实题讲解快速掌握单链表下

C语言实题讲解快速掌握单链表下

简介

单链表是常见的一种数据结构,可以存储任意数量的数据,并且可以高效的进行插入、删除和查找操作。本篇文章将介绍如何使用C语言实现单链表,以及如何应对在实现单链表时所遇到的常见问题。

实现过程

数据结构设计

为了实现单链表,我们需要设计一个数据结构来存储节点信息,一般包含两个成员,一个是数据域,用来存储实际的数据,另一个是指针域,用来存储下一个节点的地址。以下是一个基本的节点定义:

struct ListNode{
  int data;
  struct ListNode *next;
};

创建链表

创建一个单链表就相当于创建一个空的链表头节点,可以用以下代码实现:

struct ListNode *head = NULL;
head = (struct ListNode*)malloc(sizeof(struct ListNode));
if(NULL == head){
  printf("内存分配错误!");
}
head->next = NULL;

插入节点

单链表的插入操作包括两个部分,一个是创建一个新的节点并把要插入的值存储在数据域里面,另一个是把这个节点插入到链表中,具体实现如下:

struct ListNode *insert(struct ListNode *head, int i, int value){
  struct ListNode *newNode = NULL;
  // 遍历到第i个节点的前一个节点
  for(int j = 0; j < i-1 && NULL != head; j++){
    head = head->next;
  }
  // 创建新节点并存储数据
  newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
  if(NULL == newNode){
    printf("内存分配错误!");
  }
  newNode->data = value;
  // 把新节点插入到链表中
  newNode->next = head->next;
  head->next = newNode;
  return head;
}

删除节点

单链表的删除操作需要指定要删除的节点的地址以及其前一个节点的地址,实现如下:

struct ListNode *delete(struct ListNode *head, struct ListNode *node){
  // 遍历到要删除的节点的前一个节点
  while(head->next != node && NULL != head){
    head = head->next;
  }
  // 删除节点并重新链接链表
  if(NULL != head){
    head->next = node->next;
    free(node);
    node = NULL;
  }
  return head;
}

示例说明

示例1

现在我们需要创建一个包含10个元素的单链表,代码如下:

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

struct ListNode{
  int data;
  struct ListNode *next;
};

struct ListNode *create_list(){
  struct ListNode *head = NULL;
  head = (struct ListNode*)malloc(sizeof(struct ListNode));
  if(NULL == head){
    printf("内存分配错误!");
  }
  head->next = NULL;
  struct ListNode *p = head;
  for(int i = 0; i < 10; i++){
    struct ListNode *newNode = NULL;
    newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    if(NULL == newNode){
      printf("内存分配错误!");
    }
    newNode->data = i;
    p->next = newNode;
    p = p->next;
  }
  return head;
}

int main(){
  struct ListNode *head = create_list();
  struct ListNode *p = head->next;
  while(NULL != p){
    printf("%d ", p->data);
    p = p->next;
  }
  return 0;
}

程序会输出:0 1 2 3 4 5 6 7 8 9

示例2

现在我们需要在单链表中删除元素为5的节点,代码如下:

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

struct ListNode{
  int data;
  struct ListNode *next;
};

struct ListNode *create_list(){
  struct ListNode *head = NULL;
  head = (struct ListNode*)malloc(sizeof(struct ListNode));
  if(NULL == head){
    printf("内存分配错误!");
  }
  head->next = NULL;
  struct ListNode *p = head;
  for(int i = 0; i < 10; i++){
    struct ListNode *newNode = NULL;
    newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    if(NULL == newNode){
      printf("内存分配错误!");
    }
    newNode->data = i;
    p->next = newNode;
    p = p->next;
  }
  return head;
}

struct ListNode *delete(struct ListNode *head, struct ListNode *node){
  while(head->next != node && NULL != head){
    head = head->next;
  }
  if(NULL != head){
    head->next = node->next;
    free(node);
    node = NULL;
  }
  return head;
}

int main(){
  struct ListNode *head = create_list();
  struct ListNode *p = head->next;
  while(NULL != p){
    if(p->data == 5){
      head = delete(head, p);
    }
    p = p->next;
  }
  p = head->next;
  while(NULL != p){
    printf("%d ", p->data);
    p = p->next;
  }
  return 0;
}

程序会输出:0 1 2 3 4 6 7 8 9。可以看到,元素为5的节点已经被删除了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实题讲解快速掌握单链表下 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言结构体struct详解

    C语言结构体struct详解 什么是结构体? 在C语言中,结构体是一种用户自定义的数据类型,它可以将不同的数据类型组合在一起形成一个新的数据类型。结构体主要由结构体名、成员和符号构成。 使用结构体可以方便地定义一些复杂的数据类型,例如表示一个学生信息的数据类型,可以包括姓名、学号、性别、年龄等信息。 结构体的定义和声明 结构体的定义通常放在函数外部,以便在整…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法之链表

    JavaScript数据结构与算法之链表 什么是链表 链表是一种线性数据结构,它由一个一个的节点组成,每个节点包含两个部分:当前节点存储的数据,以及指向下一个节点的指针。相比于数组,链表可以实现更加灵活的内存分配,可以动态增加或删除节点,但访问链表中的节点比访问数组要慢。 单向链表 单向链表是最简单的一种链表,它每个节点只有一个指针,指向它的下一个节点。单向…

    数据结构 2023年5月17日
    00
  • Java常见基础数据结构

    Java常见基础数据结构攻略 Java是一种面向对象的编程语言,拥有丰富的数据结构,大多数基础数据结构都包含在Java API中。在本文中,我们将讨论Java中常见的基础数据结构,包括数组、链表、栈、队列、集合和映射。我们将探讨每种数据结构的定义、用法和基本操作,并提供两个示例说明。 数组 数组是Java中最基本的数据结构之一。它是一个有序的集合,可以包含任…

    数据结构 2023年5月17日
    00
  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现 什么是线性表 线性表,简单来说,就是一种有序的数据结构,数据元素起来往往构成一列,比如数组、链表等等。 数组实现线性表 数组是一种容器,它可以存储相同类型的数据元素。使用数组实现线性表,就是将数据元素按照一定的顺序依次存储在数组中。 数组实现线性表的基本思路 定义一个数组,用来存储数据元素; 定义一个变量,用来记录线性表中元…

    数据结构 2023年5月17日
    00
  • CSP-何以包邮?

    题目描述 新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n)的价格为 ai 元。考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。 试帮助小 P …

    算法与数据结构 2023年5月11日
    00
  • 「线段树」!(简单)的线段树

    本题为3月20日23上半学期集训每日一题中B题的题解 题面 题目描述 给你一个序列 \(A[1],A[2],…,A[n]\) .( \(|A[i]| \leq 15007, 1 \leq N \leq 50,000\) ). M( \(1 \leq M \leq 500,000\) ) 次询问,每次询问 \(Query(x, y) = Max{A[i] …

    算法与数据结构 2023年4月18日
    00
  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解 本文将详细讲解C语言数据结构中单链表的操作方法,包括单链表的建立、遍历、插入、删除等操作,并提供两个示例进行说明。 单链表的定义 单链表是一种常见的动态数据结构,由若干节点组成,每个节点通常包含一个数据元素和一个指向下一个节点的指针。单链表最后一个节点的指针指向NULL,表示链表的结尾。 单链表的节点定义 单链表的节点通常由结…

    数据结构 2023年5月17日
    00
  • 稀疏数组

    引入 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续 我们应该怎么实现 ? 以围棋举例 使用二维数组将棋盘记下 ,如 0 为 没有棋子 ,1 为 黑子 , 2为白子 但是没有棋子的地方都为 0 ,整个二维数组充斥着大量的无效数据 0 我们需要想一个办法来 优化存储的方式 基本介绍 当一个数组中大部分元素是同一个值时,我们可以使用…

    算法与数据结构 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部