如何在c函数中返回列表?

时间:2018-03-24 20:44:58

标签: c list

正如标题所说我需要编写一个函数来填充用户输入的int列表,然后打印它们,但是我遇到了插入函数的麻烦,它实际上并没有输入值列表。这是代码:

typedef:

typedef struct list_element {
    int value;
    struct list_element *next;
} item;

typedef item *list;

和功能:

list lins(list l)
{
    int i;
    list root = NULL;
    printf("inserire dati ('0' per terminare):\n");
    do
    {
        scanf("%d", &i);
        l = (list)malloc(sizeof(item)); 
        l->value = i;
        l->next = root;
        root = l;
    } while (i != 0);
    return l;
}

void showlist(list l)
{
    printf("lista completa:\n");
    while (l != NULL)
    {
        printf("%d ", l->value);
        l = l->next;
    }
    printf("\n");
}

很抱歉,如果我的代码写得不好,但我很难理解列表的概念。

编辑:添加了函数调用

main()
{
    lins(l);
    showlist(l);
}

编辑2:这是代码的输出:

output

编辑3:这是我教授给我们使用列表的代码示例:

http://www.mediafire.com/file/wj152pw1ojkxf1j/10a_-Liste-_2018.pdf

4 个答案:

答案 0 :(得分:1)

首先,我认为将项目* l作为lins函数的参数传递没有意义。

除非您要删除列表,否则在为其指定内容后,不应更改列表的root或更高版本。

void lins(item **head){
    item *new_node = malloc(sizeof(item));
    int i;

    if(!new_node){
        printf("Memory allocation failed!\n");
        exit(1);
    }

    scanf("%d", &i);

    new_node->value = i;
    new_node->next = NULL;

    node *temp = *head;

    if(!temp)
        *head = new_node;
    else{
        while (temp->next != NULL){
            temp = temp->next;
        }
        temp->next = new_node;
    }
    return ;
}

在你写下这样的lins之后,showlist看起来如下:

void showlist(item *head){
    printf("List is: \n");
    do{
        printf("%d", head->value);
        head=head->next;
    }while(head!=NULL);
}

至于主要功能,首先需要声明头部。

int main(){
    item *head = NULL;
    lins(&head);
    showlist(head);
    return 0;
}

更详细的解释......

答案 1 :(得分:1)

您的插入功能按相反顺序插入。这是因为您将root分配给l->nextl分配给root。当用户尝试结束插入过程时,列表中还包含数字0

main()中,您似乎没有将函数lins()的返回值赋给变量,并且如果您传递l声明为List l = NULL;对于函数lins(),将使用它的副本,因此,原始变量不会被更改。你真正需要的是:

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

typedef struct list_element {
    int value;
    struct list_element *next;
} item;

typedef item *list;


list lins(void)
{
    list node = NULL;
    list root = NULL;
    list tail = NULL;

    printf("inserire dati ('0' per terminare):\n");

    int i;
    scanf("%d", &i);
    while(i != 0)
    {
        node = (list)malloc(sizeof(item));
        node->value = i;
        node->next = NULL;

        if (!root)
            root = node;
        else
            tail->next = node;
        tail = node;
        scanf("%d", &i);
    }
    return root;
}

void showlist(list l)
{
    printf("lista completa:\n");
    while (l != NULL)
    {
        printf("%d ", l->value);
        l = l->next;
    }
    printf("\n");
}


int main(void)
{
    list head = lins();
    showlist(head);

    system("pause");
    return 0;
}

当然,我应该指出,一旦你完成它就应该释放清单。

答案 2 :(得分:1)

因此,根据我的理解,您希望在您的链接列表前加上。我将尝试使用你的typedef,尽管很多评论都提供了更好的选择,你可以稍后改变实现。

意识到lins(list l)永远不会使用传递给它的参数l的值。这被malloc覆盖。它将元素添加到列表中,最后返回列表的新头。必须将新头传递给showlist()进行打印。您可能正在做的是在main中初始化列表中的一个元素,并将其传递给linsshowlistlins不会打扰参数并返回一个全新的列表,但是当您将旧列表传递给showlist时,它会被解释为空列表。

因此,您只需更改lins的使用情况即可用作链接列表的创建者。

声明list lins() {...}并在此main()中使用它应该有效:

int main() {
    list l;
    l = lins();
    showlist(l);
    return 0;
}

答案 3 :(得分:0)

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

void lins(list *l){
list tmp = NULL;
list last = *l;
int i;
if (last){
    while(last->next){ // go to last child of list
        last = last->next;
    }
}else{
    last = (list)malloc(sizeof(struct list_element));
}

printf("inserire dati ('0' per terminare):\n");
do
{
    scanf("%d", &i);
    last->value = i; 
    last->next = (list)malloc(sizeof(struct list_element));
    last = last->next;
} while (i != 0);}

void show(list li){
list tmp = li;
if(li){
    while(tmp){
    printf("%d at %p\n",tmp->value, tmp);
    tmp = tmp->next;
    }
}}

int main(){
list a = (list)malloc(sizeof(struct list_element));
lins(&a);
show(a);
return 0;}