微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

链表不带结构,但仅使用数组

如何解决链表不带结构,但仅使用数组

#include <stdio.h>
int main()
{
    int n,i;
    int head = 0;
    printf("No of Students:\n");
    scanf("%d",&n);
    int data[n];
    int address_of_data[n];
    int *next;
    printf("Enter Marks:\n");
    for (i = 0; i < n; i++)
    {
        scanf("%d",&data[i]);
    }
    for (i = 0; i < n; i++)
    {
        if (data[head] != -1)
        {
            address_of_data[head] = &data[i];
        }
        else
        {
            break;
        }
        head++;
    }
    next = address_of_data[0];
    for (i = 0; i < n; i++)
    {
        printf("%d ",*(next + i));
    }
    return 0;
}

在上面的代码中,我使用了指针来打印数据值。使用两个数组,一个数组用于数据,另一个数组用于数据的地址。但是我真的不知道如何实现链接列表,我很困惑,谁能说出如何在不使用结构的情况下实现链接列表。

解决方法

这是一个简单的链表的完整示例-为了更轻松地使用纯C语言。请注意结构中的“下一个”成员-这是指向列表中后继项的指针。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct MY_DATA {
    int number;
    char info[30];
    struct MY_DATA *next;
};

#define MAX_ELEMS   5

int main(int argc,char **argv)
{
    struct MY_DATA *root = NULL;        /* Root of list */
    struct MY_DATA *prev = NULL;        /* Previously created element */

    for(int i = 0; i < (MAX_ELEMS); i++)
    {
        /* Allocate memory ... */
        struct MY_DATA *new_data = (struct MY_DATA *)malloc(sizeof(MY_DATA));

        /* ...and inialize new data set */
        memset(new_data,0x00,sizeof(MY_DATA));
        new_data->number = i * i;
        sprintf((char *)&(new_data->info),"This is data record %d",i);


        if (root == NULL)
        {
            root = prev = new_data;      /* Remember the first element */
        }
        else
        {
            prev->next = new_data;      /* The previous element has now a successor */
            prev = new_data;            /* Remember this for next iteration */
        }
    }

    struct MY_DATA *current = root;     /* Get the 1st element in the list */
    struct MY_DATA *temp = NULL;        /* Just for clean up stuff */

    for(int i = 0; i < (MAX_ELEMS); i++)
    {
        /* Display data */
        printf("Data set #%d: %s\n",current->number,current->info);

        temp = current;             /* This becomes deleted */
        current = current->next;    /* Set current pointer to successor of current element */
        free(temp);
    }

    return 0;
}

另一个示例-使用索引或指针访问数组:

#include <stdio.h>

#define MAX_ELEMS   5
int my_array[MAX_ELEMS] = { 5,18,42,31,10 };

int main(int argc,char **argv)
{
    int *current = (int *)my_array;     /* Get the 1st element in the list */

    for(int i = 0; i < (MAX_ELEMS); i++)
    {
        /* Using array index */
        printf("Data set #%d \n" \
               "  Indexed access: %d\n",i,my_array[i]);

        /* Using the pointer*/
        printf("  Pointer access: %d\n",*current++);
    }

    return 0;
}
,

链接列表的主要优点是,当您插入或添加元素时,可以将该元素存储在内存中的任何位置。列表中的其他元素可以指向它,并且如果您遍历列表,您将沿着该元素所形成的链的指针在内存中的任意位置来回跳转,直到到达尾部,因为该指针具有空指针是最后一个元素。

仅使用数组来实现链表并没有多大意义。即使可以,为什么还要呢?数组之所以出色,是因为您可以在恒定时间内直接将它们编入索引-您不能通过链接列表来执行此操作,只能对其进行迭代。但是数组也有缺点-它们是固定大小的,当它们填满时,它们就会填满!大多数共享库列表(例如Java中的ArrayList或C ++中的vector类)将基础数据存储在固定大小的数组中,然后,如果您为该数组插入了太多项目,它们将在幕后创建一个更大的新数组并复制元素为您服务。当您的阵列空间不足时,真的没有任何神奇的解决方案。

话虽这么说,为什么只用数组实现一个链表?您消除了它们的唯一优势-您可以随意追加而无需进行昂贵的重新分配。我什至不确定这是否是一个定义明确的问题。也许您真的很绝望,可以创建一个大数组,将其视为自己的虚拟内存,在其中分配和释放插槽,然后将两个元素的数组视为条目(entry [0] = data,entry [ 1] =下一个地址,即大型数组的索引)。但是,这些代码糟糕透了,确实缺少链接列表的意义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。