but 哥 2021-12-03 13:28 采纳率: 100%
浏览 30
已结题

为什么链表里面的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;
}

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-12-03 15:08
    关注

    修改处见注释,供参考:

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月11日
  • 已采纳回答 12月3日
  • 创建了问题 12月3日

悬赏问题

  • ¥15 像这种代码要怎么跑起来?
  • ¥15 怎么改成循环输入删除(语言-c语言)
  • ¥15 安卓C读取/dev/fastpipe屏幕像素数据
  • ¥15 pyqt5tools安装失败
  • ¥15 mmdetection
  • ¥15 nginx代理报502的错误
  • ¥100 当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧
  • ¥15 图示五个参数的模型校正是用什么方法做出来的。如何建立其他模型
  • ¥100 描述一下元器件的基本功能,pcba板的基本原理
  • ¥15 STM32无法向设备写入固件