2017-04-21 32 views
-4
#include <stdio.h> 
#include <stdlib.h> 

typedef struct lista { 
    int val; 
    struct lista *next; 
} lista; 

void print(lista *head){ 
    printf("List:"); 
    while(head != NULL){ 
    printf("%d; ", head->val); 
    head = head->next;} 
} 

void insert(lista *p,int v){  
    lista *novo; 
    if(p == NULL){ 
    novo = malloc(sizeof(lista)); 
    novo->val = v; 
    novo->next = NULL; 
    p = novo;} 
    else{ 
    novo =malloc(sizeof(lista)); 
    novo->val = v; 
    novo->next = NULL; 
    p->next = novo; 
    } 
} 

int main() 
{ 
    lista *head=NULL; 
    int v; 
    printf("Write the values u want to put in your list.(write 0 to exit)\n"); 
    while (v != 0){ 
    scanf("%d",&v); 
    insert(head,v);} 
    print(head); 
} 
+0

如果发生错误,输出记录中将出现一条错误消息,请查看。 –

+0

问题是我无法打印列表。我不认为这是保存价值。 –

+1

寻求调试帮助的问题(“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者无益。 – DyZ

回答

1

您必须通过头指针的引用来编辑它在函数插入。 也许就像:插入(&头,V)和功能插入变化

void insert(lista **p,int v){ 
    lista *novo; 
    if(*p == NULL){ 
    novo = malloc(sizeof(lista)); 
    novo->val = v; 
    novo->next = NULL; 
    *p = novo;} 
    else{ 
    lista *head = *p; 
    while(head->next != NULL){ 
     head = head->next; 
    } 
    novo =malloc(sizeof(lista)); 
    novo->val = v; 
    novo->next = NULL; 
    head->next = novo; 
    } 
} 

它也许工作!

0

下面是一个简单的程序可以解释其平Ngyuyen提供的代码:

void 
set_sp1(int **x) //line #3 
{ 
    int *i = malloc(sizeof(int)); //line #4 

    *i = 10000; //line #5 

    *x = i; //line #6 
} 

int 
main(void) 
{ 
    int *pi1 = NULL; //line #1 

    set_sp1(&pi1); //line #2 
    printf("%d\n", *pi1); //line #7 

    return 0; 
} 

这里是说明:

线#1

PI1是指向整数是初始化为NULL。 这个说法是什么意思? 可以说pi1变量占用0XFFFF的内存地址。 pi1的值当前是一个NULL值。

因为它是一个指向整数的指针,所以pi1最终需要有一个值,它是一个整数的内存地址。

pi1 
------------ 
| NULL | 
------------ 
0XFFFF 

线#2

该参数被发送PI1的地址。 所以。在这个例子中,它就像set_sp1(0XFFFF);

线路#3

在收到此参数,类型变为双指针,因为单个指针的地址为int发送。 x的值是0XFFFF。

 x 
     ------------ 
     | 0XFFFF | 
     ------------ 

线#4

变量i是一个指针,指向一个整数。 我分配一个足够的内存整数。 可以说我的内存地址在0XAAAA。 内存分配地址是0XBBBB。 i的值是0XBBBB。 这是一件值得记住的重要事情。 变量i是局部变量。所以它将驻留在堆栈内存中。 在此函数结束时,堆栈内存应该被清除。 但是,0XBBBB在堆内存中。所以在函数结束时不会被消除。

  i       a memory for int 
      ------------    ------------ 
      | 0XBBBB |    |   | 
      ------------    ------------ 
      0XAAAA      0XBBBB 

线#5 这一行解引用0XBBBB以存储在地址0XBBBB值10000。现在

 -------- 
     |10000 | 
     -------- 
     0XBBBB 

线#6 ,压轴,*(0xFFFF)时= 0XBBBB。 0XFFFF的值为NULL。 但现在它有0XBBBB。

------------ 
| 0XBBBB | 
------------ 
0XFFFF 

再次,存储在0XBBBB的值是10000。

line#7 现在pi1的值不再是NULL,它有一个int的内存地址。 这与*(0XBBBB)是相同的,该值是在此存储器地址处具有值10000的值。

再次感谢Bing Nguyen提供的解决方案。 希望这个解释能让人更好的理解。

相关问题