#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 :(得分: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的解决方案。 希望这个解释可以更好地理解。