使用typedefinitions:
typedef struct Node *List;
typedef struct Node {
int item;
List next;
} Node;
我发现的递归解决方案:
List arrayToList(int arr[],int n,int idx) {
if (n==idx) return NULL;
List list=malloc(sizeof(Node));
list->next=arrayToList(arr,n,idx+1);
list->item=arr[idx];
return list;
}
更新:以下几乎是正确的,但我不知道为什么最后打印零。
List newNode() {
List li=malloc(sizeof(Node));
return li;
}
List arrayToList(int arr[],int n) {
List li=newNode();
List li1=li; /*save the beginning of the list*/
int i;
for (i=0;i<n;i++) {
li->item=arr[i];
li->next=newNode();
li=li->next;
}
li=NULL;
return li1;
}
void printList(List li) {
while (li!=NULL) {
li=li->next;
}
printf("\n");
}
int main(int argc, char* argv[]) {
int arr[]={4,1,2,3,4,7,4,5,6,8};
List li=arrayToList(arr,10);
printList(li);
return 0;
}
我得到的输出是:4 1 2 3 4 7 4 5 6 8 0。
更新2:将函数printList更改为此函数可以正确输出:
void printList(List li) {
while (li->next!=NULL) {
printf("%d ",li->item);
li=li->next;
}
printf("\n");
}
但是我想知道为什么我应该li->next!=NULL
作为警卫?
答案 0 :(得分:0)
初始化您的第一个元素:
Node *head = (Node*) malloc(sizeof(Node));
head->data = arr[0];
您需要一个指针来跟踪您当前的位置:
Node *curr = head;
创建一个for循环:
for(int i = 1; i < len; i++)
{
}
然后为每个元素添加一个新节点并向前移动指针。
curr->next = (Node*) malloc(sizeof(Node));
curr = curr->next;
curr->data = arr[i];
不要忘记将列表的最后一个元素设置为null! (这可能发生在for循环之外。)
n->next = NULL;
答案 1 :(得分:0)
这样做:
typedef struct node {
int data;
struct node *next;
} Node;
请注意,您希望next
指向下一个节点,而不是列表。
Node* arrayToList(int arr[],int n,int idx) {
if (n==idx) return NULL;
Node* headOfList = (Node*) malloc(sizeof(Node));
Node* tail = headOfList;
int i = n;
for(; i < idx; i++) {
// Create node
Node* node = (Node*) malloc(sizeof(Node));
node->data = arr[i];
node->next = NULL;
// Link Node to current list
tail->next = node;
tail = node;
}
return headOfList;
}
这只是一个粗略的草稿(我没有用编译器试过),但这个想法就在那里。