正如标题所说我需要编写一个函数来填充用户输入的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:这是代码的输出:
编辑3:这是我教授给我们使用列表的代码示例:
http://www.mediafire.com/file/wj152pw1ojkxf1j/10a_-Liste-_2018.pdf
答案 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->next
和l
分配给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中初始化列表中的一个元素,并将其传递给lins
和showlist
。 lins
不会打扰参数并返回一个全新的列表,但是当您将旧列表传递给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;}