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日

相关文章

  • java数据结构之树基本概念解析及代码示例

    Java数据结构之树基本概念解析及代码示例 树的基本概念 树(Tree)是一种非常重要的数据结构,它以“分支和层次”为特点,常用于组织数据,如目录结构、文件系统、网络结构等。 树是由节点(Node)构成的集合,其中有一个节点为根(Root),其他节点被称为子节点。每个节点都有一个父节点,除根节点外,每个节点可以有多个子节点。节点之间的关系称为边(Edge)。…

    数据结构 2023年5月16日
    00
  • C++数据结构与算法之判断一个链表是否为回文结构的方法

    当我们遇到判断一个链表是否为回文结构的问题时,可以考虑使用如下的方法: 遍历链表,将链表节点的值存储到一个数组或者栈中。 遍历链表,将链表节点的值与前面存储的值进行比较,如果全部相同,则证明链表为回文结构。 下面是详细的代码实现和示例说明: 实现 首先,我们需要定义一个链表节点的结构体,包括节点值和指向下一个节点的指针: struct ListNode { …

    数据结构 2023年5月17日
    00
  • Python数据结构之顺序表的实现代码示例

    针对“Python数据结构之顺序表的实现代码示例”,我可以给出以下完整攻略: 什么是顺序表 顺序表是一种线性结构,是用一维数组来存储数据元素的有序集合。它支持随机访问,可以对任意位置的元素进行查找、插入、删除等操作。 顺序表的实现代码示例 以下是Python中实现顺序表的示例代码,以及相关的操作函数,包括创建空表、获取表长度、查找元素、插入元素、删除元素等。…

    数据结构 2023年5月17日
    00
  • C、C++线性表基本操作的详细介绍

    我来详细讲解“C、C++线性表基本操作的详细介绍”。 一、线性表的定义 线性表是一种数据结构,它是由n个数据元素组成的有限序列,记为(a1,a2,…,an),其中a1是线性表的第一个元素,an是线性表的最后一个元素。除第一个元素之外,每一个元素有且仅有一个直接前驱元素,除了最后一个元素之外,每一个元素有且仅有一个直接后继元素。 线性表可以理解为一个一维数…

    数据结构 2023年5月17日
    00
  • Java集合和数据结构排序实例详解

    Java集合和数据结构排序实例详解 作为Java程序员,集合和数据结构是我们经常会用到的工具,其中排序是其中非常重要的一环。本文将为大家详细介绍Java中集合和数据结构排序的实例。 Java集合排序 在Java中,集合排序通常使用Collections工具类来完成。Collections提供了多种排序算法,包括插入排序、选择排序、归并排序等等。例如,下面的示…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法之栈(动力节点Java学院整理)

    Java数据结构与算法之栈攻略 什么是栈? 栈是一种线性结构,属于“先进后出”(Last In First Out,LIFO)的数据结构。它只允许在栈顶进行插入和删除操作。 栈的实现 栈的实现有两种方式: 基于数组实现的顺序栈(ArrayStack) 基于链表实现的链式栈(LinkedStack) 1. 基于数组实现的顺序栈 顺序栈的实现需要一个固定大小的数…

    数据结构 2023年5月17日
    00
  • Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)

    Java数据结构及算法实例:快速计算二进制数中1的个数 简介 本文将介绍在Java中快速计算二进制数中1的个数的算法。本算法是一种基于位运算的算法,其核心思想是利用位运算的快捷性,将原问题转化为每次计算一位是否为1的问题,使得计算速度大大提升。 背景知识 在理解本算法之前,需要了解Java中的一些背景知识: 1. 位运算 Java中的位运算符有如下几个: &…

    数据结构 2023年5月17日
    00
  • Java数据结构之单链表详解

    下面是单链表攻略的详细讲解。 什么是单链表? 单链表是一种线性数据结构,它由一系列结点组成,每个结点包含数据域和指针域。数据域用于存储数据,指针域用于指向下一个结点。单链表的优点是插入和删除操作的时间复杂度为O(1),缺点是随机访问的时间复杂度为O(n)。 单链表的基本操作 单链表的基本操作包括插入操作、删除操作、查找操作和遍历操作。下面将分别介绍这些操作。…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部