C语言 用单链表实现栈的功能 请问pop如何实现 小弟我这错在哪里

C语言 用单链表实现栈的功能 请教pop怎么实现 我这错在哪里

#include<stdio.h>
#include<stdlib.h>

struct node{
int data;
struct node *next;
};
struct node *head,*current,*temp;
int length(){
int length=0;
current=head;
if(head==NULL)
return 0;
else{
while(current!=NULL){
length++;
current=current->next;
}
return length;
}
}
void push(int num){
struct node *pnode=(struct node*)malloc(sizeof(struct node));
current=head;
pnode->data=num;
if(head==NULL){ 
head=pnode;
head->next=NULL;
}
else{
while(current->next!=NULL){
current=current->next;
}
current->next=pnode;
pnode->next=NULL;
pnode=current;
}
}
void pop(){
temp=(struct node*)malloc(sizeof(struct node));
current=head;
if(head!=NULL){
while(current->next!=NULL){
current=current->next;
}
temp=current->next;
current->next=temp->next;
free(temp);
}
else
printf("stack is empty!\n");
}
void print(){
current=head;
if(head!=NULL){
while(current!=NULL){
printf("%d\t",current->data);
current=current->next;
}
}
else printf("stack is empty!\n");
printf("\n");
}
int main(){
head=(struct node *)malloc(sizeof(struct node));
head=NULL;
printf("                  1:length\n");
printf("                  2:push\n");
printf("                  3:pop\n");
printf("                  4:print\n");
printf("                  0:exit\n");
int choice;
int number;
while(1){
printf("please enter your choice:");
scanf("%d",&choice);
switch(choice){
case 1:
printf("stack size is:%d\n",length(head));
break;
case 2:
printf("please enter a number:");
scanf("%d",&number);
push(number);
print();
break;
case 3:
pop();
break;
case 4:
print();
break;
case 0:exit(0);
default:
printf("wrong choice!\n");
break;
}
 0;
}

------解决方案--------------------
        while(current->next!=NULL){
            current=current->next;
        }
        temp=current->next;
        current->next=temp->next;

wihle之后,current->next == NULL,也就是temp = NULL;
那么,temp->next 就是非法的。
------解决方案--------------------
LIFO,所以改用头插法吧,pop/push不需要去遍历整个链表...
------解决方案--------------------
pop是出栈, 你又new一个出来, 明显是不对的.

void pop(){
    if(head == NULL)
    {
          printf("stack is empty!\n");//这里可以打印点东西
         return;  //如果头节点也是空, 则还没有任何数据, 直接返回.
    }
    temp=head; //保存当前的head
    head = head->next; //head指向栈中的下一个元素(也就相当于出栈了).
    free(temp);  //释放原来的头节点
    temp = NULL;  //防止野指针
  
}

------解决方案--------------------
int main(){
    head=(struct node *)malloc(sizeof(struct node));
    head=NULL;


应该是head->next=NULL;