首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用C实现一个没有malloc的简单链表

简单链表是一种常见的数据结构,用于存储一系列元素,并通过指针将它们连接起来。在C语言中,我们可以通过动态内存分配函数malloc来创建链表节点,但是本题要求实现一个没有malloc的简单链表。

在没有malloc的情况下,我们可以使用静态数组来模拟链表节点的存储。下面是一个用C语言实现的没有malloc的简单链表的示例代码:

代码语言:txt
复制
#include <stdio.h>

#define MAX_SIZE 100

typedef struct Node {
    int data;
    int next;
} Node;

Node list[MAX_SIZE];
int head = -1;  // 头节点的索引

// 初始化链表
void initList() {
    for (int i = 0; i < MAX_SIZE; i++) {
        list[i].next = -1;
    }
}

// 在链表末尾插入节点
void insert(int data) {
    int newNodeIndex = -1;
    for (int i = 0; i < MAX_SIZE; i++) {
        if (list[i].next == -1) {
            newNodeIndex = i;
            break;
        }
    }
    if (newNodeIndex == -1) {
        printf("链表已满,无法插入新节点\n");
        return;
    }
    list[newNodeIndex].data = data;
    list[newNodeIndex].next = -1;

    if (head == -1) {
        head = newNodeIndex;
    } else {
        int curIndex = head;
        while (list[curIndex].next != -1) {
            curIndex = list[curIndex].next;
        }
        list[curIndex].next = newNodeIndex;
    }
}

// 打印链表
void printList() {
    int curIndex = head;
    while (curIndex != -1) {
        printf("%d ", list[curIndex].data);
        curIndex = list[curIndex].next;
    }
    printf("\n");
}

int main() {
    initList();

    insert(1);
    insert(2);
    insert(3);

    printList();

    return 0;
}

在上述代码中,我们使用了一个静态数组list来存储链表节点,每个节点包含一个data字段用于存储数据,一个next字段用于指向下一个节点的索引。通过维护一个head变量来记录链表的头节点索引。

insert函数中,我们首先找到一个空闲的数组元素作为新节点的索引,然后将数据存入新节点,并将新节点插入到链表的末尾。

最后,通过printList函数可以打印出链表中的所有元素。

这是一个简单的没有使用malloc的链表实现,适用于存储较小规模的数据。如果需要存储大量数据或者动态增删节点,建议使用动态内存分配函数malloc来实现链表。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++的链表-C++实现简单链表

链表是最常用的一种数据结构,无论什么语言,学习数据结构,都绕不开链表,下面通过c++来实现简单链表,所谓简单链表,就是构建链表,然后遍历打印链表。   ...c++中构建链表,最简单的是使用结构体来定义节点,节点定义很简单:节点数据,下一个节点c++的链表,这就是链表的全部,另外,为了通过new的时候,直接创建一个节点,我们可以通过定义一个带参数的构造函数来实现...链表结构体定义如下:   这里,我们通过循环来构建一个简单的链表,链表节点数据就是一个数组[0,1,2,3,4]的各个元素:   如下图所示,这种简单的构建方式,构建链表的过程是一种特殊的构建方式c++...接下来,就实现链表的遍历,遍历很简单,从头节点开始,如果节点不为空,依次打印节点数据,并且当前节点需要切换到下一个节点开始,继续遍历:   运行程序,不出意外的话,打印的结果应该是:4->3->2->1...我们可以 按照常规的办法来构建链表,同样是循环插入数据,不过这时候需要新增一个指针,来记录当前节点,我们不能再使用头结点来做插入。

