首页 > 试题广场 >

关于链表与数组的优缺点,以下说法正确的是()

[单选题]
关于链表与数组的优缺点,以下说法正确的是()
  • 数组动态分配内存,并在内存中连续,链表静态分配内存,但不连续
  • 查询时,数组的时间复杂度为O(n),链表为O(1)
  • 插入或删除时,数组的时间复杂度为O(1),链表为O(n)
  • 数组元素在栈区,链表元素在堆区
数组静态分配内存,链表动态分配内存; 数组在内存中连续,链表不连续; 数组元素在栈区,链表元素在堆区; 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n); 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1) (C,若有问题请指正)
发表于 2019-09-18 13:08:29 回复(1)
这是考的c还是java。。。我当成考java看好像是全错吧。。
发表于 2018-12-21 17:45:11 回复(11)
我难道就不能malloc一个数组????
发表于 2020-06-12 21:42:32 回复(2)
刚刚做一题 数组在静态区 堆栈都行……
发表于 2022-03-16 17:25:03 回复(0)
这玩意不是全错吗。。 希望牛客网出题正常点。。
发表于 2022-02-08 23:30:01 回复(0)
一、空间分配不同: 1、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 2、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 二、数据结构不同: 1、堆的数据结构可以被看成是一棵树,如堆排序。 2、栈是一种先进后出的数据结构。
发表于 2022-01-19 19:06:54 回复(0)
<p>蛇皮题目</p>
发表于 2020-07-02 08:32:01 回复(0)
static 一个数组是静态区 ,malloc一个数组是堆区,局部变量的数组是分配在栈区的吧
发表于 2022-02-15 10:39:32 回复(0)
我不能new一个数组???
发表于 2021-01-25 22:36:32 回复(0)
插入或者删除时,除了在最后一个位置插入删除,其他情况下数组需要移动位置。
发表于 2020-02-29 11:17:14 回复(0)

这句话有一定的道理,但具体归属还是依赖于具体的实现以及所使用的内存分配策略。以下将对数组和链表的存储位置做一个详细的解释。

数组的存储位置

数组的元素存储位置取决于数组的定义方式:

  1. 定义在函数内部的局部数组

    • 例如int arr[10];在一个函数内部定义,这种情况下数组是分配在栈区的。
    c
    void function() { int arr[10]; // 局部数组,分配在栈区 }
  2. 定义为全局或静态数组

    • 例如static int arr[10];或int arr[10];在全局范围内定义,这种情况下数组是分配在静态存储区(全局区)。
    c
    static int arr1[10]; // 静态数组,分配在静态存储区 int arr2[10]; // 全局数组,分配在静态存储区
  3. 动态分配的数组

    • 例如int* arr = (int *)malloc(10 * sizeof(int));,这种通过动态内存分配机制分配的数组存储在堆区。
    c
    void function() { int* arr = (int*)malloc(10 * sizeof(int)); // 动态数组,分配在堆区 // 使用完之后需要手动释放 free(arr);
    }

链表的存储位置

链表的节点在C/C++中通常是通过动态内存分配(malloc或new)来创建的,因此它们通常存储在堆区。但是,如果链表节点是通过其他机制(如局部变量)创建的,位置可能会有所不同:

  • 动态分配的链表节点

    • 通常链表的节点是使用malloc或new分配的,因此这些节点是存储在堆区的。
    c
    typedef struct Node {
        int data;
        struct Node* next;
    } Node;
    
    Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); // 动态节点,分配在堆区
        newNode->data = data;
        newNode->next = NULL;
        return newNode;
    }
  • 局部变量创建的链表节点

    • 例如作为一个局部变量的链表节点,存储在栈区。但这种存储方式通常仅用于临时节点或测试。
    c
    void function() {
        Node node; // 局部节点,存储在栈区 node.data = 10; node.next = NULL; }

总结

  • 数组的元素位置可以在栈区、静态存储区或堆区,具体取决于如何定义和分配数组。
  • 链表的元素(节点)在大多数实际应用中通常是通过动态内存分配存储在堆区的,但也可以定义在栈区或静态存储区。

因此,更准确的说法是:“数组的存储位置取决于其定义方式,可以在栈区、静态存储区或堆区;链表的节点通常通过动态内存分配在堆区,但也可以通过其他方法存储在栈区或静态存储区。”

发表于 2024-06-01 12:17:41 回复(0)
java 中数组是放在堆的,不是吗?
发表于 2023-10-18 15:44:38 回复(0)
数组静态分配内存,并且连续,链表动态分配内存,但不连续
发表于 2023-06-17 17:44:44 回复(1)
动态数组 && 静态链表:
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
编辑于 2023-03-13 17:53:05 回复(0)
全错  这题有问题啊       
发表于 2023-03-11 16:44:33 回复(0)
数组元素在栈区,链表元素在堆区。。
发表于 2021-11-18 11:26:01 回复(0)
数组,除在最后一个元素后面进行插入(删除)操作,操作点后面的元素都要后置(前移)吧,复杂度就不止O(1)了吧
编辑于 2019-09-29 21:33:43 回复(1)