有人可以帮助我,我无法在链表的代码中找到错误

时间:2017-04-21 01:12:15

标签: c

#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);
}

2 个答案:

答案 0 :(得分:1)

您必须传递头指针的引用以在函数插入时编辑它。 也许像:插入(&amp; head,v)和功能插入更改

randomNumber=$((1 + RANDOM % 100))

它可能有用!

答案 1 :(得分:0)

这是一个简单的程序,可以解释Binh 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是指向整数的指针。 我为一个整数分配了足够的内存。 让我们说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。

第7行 现在pi1的值不再是NULL,它的内存地址为int。 这与*(0XBBBB)相同,它取消引用此存储器地址的值,其值为10000.

再次感谢Bing Nguyen的解决方案。 希望这个解释可以更好地理解。