85510
  • 面向对象的单链表:用C++实现的链表操作与实践

    面向对象的单链表:用C++实现的链表操作与实践 学习章节-c实现单链表 在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中。...链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应用中。本文将详细介绍如何用C++语言实现一个面向对象的单链表,深入探讨链表的核心操作,并展示完整的代码示例。...因此,链表的插入和删除操作较为灵活,不需要大量的数据移动。 在C++中,我们通过类的封装特性来实现面向对象的链表,这不仅能有效管理链表的内存,还能通过封装实现更易用、更安全的操作。...二、单链表类的设计 我们将通过一个简单的C++类来实现单链表,该类包含基本的链表操作,如插入、删除、打印链表等。 1. 节点的定义 首先,我们定义了一个 Node 结构体来表示链表中的每个节点。...链表的类定义 接下来,我们定义 List 类,它包含一个指向链表头部的指针 phead,以及若干成员函数来实现链表的常见操作。

    8810

    用C语言控制台界面实现一个简单的2048游戏

    2048的游戏逻辑与预览图 2048游戏的基本规则是:玩家需要通过上、下、左、右四个方向滑动屏幕来移动方块,每次移动都会随机位置生成一个数字2到空闲的位置上。...当两个相同数字的方块碰撞时,它们会合并成一个数字。...游戏的目标是在屏幕上生成一个2048的方块 制作思路 构造一个4x4数组初始值全为0 游戏开始时创建两个随机数以及后面的按键触发后空位置产生随机数 为有数字的格子添加该数字的贴图(待实现) 写键盘事件...printf("这是一个简单的2048游戏\n"); printf("输入a向左移动,输入d向右移动,输入s向下移动,输入w向上移动\n"); int stk = 0;...printf("这是一个简单的2048游戏\n"); printf("输入a向左移动,输入d向右移动,输入s向下移动,输入w向上移动\n"); int stk = 0;

    20220

    扫雷的一个简单实现 - C语言

    头文件(game.h) 函数定义文件(gamefuntion.c) 游戏逻辑实现文件(game.c) 1....实现显示棋盘的函数 这里的不打印实际棋盘的大小,也就是不打印实际棋盘的周围一圈。 如下图打印每行每列对应的数字和打印红圈内的棋盘。...做一个简单的菜单 用来提示玩家输入信息 menu(); //菜单 void menu() { printf("***********************\n"); printf("***...判断胜利 返回1为胜利,0为继续 结束条件只有胜利与失败,失败不在此判断 对底层棋盘设置好后便不再改变,对玩家棋盘进行判断,用一个整型变量blank记录棋盘中三种标记的数量并与设置的地雷数进行比较...对临时变量count_mine进行判断:不是0说明周围有地雷,直接对把临时变量count_mine赋值给本次位置对应的玩家棋盘上,并结束本次循环;是0说明周围没有地雷,本次位置对应的玩家棋盘用空格' '

    38610

    链表插入排序:用 Swift 简单算法实现高效排序

    感兴趣的同学可以看看!前言本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。147. 对链表进行插入排序不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。...插入排序是一种简单的排序算法,它的基本思想是:通过将未排序的元素逐步插入到已排序的部分,最终形成一个有序的序列。我们将结合Swift代码实现单链表的插入排序,并通过示例测试展示如何应用该算法。...描述给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。插入排序 算法的步骤:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。...然后,我们将current节点插入到prev.next的位置,调整链表指针来实现插入操作。遍历链表:每次遍历链表,都会将一个待排序节点插入到已排序部分。操作直到链表全部排序。...空间复杂度:插入排序只用了常数级的额外空间,因此空间复杂度为O(1)。总结插入排序是一种简单且易于实现的排序算法,尤其适用于链表的排序。

    16700

    用Scala实现一个简单的双向队列

    作为一门Scalable的语言,Scala允许使用者也可以开发一个类似内置列表的数据结构。在这篇文章会简单的实现一个函数式双向队列,也以此来展示类型参数和如何做简单的信息隐藏。...现在Deque类还没有构造参数,再补充上: class Deque[T](elems:List[T]){ } 为了简便实现,函数式双向队列采用了内置的列表,现在Deque类可以传入一个参数elems。...Deque(List(1,2,3,4)) deque: Deque[Int] = Deque(1,2,3,4) scala> val deque2 = new Deque(List('a','b','c'...)) deque: Deque[Char] = Deque(a,b,c) 原生的Scala数据结构是没有丑陋的new方法和指定List实例的,为了避免这个,还记得伴生对象吗?...现在再将这个输入REPL:(因为REPL每一行都是一个新的object,所以会warning) scala> object Deque { | def apply[T](xs:T*

    64910

    用Python实现一个简单的线程池

    线程池的概念是什么? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。...在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些 很耗资源的对象创建和销毁。...如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。 我理解为线程池是一个存放很多线程的单位,同时还有一个对应的任务队列。...不管如何吧,大体上理解了线程池的概念。那么怎么用python实现呢? 代码如下 #!.../usr/bin/python # -*- coding: utf-8 -*- #Python的线程池实现 import Queue import threading import sys import

    74610

    用C语言来实现简单的猜数字游戏

    1 游戏简单介绍: 猜数字游戏是一个简单易懂的游戏,内容大概是系统随机给定一个1~100之间的数字,请玩家来猜,若猜错了则提示猜大了或者猜小了,直到猜错为止。...2 游戏实现思路: 2.1 emun函数(菜单): 首先我们可以以函数的形式制作一个简易菜单,方便玩家选择开始游戏或者退出游戏 代码如下: void emun() { printf("********...,然后用switch语句来创造不同选择的路径; 如果选择了0,那么就退出循环,如果选择了1,那么就进入游戏,游戏过程用game函数来实现; 如果选择了除了1和0以外的其他数字,则进入default,进行报错...int r = rand() % 100 + 1; 则此时的r的范围就是1~100; 因为猜数字游戏很难一次就猜对数字,所以我们一般要猜很多次,故而我们需要使用while函数来实现循环,直到游戏结束为止...,在这里我们可以创建一个变量ret = 1;如果没有猜对,那ret就不变,如果猜对了,就使ret = 0;然后结束循环,代码如下: void game() { int ret = 0;

    16310
    领券