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日

相关文章

  • 图计算引擎分析–GridGraph

    作者:京东科技 李永萍 GridGraph:Large-Scale Graph Processing on a Single Machine Using 2-Level Hierarchical Partitioning 图计算框架 图计算系统按照计算方式划分可分为:单机内存图处理系统,单机核外图处理系统,分布式内存图处理系统,分布式核外图处理系统。本文将详…

    算法与数据结构 2023年4月20日
    00
  • [Week 18] 每日一题(C++,动态规划,线段树,数学)

    目录 [Daimayuan] T1 最长公共子序列(C++,DP,二分) 输入格式 输出格式 数据范围 输入样例 输出样例 解题思路 [Daimayuan] T2 喵喵序列(C++,序偶) 题目描述 输入格式 输出格式 样例输入 样例输出 样例说明 数据范围 双倍经验 解题思路: [Daimayuan] T3 漂亮数(C++,字符串) 输入描述 输出描述 输…

    算法与数据结构 2023年4月25日
    00
  • C语言数据结构与算法之时间空间复杂度入门

    C语言数据结构与算法之时间空间复杂度入门攻略 1. 什么是时间复杂度和空间复杂度? 在进行算法设计时,我们不仅需要考虑到算法的正确性,还要考虑到算法的执行效率。而衡量算法执行效率的指标主要有两个,即时间复杂度和空间复杂度: 时间复杂度:衡量算法所需时间的度量,通常用“大O”符号来表示。比如,对于n个元素的数组,某些算法需要执行n次操作,这个算法的时间复杂度就…

    数据结构 2023年5月16日
    00
  • Java数据结构之List的使用总结

    非常感谢您对本网站的关注。Java数据结构之List的使用总结是一个非常重要的主题,这里将为您详细介绍。 1. List是什么 在Java中,List是一种非常实用的数据结构,它代表了一个元素的有序集合,其中的每个元素都可以用一个整数索引来标识。List允许多个元素重复,同时还可以在集合的任意位置插入或者删除元素。 Java中的List主要分为两类:Arra…

    数据结构 2023年5月17日
    00
  • TypeScript数据结构链表结构 LinkedList教程及面试

    TypeScript数据结构链表结构 LinkedList教程及面试攻略 在程序设计中,链表是一种重要的数据结构,它可以用来存储一系列数据元素,并提供一些类似于数组的操作。 TypeScript是一种JavaScript的超集,它提供了更加丰富的类型系统,使得我们可以更好的使用链表这种数据结构。 本文将会讲解使用TypeScript实现常见的链表结构,并且提…

    数据结构 2023年5月17日
    00
  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.erikt…

    算法与数据结构 2023年4月17日
    00
  • C++高级数据结构之优先队列

    C++高级数据结构之优先队列 什么是优先队列? 优先队列是一种特殊的队列,其中每个元素都有一个优先级。当加入一个元素时,它会被放置在队列中的适当位置,以确保优先级最高的元素位于队头。从队列中取出元素时,总是从队头删除元素。 优先队列的应用 优先队列的常见应用场景包括: 操作系统任务调度 网络传输协议TCP中的拥塞控制算法 各种图像算法如边缘检测等 C++中S…

    数据结构 2023年5月17日
    00
  • 使用C语言详解霍夫曼树数据结构

    使用C语言详解霍夫曼树数据结构 什么是霍夫曼树 霍夫曼树是一种带权路径长度最短的树,也称为最优二叉树,它是优化编码的核心算法。 在霍夫曼树中,每个叶子节点对应一个字符,该节点的权值为该字符出现的次数。当然,字符可以是任何数据类型。生成霍夫曼树后,在对每个字符进行编码时,字符在霍夫曼树中的路径即为其编码。(一般规定,一条从根到叶子的路径上只出现0或1,从根到某…

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