首页
学习
活动
专区
工具
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...我们可以 按照常规办法来构建链表,同样是循环插入数据,不过这时候需要新增一个指针,来记录当前节点,我们不能再使用头结点来做插入。

81710

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;

13520

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

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

36610

Python实现一个简单线程池

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

72010

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*

63010

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;

13210

C语言】链表使用及链表实现原理

链表是什么? 1.逻辑结构上⼀个挨⼀个数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相 反,数据随机分布在内存中各个位置,这种存储结构称为线性表链式存储。...下面是一个链表实现过程 #include #include #include //结构体是⼀种⼯具,⽤这个⼯具可以定义⾃⼰数据类型 typedef struct...,你只知道他数据,并不知道怎么去访问这个数据 if(head == NULL) { head = node; //一开始没有任何节点,那么传入节点作为头结点 }...=NULL) //,获取最后一个节点位置,跳出循环那时候是最后一个节点,判断后继节点是否为空 { p = p->pNext; } p->pNext=node; //下一个指针域指向新节点...} } int main() { Node *p1 = (Node*)malloc(sizeof(Node)); //malloc在 里面,给p1分配一个内存。

97010
领券