如何解决链表不带结构,但仅使用数组
#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 举报,一经查实,本站将立刻删除。