c语言中的Malloc链表

c语言中的Malloc链表,c,linked-list,dynamic-memory-allocation,C,Linked List,Dynamic Memory Allocation,我是C新手。我需要使用malloc在C中创建一个链表,我应该在struct list*solution()中创建我的解决方案。给定一个数字列表,我需要它们显示,直到给出int-1。创建链表后,返回一个指向链表根节点的指针。到目前为止,我只能在程序执行后得到一个数字 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct list{ int value; st

我是C新手。我需要使用malloc在C中创建一个链表,我应该在struct list*solution()中创建我的解决方案。给定一个数字列表,我需要它们显示,直到给出int-1。创建链表后,返回一个指向链表根节点的指针。到目前为止,我只能在程序执行后得到一个数字

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

typedef struct list{
    int value;
    struct list *next;
} List ;

struct list* solution()
{
    int n = 0, a;
    List *listpointer;
    List *listpointer2;
    listpointer = ( List* ) malloc( 200 * sizeof(List*));
    listpointer2 = ( List* ) malloc( 200 * sizeof(List*));
    //for(n = 0; n < 7; n++)
    do   
    {
        scanf("%d", &a);
        if(a < 0)
        {
            listpointer[n].next = NULL;   
            break;
        }
        listpointer[n].value = a;
        listpointer[n].next = listpointer2[n].next;

        n++;
        //scanf("%d", &a);
        //listpointer2[n].value = a;
        //listpointer2[n].next = listpointer2[n].value;
    }while( a > 0);

    return listpointer;
}

int main()
{
    struct list *l=NULL,*temp;
    l = solution();
    if(l==NULL)
        printf("list is empty");
    else
    {
        do{
            printf("%d ",l->value);
            temp = l;
            l = l->next;
        }while(temp->next!=NULL);
    }
}
#包括
#包括
#包括
类型定义结构列表{
int值;
结构列表*下一步;
}名单;
结构列表*解决方案()
{
int n=0,a;
列表*列表指针;
列表*列表指针2;
listpointer=(列表*)malloc(200*sizeof(列表*);
listpointer2=(列表*)malloc(200*sizeof(列表*);
//对于(n=0;n<7;n++)
做
{
scanf(“%d”和“&a”);
if(a<0)
{
listpointer[n].next=NULL;
打破
}
listpointer[n]。值=a;
listpointer[n].next=listpointer2[n].next;
n++;
//scanf(“%d”和“&a”);
//listpointer2[n]。值=a;
//listpointer2[n].next=listpointer2[n].value;
}而(a>0);
返回列表指针;
}
int main()
{
结构列表*l=NULL,*temp;
l=溶液();
if(l==NULL)
printf(“列表为空”);
其他的
{
做{
printf(“%d”,l->value);
温度=l;
l=l->next;
}while(临时->下一步!=NULL);
}
}

我希望输出是2 6 4 7 8 2 9,但到目前为止,我只能产生2或9的输出。

您不应该分配数组。创建链表时,每次通过循环分配一个列表节点

您需要两个变量--
head
是指向列表中第一个节点的指针,
listpointer
是指向最后一个元素的指针,我们希望在其中附加下一个节点

struct list* solution()
{
    int n = 0, a;
    List *listpointer = NULL;
    List *head = NULL;
    while(1)
    {
        scanf("%d", &a);
        if(a < 0)
        {
            break;
        }
        List *newNode = malloc(sizeof(List));
        newNode->value = a;
        newNode->next = NULL;
        if (listpointer) {
            listpointer->next = newNode;
            listpointer = newNode;
        } else {
            listpointer = newNode;
            head = newNode;
        }
    }

    return head;
}
struct list*解决方案()
{
int n=0,a;
List*listpointer=NULL;
列表*head=NULL;
而(1)
{
scanf(“%d”和“&a”);
if(a<0)
{
打破
}
List*newNode=malloc(sizeof(List));
新建节点->值=a;
newNode->next=NULL;
如果(列表指针){
listpointer->next=newNode;
listpointer=newNode;
}否则{
listpointer=newNode;
头=新节点;
}
}
回流头;
}

它可以更简单:
而(l!=NULL){printf(“%d”,l->value);l=l->next;}
。除此之外,请不要将
l
用作变量名。它看起来太像
1
。欢迎使用堆栈溢出!您没有分配链接列表。您正在分配一个
List
对象数组。
listpointer2[n]。next
从未分配过任何值,您希望得到什么
listpointer[n]。next=listpointer2[n]。next要做什么?@barmar sizeof在工作中出错了。谢谢你的解释和代码。