Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 蹦蹦跳跳;从多类型堆栈获取值_C_Linked List_Stack - Fatal编程技术网

C 蹦蹦跳跳;从多类型堆栈获取值

C 蹦蹦跳跳;从多类型堆栈获取值,c,linked-list,stack,C,Linked List,Stack,我有一个堆栈(使用链表结构实现),它包含两种类型:char*(保存字符串的值)和double(保存数字的值)。 我有一个Pop函数,它是void,从堆栈中弹出顶部值。但我也希望能够获得这种价值 但是我不知道怎么做,因为我不能在C中重载函数,这将允许我有两个返回各自类型的Pop函数(一个是char*,另一个是double类型)。有人知道另一种方法吗? 以下是我迄今为止的代码: #包括 #包括 #包括 #包括 #包括 #包括 typedef结构堆栈 { char*valC; 双谷; 结构堆栈*下一

我有一个堆栈(使用链表结构实现),它包含两种类型:char*(保存字符串的值)和double(保存数字的值)。 我有一个Pop函数,它是void,从堆栈中弹出顶部值。但我也希望能够获得这种价值

  • 但是我不知道怎么做,因为我不能在C中重载函数,这将允许我有两个返回各自类型的Pop函数(一个是char*,另一个是double类型)。有人知道另一种方法吗?

  • 以下是我迄今为止的代码:
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    typedef结构堆栈
    {
    char*valC;
    双谷;
    结构堆栈*下一步;
    }节点;
    node*head=NULL;
    整数isnumber(字符*str)
    {
    int i;
    对于(i=0;str[i]!='\0';i++)
    {
    if(!isdigit(str[i]))
    返回(0);
    }
    申报表(1);
    }
    节点*获取节点(无效*项)
    {
    节点*温度;
    temp=(node*)malloc(sizeof(node));
    如果(temp==NULL)printf(“无法分配内存”);
    温度->价值=项目;
    temp->next=NULL;
    返回(临时);
    }
    无效推送(字符*项,双数字,节点**头)
    {
    node*New=(node*)malloc(sizeof(node));
    如果(New==NULL)printf(“无法分配内存”);
    新建->值=num;
    新建->增值=项目;
    //节点*获取节点(void*);
    //新建=获取节点(项目);
    新建->下一步=*头部;
    *头=新的;
    }
    int Sempty(节点*temp)
    {
    if(temp==NULL)
    返回1;
    其他的
    返回0;
    }
    void Pop(节点**头部)
    {
    字符*项目;
    双项n;
    节点*温度;
    node*prev=(node*)malloc(sizeof(node));
    //项目=(*总目)->valC;
    //itemN=(*head)->valNum;
    温度=*水头;
    上一个->下一个=温度;
    *头部=(*头部)->下一个;
    免费(临时);
    如果(上一个->值!=NULL)
    {
    返回(上一个->值);
    }
    否则如果(上一个->值>0)
    {
    返回(上一个->值);
    }
    }
    双PopN(节点**头)
    {
    双项n;
    节点*温度;
    itemN=(*head)->valNum;
    温度=*水头;
    *头部=(*头部)->下一个;
    免费(临时);
    返回(项目n);
    }
    无效显示(节点**头)
    {
    节点*温度;
    温度=*水头;
    字符*错误;
    if(表面(温度)){
    printf(“空堆栈!\n”);
    error=“::error::\n”;
    推送(错误、0和温度);
    }
    其他的
    {
    while(temp!=NULL)
    {
    如果(temp->valC!=NULL)printf(“%s\n”,temp->valC);
    如果(temp->valNum>0)printf(“%f\n”,temp->valNum);
    温度=温度->下一步;
    }
    }
    }
    void main()
    {
    node*inp=(node*)malloc(sizeof(node));;
    而(1)
    {
    printf(“repl>”);
    字符*存储[30];
    char*tok;
    加倍我的双倍;
    字符缓冲区[50];
    int pos=0;
    fgets(缓冲区、sizeof(缓冲区)、stdin);
    tok=strtok(缓冲区“”);
    while(tok!=NULL)
    {
    如果(strcmp(tok,“add”)==0)printf(“YES!!”);
    如果(strcmp(tok,“add\n”)==0)printf(“YELZZ!!!”);
    如果(strcmp(tok,“退出”)==0)退出(1);
    否则如果(strcmp(tok,“quit\n”)==0)退出(1);
    如果(strcmp(tok,“pop”)==0)
    {
    波普(头部);
    打破
    }
    else if(strcmp(tok,“pop\n”)==0)
    {
    波普(头部);
    打破
    }
    如果(sscanf(tok、%lf、&my_double)>0)
    {
    推送(空,我的双,头);
    }
    其他的
    推压(标准向上(tok)、0和头部);
    //if(Sempty(head))推送(“::错误:”,0,&head);
    tok=strtok(空,“”);
    }
    显示器(&head);
    }
    

    }

    您可以做的一件事是编写一个void*类型的指针,然后您可以稍后将其类型转换为所需的类型

    我将给出一个示例,您可以从中获得实现pop()的想法

    对于pop(),您甚至可以添加as flag作为参数,以了解调用函数中类型转换返回指针的类型。作为

     void * pop(node **head, int &flag)
    

    设置标志以指示返回指针的类型。

    您不能在C中重载函数。您已经有了一个从堆栈中弹出最顶层节点的Pop函数。节点可以包含数字或字符串。显示功能显示节点的内容,并正确测试节点中的数据类型

    您应该编写一个函数,将节点作为参数,如果是数字,则返回say false;如果是字符串,则返回true:

    bool IsString(node *inp)
    {
       return temp->valC != NULL ;
    }
    
    但是,即使可以在C中重载函数,也不知道堆栈顶部是什么类型的节点(数字或字符串)。如果调用返回字符串的Pop函数,并且最顶端的节点包含数字,会发生什么情况


    只需执行pop,然后确定节点是字符串还是数字,并相应地执行操作。

    您的pop函数是无效的,但您仍从中返回一个值。Thios不编译。是的,我正在测试它,它可以编译,但当然不能正常工作@MichaelWalz@MannyO您希望从pop返回2个值,并且可以更改pop()函数的签名吗?请打开所有警告。至于这个问题-您可能需要实现一些序列化。@Rohith yes您可以调整sig
     void * pop(node **head, int &flag)
    
    bool IsString(node *inp)
    {
       return temp->valC != NULL ;
    }