我想创建一个链表的数组,其中每个数组元素都是链表的节点。基本上,我想通过数组元素索引链表。假设我们有一个数组a [20],其中每个元素代表一个链表的节点。图片如下: -
我创建了一个链接列表,它将输入并打印列表。但是,我需要帮助来用数组索引它。这是我的链表。
#include <stdio.h>
#include <stdlib.h>
int a[20];
typedef struct Node {
int data;
struct Node *next;
} Node;
void insert_beg_of_list(Node *current, int data);
void print_list(Node *current);
void insert_beg_of_list(Node *current, int data) {
//keep track of first node
Node *head = current;
while(current->next != head) {
current = current->next;
}
current->next = (Node*)malloc(sizeof(Node));
current = current->next;
current->data = data;
current->next = head;
}
void print_list(Node *current) {
Node *head = current;
current = current->next;
while(current != head){
printf(" %d ", current->data);
current = current->next;
}
}
int main() {
Node *head = (Node *)malloc(sizeof(Node));
head->next = head;
int data = 0 ;
int usr_input = 0;
int i;
int m;
scanf("%d", &usr_input);
for (i=0; i<usr_input; i++) {
scanf("%d", &data);
insert_beg_of_list(head, data);
}
printf("The list is ");
print_list(head);
printf("\n\n");
return 0;
}
举个例子: -
它现在做了什么: -
Input :- Number of elements = 5
Input :- Elements = 1 2 3 4 5
Output :- 1 2 3 4 5
我期待的是: -
Input :-
Number of elements for a[0] = 4
Input for a[0] = 1 2 3 4
Number of elements for a[1] = 4
Input for a[1] = 2 3 5 4
Expected Output :-
a[0] = 1 2 3 4
a[1] = 2 3 5 4
这是带有Array元素的修改代码。我将数据存储在current [0]
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *current[20];
void insert_beg_of_list(Node *current[0], int data);
void print_list(Node *current[0]);
void insert_beg_of_list(Node *current[0], int data) {
//keep track of first node
Node *head = current[0];
while(current[0]->next != head) {
current[0] = current[0]->next;
}
current[0]->next = (Node*)malloc(sizeof(Node));
current[0] = current[0]->next;
current[0]->data = data;
current[0]->next = head;
}
void print_list(Node *current[0]) {
Node *head = current[0];
current[0] = current[0]->next;
while(current[0] != head){
printf(" %d ", current[0]->data);
current[0] = current[0]->next;
}
}
int main() {
Node *head = (Node *)malloc(sizeof(Node));
head->next = head;
int data = 0 ;
int usr_input = 0;
int i;
int m;
int j;
scanf("%d", &usr_input);
for (i=0; i<usr_input; i++) {
scanf("%d", &data);
insert_beg_of_list(head, data);
}
printf("The list is ");
print_list(head);
printf("\n\n");
return 0;
}
显示分段错误。
答案 0 :(得分:0)
如果要在数组的每个索引中存储新的链接列表,则不能使用相同的head
节点(main
函数中第1行的节点)。它应该为数组中的每个索引分配一个新的头节点,然后在其后推送其余的数据。
编辑 BTW:您的代码与您附加的图片不一致:在我的回答中,我假设您想要一个像图像中那样的数据结构。另一方面,在你的代码中,根据你只调用一次的函数print_list
(而不是数组中的每个索引),根据你只有一个头节点的事实,也许你想要别的东西(只有一个一般清单?),然后它并不是很清楚你的意思。
答案 1 :(得分:0)
我认为你想要一个链接List的数组,显然每个链接应该有单独的头节点。如果我认为正确,那么你可以看到下面给出的代码。在发布之前检查它。
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node *next;
}*head[5];
void create(int count);
void print(int count);
int main()
{
int i,n;
n=5; /*n is the total number of nodes */
for(i=0;i<n;i++)
{
head[i]=NULL;
create(i);
print(i);
printf("\n\n");
}
return 0;
}
void create(int count)
{
int n2=5; /*n2 is the number of nodes in a single linked list*/
int j;
struct node *temp;
for(j=0;j<5;j++)
{
if(head[count]==NULL)
{
temp=(struct node*)malloc(sizeof(struct node));
temp->data=j+5+count;
temp->next=NULL;
head[count]=temp;
}
else
{
temp->next=(struct node*)malloc(sizeof(struct node));
temp=temp->next;
temp->data=j+5+count;
temp->next=NULL;
}
}
}
void print(int count)
{
struct node *temp;
temp=head[count];
while(temp!=NULL)
{
printf("%d->",temp->data);
temp=temp->next;
}
}
答案 2 :(得分:0)
嘿,这个用 C 语言编写的简单代码可能对您有所帮助:
#include "stdio.h"
#include "stdlib.h"
struct node {
int data;
struct node *next;
}*head;
struct node *temp;
int main(){
int size,si;
printf("\nEnter the size of array : ");
scanf("%d",&size);
struct node *A[size];
for(int i=0;i<size;i++){
printf("\nEnter the size of linked list in array[%d] : ",i);
scanf("%d",&si);
head = (struct node *)malloc(sizeof(struct node));
printf("\nEnter the data:");
scanf("%d",&head -> data);
head -> next = NULL;
temp = head;
for(int j=1;j<si;j++){
struct node *new = (struct node *)malloc(sizeof(struct node));
printf("\nEnter the data:");
scanf("%d",&new -> data);
new -> next = NULL;
temp -> next = new;
temp = new;
}
A[i] = head;
}
for(int i=0;i<size;i++){
printf("\nArr[%d] => ",i);
struct node *p;
p = A[i];
while(p!=NULL){
printf("%d\t",p->data);
p = p -> next;
}
printf("\n");
}
return 0;
}
:输出:
Enter the size of array : 3
Enter the size of linked list in array[0] : 3
Enter the data:1
Enter the data:2
Enter the data:3
Enter the size of linked list in array[1] : 5
Enter the data:1
Enter the data:2
Enter the data:3
Enter the data:4
Enter the data:5
Enter the size of linked list in array[2] : 4
Enter the data:9
Enter the data:8
Enter the data:7
Enter the data:6
Arr[0] => 1 2 3
Arr[1] => 1 2 3 4 5
Arr[2] => 9 8 7 6
Program ended with exit code: 0
<块引用>
说明:在这个程序中,我创建了一个动态的用户数组 定义大小,然后创建一个用户定义大小的链表和 在数组的每个块中分配每个链表的头部。我有 显示了直接实现,所以一切都在主函数中,但是 这也可以通过创建单独的函数来完成。