这是一个链表,问题在"删除一个结点在输出后出现一堆乱码",希望帮看一下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct staff{
int num;
char name[4];
struct staff *next;
}Node;
int main(void)
{
int n;
Node *head,*p,*last;
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
last=head;
while(n!=4){
printf("1.添加员工\n2.删除员工\n3.员工表\n4.退出\n");
scanf("%d",&n);
switch(n){
case 1:
int num;
char name[20];
printf("输入员工号及姓名:\n");
p=(Node *)malloc(sizeof (Node));
scanf("%d %s",&num,&name);
p->num=num;
strcpy(p->name,name);
p->next=NULL;
last->next=p;
last=p;
break;
case 2:
int number;
Node *q,*l;
printf("输入员工号:");
scanf("%d",&number);
p=head->next;
while(p){
q=p->next;
if(p->num==number){
free(p);
}
p=q;
}
break;
case 3:
for(p=head->next;p!=NULL;p=p->next){
printf("%d %s\n",p->num,p->name);
}
break;
case 4:
break;
}
}
return 0;
}

case 1:中:
scanf("%d %s",&num,&name);这里,name前面不需要&
case 2逻辑错误。
代码修改如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct staff{
    int num;
    char name[4];
    struct staff *next;
}Node;
int main(void)
{
    int n;
    Node *head,*p,*last;
    head=(Node *)malloc(sizeof(Node));
    head->next=NULL;
    last=head;
    while(n!=4){
        printf("1.添加员工\n2.删除员工\n3.员工表\n4.退出\n");
        scanf("%d",&n);
        switch(n){
case 1:
    int num;
    char name[20];
    printf("输入员工号及姓名:\n");
    p=(Node *)malloc(sizeof (Node));
    scanf("%d %s",&num,name); //修改1 
    p->num=num;
    strcpy(p->name,name);
    p->next=NULL;
    last->next=p;
    last=p;
    break;
case 2:
    int number;
    Node *q,*l;
    printf("输入员工号:");
    scanf("%d",&number);
    p=head->next;
    q= head;
    while(p){
        if(p->num==number){
            q->next = p->next;
            free(p);
            break;
        }else
        {
            q = p;
            p = p->next;
        }
    }
    break;
case 3:
    for(p=head->next;p!=NULL;p=p->next){
        printf("%d %s\n",p->num,p->name);
    }
    break;
case 4:
    break;
        }
    }
    return 0;
}