为什么链表里面的else不能输出(代码中打#的地方)

问题遇到的现象和发生背景 else不能输出(代码中打#的地方)
问题相关代码,请勿粘贴截图
运行结果及报错内容 版本:vs2013
我的解答思路和尝试过的方法 各种if if -else 的切换 还有在外面做标记数的方法,都不行
我想要达到的结果 找不到数据时,输出“该单链表没有%d数据元素”
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>

struct linknode*head = NULL;//全局变量
struct linknode
{
    int data;
    struct linknode *next;

};

struct linknode *creat()//创建链表
{
    int a;
    struct linknode*head,*new,*p;
    head = (struct linknode*)malloc(sizeof(struct linknode));
    if (head != NULL)
    {
        printf("申请内存成功:\n");
        printf("请输入数据:"); scanf("%d", &head->data);
        head->next = NULL;
        p = head;
    }
    else
    {
        printf("申请内存失败\n"); return 0;
    }
    printf("是否继续创建新的节点(输入1:继续 或者0:放弃):");
    scanf("%d",&a);
    while (a)
    {
        new = (struct linknode*)malloc(sizeof(struct linknode));
        if (new != NULL)
        {
            printf("申请内存成功:\n");
            printf("请输入数据:"); scanf("%d", &new->data);
            new->next = NULL;
            p->next = new;
            p = new;
        }
        else
        {
            printf("申请内存失败\n"); return 0;
        }
        printf("是否继续创建新的节点(输入1:继续 或者0:放弃):");
        scanf("%d", &a);


    }
    return (head);

}

void printl(struct linknode *head)//输出链表内容
{
    int j=1;
    struct linknode*p;
    p = head;
    while (p != NULL)
    {
        printf("第%d列",j);
        printf("%d\n", p->data);
        p = p->next;
        j++;
    }
}

int jshu(struct linknode *head)//算有多少个表(求表长)
{
    int j=0;
    struct linknode *p;
    p = head;
    while (p !=NULL)
    {
        p = p->next;
        j++;
    }
    return j;

}

void insert(struct linknode *head)//插入链表
{
    struct linknode*p,*new;
    p = head;
    int a,i;
    printf("选择要插入的列(放在该列的后面):");
    scanf("%d",&a);
    for (i = 0; i < a-1; i++)
    {
        p = p->next;
    }
    new = (struct linknode*)malloc(sizeof(struct linknode));
    if (new != NULL)
    {
        printf("申请内存成功:\n");
        printf("请输入数据:"); scanf("%d", &new->data);
        new->next = p->next;
        p->next = new;
    }
    else
    {
        printf("申请内存失败\n"); return 0;
    }

    
}

struct linknode *delete(struct linknode *head)//删除链表
{
    struct linknode*p, *new,*p1;
    p = head; p1 = head->next;
    int a, i;
    printf("请选择要删除第几列:");
    scanf("%d", &a);
    if (a == 1)
    {
        p = head;
        head = p1;
        free(p);
        return (head);
    }
    else
    {
        for (i = 0; i < a - 2; i++)
        {
            p = p->next;
            p1 = p1->next;
        }
        p->next = p1->next;
        free(p1);
    }
    return (head);
}

void seek(struct linknode *head)//按照位置查找
{
    struct linknode*p, *new, *p1;
    int a, i,zda;
    zda = jshu(head);
    p = head; p1 = head->next;
    printf("现在一共有%d列\n",zda);
    printf("请输入要查找第几列:");
    scanf("%d", &a);
    if (a == 1)
    {
        printf("第1列的数据为:");
        printf("%d\n", p->data);

    }
    else
    {
        for (i = 1; i < a ; i++)
        {
            p=p->next ;
            p1 = p1->next;

        }
        printf("第%d列的数据为:", i );
        printf("%d\n", p->data);
    }
}

void seekdata(struct linknode *head)//按照元素查找
{
    struct linknode*p, *p1;
    int a, i,shu=1,b;
    p = head; p1 = head->next;
    printf("请输入要查找数据元素:");
    scanf("%d", &a);
    while (p->data != a)
    {
        p = p->next;
        p1 = p1->next;
        shu++;
    }
    if (p->data == a)
    {
        printf("找到了\n");
        printf("该数据元素在第%d列,", shu);
        printf("数据为%d\n",  p->data);
        return 0;
        
    }
    else 
    {
        printf("该单链表没有%d数据元素\n", a);/*################################*/
        return 0;
    }

}

void menu()//菜单
{
    int a,bc,k;
    mark:printf("              单链表子系统            \n");
    printf("======================================\n");
    printf("|            1--建立链表             |\n");
    printf("|            2--插入链表             |\n");
    printf("|            3--删除链表             |\n");
    printf("|            4--按位置查找           |\n");
    printf("|            5--按元素值查找         |\n");
    printf("|            6--求表长               |\n");
    printf("|            0--返回                 |\n");
    printf("======================================\n");
    printf("请输入菜单号(0-6)\n");
    scanf("%d",&a);
    switch (a)
    {
    case 0:printf("已经结束单链表子系统 ");return 0;
    case 1:head = creat(); menu(); break;
    case 2:printl(head); insert(head); printl(head); menu(); break;
    case 3:printl(head); head=delete(head); printl(head); menu(); break;
    case 4:seek(head); menu(); break;
    case 5:seekdata(head); menu(); break;
    case 6: bc = jshu(head);printf("表的长度为%d\n",bc); menu(); break;
    default:printf("选择错误请重新选择:"); goto mark;

    }

}

int main()
{
    
    menu();
    return 0;
}

修改处见注释,供参考:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
struct linknode* head = NULL;//全局变量
struct linknode
{
    int    data;
    struct linknode* next;
};
struct linknode* creat()//创建链表
{
    int a;
    struct linknode* head, * New, * p;     //修改
    head = (struct linknode*)malloc(sizeof(struct linknode));
    if (head != NULL)
    {
        printf("申请内存成功:\n");
        printf("请输入数据:"); scanf("%d", &head->data);
        head->next = NULL;
        p = head;
    }
    else
    {
        printf("申请内存失败\n"); return 0;
    }
    printf("是否继续创建新的节点(输入1:继续 或者0:放弃):");
    scanf("%d", &a);
    while (a)
    {
        New = (struct linknode*)malloc(sizeof(struct linknode));
        if (New != NULL)
        {
            printf("申请内存成功:\n");
            printf("请输入数据:"); scanf("%d", &New->data);
            New->next = NULL;
            p->next = New;
            p = New;
        }
        else
        {
            printf("申请内存失败\n"); return 0;
        }
        printf("是否继续创建新的节点(输入1:继续 或者0:放弃):");
        scanf("%d", &a);

    }
    return (head);
}
void printl(struct linknode* head)//输出链表内容
{
    int j = 1;
    struct linknode* p;
    p = head;
    while (p != NULL)
    {
        printf("第%d列", j);
        printf("%d\n", p->data);
        p = p->next;
        j++;
    }
}
int jshu(struct linknode* head)//算有多少个表(求表长)
{
    int j = 0;
    struct linknode* p;
    p = head;
    while (p != NULL)
    {
        p = p->next;
        j++;
    }
    return j;
}
void insert(struct linknode* head)//插入链表
{
    struct linknode* p, * New;  //修改
    if (head == NULL) return;   //修改
    p = head;
    int a, i;
    printf("选择要插入的列(放在该列的后面):");
    scanf("%d", &a);
    for (i = 0; i < a - 1; i++)
    {
        p = p->next;
    }
    New = (struct linknode*)malloc(sizeof(struct linknode));
    if (New != NULL)
    {
        printf("申请内存成功:\n");
        printf("请输入数据:"); scanf("%d", &New->data);
        New->next = p->next;
        p->next = New;
    }
    else
    {
        printf("申请内存失败\n"); 
        return;        //0;   修改
    }

}
struct linknode* Delete(struct linknode* head)//删除链表  修改
{
    struct linknode* p,  * p1;  //* new,修改
    if (head == NULL) return NULL;    //修改
    p = head; p1 = head->next;
    int a, i, zda;
    zda = jshu(head);
    p = head;                
    do {                             // 修改
        printf("请选择要删除第几列(1 - %d):", zda);
        scanf("%d", &a);
    } while (a <= 0 || a > zda);
    if (a == 1)
    {
        p = head;
        head = p1;
        free(p);
        return (head);
    }
    else
    {
        for (i = 0; i < a - 2; i++)
        {
            p = p->next;
            p1 = p1->next;
        }
        p->next = p1->next;
        free(p1);
    }
    return (head);
}
void seek(struct linknode* head)//按照位置查找
{
    struct linknode* p, * p1;    //* new,修改
    int a, i, zda;
    zda = jshu(head);
    if (head == NULL) return;
    p = head;                   //p1 = head->next;  修改
    printf("现在一共有%d列\n", zda);
    do {                             // 修改
        printf("请输入要查找第几列(1 - %d):",zda);
        scanf("%d", &a);
    } while (a <= 0 || a > zda);
    if (a == 1)
    {
        printf("第1列的数据为:");
        printf("%d\n", p->data);
    }
    else
    {
        for (i = 1; i < a; i++) 
        {
            p = p->next;
                               //p1 = p1->next;  修改
        }
        printf("第%d列的数据为:", i);
        printf("%d\n", p->data);
    }
}
void seekdata(struct linknode* head)//按照元素查找
{
    struct linknode* p, * p1;
    int a, shu = 1;   // i, b;             修改
    if (head == NULL) return;       //     修改
    p = head;         // p1 = head->next;  修改
    printf("请输入要查找数据元素:");
    scanf("%d", &a);
    while (p != NULL && p->data != a) //  修改
    {
        p = p->next;
                   //p1 = p1->next;  修改
        shu++;
    }
    if (p != NULL)//(p->data == a)   修改
    {
        printf("找到了\n");
        printf("该数据元素在第%d列,", shu);
        printf("数据为%d\n", p->data);
        return;         //0;   修改
    }
    else
    {
        printf("该单链表没有%d数据元素\n", a);/*################################*/
        return;        //0; 修改
    }
}
void menu()//菜单
{
    int a, bc;   // k;  修改
mark:printf("              单链表子系统            \n");
    printf("======================================\n");
    printf("|            1--建立链表             |\n");
    printf("|            2--插入链表             |\n");
    printf("|            3--删除链表             |\n");
    printf("|            4--按位置查找           |\n");
    printf("|            5--按元素值查找         |\n");
    printf("|            6--求表长               |\n");
    printf("|            0--返回                 |\n");
    printf("======================================\n");
    printf("请输入菜单号(0-6)\n");
    scanf("%d", &a);
    switch (a)
    {
    case 0:printf("已经结束单链表子系统 "); return; //0; 修改
    case 1:head = creat(); menu(); break;
    case 2:printl(head); insert(head); printl(head); menu(); break;
    case 3:printl(head); head = Delete(head); printl(head); menu(); break;  //修改
    case 4:seek(head); menu(); break;
    case 5:seekdata(head); menu(); break;
    case 6: bc = jshu(head); printf("表的长度为%d\n", bc); menu(); break;
    default:printf("选择错误请重新选择:"); goto mark;
    }
}
int main()
{
    menu();
    return 0;
}