play with pointer

my user-defined data data type is as follows:

struct list {
char ar[10];
struct list * next;
};

then i have done the following:

void insert(struct list * p, char * n){
struct list * tmp =(struct list*)malloc(sizeof(struct list));
strcpy(tmp->ar,n);
tmp->next =NULL;
if(p==NULL){
p = tmp;
return;
}

while(p->next!=NULL)
p = p->next;
p->next = tmp;
}

int main(){
struct list * link = NULL;
charĀ  ar[10];
fgets(ar,9,stdin);
insert(link,ar);
puts(link,ar);
return 0;
}

will this work? nope

two workarounds:

//method 1
void insert(struct list **p, char *n){
struct list *tmp = (struct list *)malloc(sizeof(struct list));
struct list * t =NULL;
strcpy(tmp->ar,n);
tmp->next =NULL;
if((*p)==NULL){
*p = tmp;
}
else{
t = *p;
while(t->next!=NULL)
t =t->next;
t->next = tmp;
}
}

int main(){
struct list * link =NULL;
struct list * t = NULL;
int i = 0;
char ar[10];
printf(“get text:\n”);
for(i=0;i<5;i++){
fgets(ar,9,stdin);
insert(&link,ar);
}
printf(“put text:\n”);
for(t=link;t!=NULL;t=t->next)
puts(t->ar);
return 0;
}

// method 2
struct list * insert(struct listĀ  * p, char * n){
struct list *tmp = NULL;
struct list *head;
if(p==NULL){
p = (struct list*)malloc(sizeof(struct list));
strcpy(p->ar,n);
p->next =NULL;
return p;
}
else
{
head = p;
tmp =(struct list*)malloc(sizeof(struct list));
strcpy(tmp->ar,n);
tmp->next =NULL;
while(p->next!=NULL){
p = p->next;
}

p->next = tmp;
}
return head;
}

int main(){
struct list * link =NULL;
struct list * t =NULL;
char ar[10];
int i =0;
printf(“get text:\n”);
for(i=0;i<5;i++)
{
fgets(ar,9,stdin);
link = insert(link,ar);

}
printf(“print text:\n”);
for(t = link;t!=NULL;t = t->next)
{
puts(t->ar);
}

return 0;
}