I made few changes in your code, where you did wrong.
/* FIXED */
#include <stdio.h>
#include <stdlib.h>
struct node{
int data ;
struct node *link;
};
void append(struct node **q,int num){
struct node *temp,*r; // here it should be *r because you are using malloc which returns the addreass location
if(*q==NULL){
temp=(struct node*)malloc(sizeof (struct node)); // here it should be struct node * because of memory location which it pointer
temp->data=num;
temp->link=NULL;
*q=temp;
}
else{
temp=*q; // here it shoulb be *q instead q because it'a double pointer
/* go to the last node */
while (temp->link!=NULL){ // here it should be temp->link instead temp because we need last node to insert new node
temp=temp->link;
}
/* add a new node */
r=(struct node*)malloc(sizeof (struct node));
r->data=num;
r->link=NULL;
temp->link=r;
}
}
void display(struct node *q){
while(q!=NULL){
printf("%d",q->data);
printf("\n");
q=q->link;
}
}
int main(void){
struct node *p=NULL;
append(&p,30);
append(&p,55);
display(p);
}