免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5288 | 回复: 6
打印 上一主题 下一主题

[C] 关于C语言实现链表栈的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-29 19:44 |只看该作者 |倒序浏览
#include <stdlib.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define NULL 0
typedef struct node{
     char *name;
    double data;
    struct node *next;
}StackNode,*LinkStack;

/*初始化一个栈*/

void Init_Stack (LinkStack top)
{
    top->next = NULL;
}
/*判断一个栈是否为空*/

int Empty_Stack (LinkStack top)
{

    if(top->next  == NULL)
    return TRUE;
    return FALSE;
}

/*把项压入栈顶*/

int Push_Stack(LinkStack top, char *trgcode,double element)
{
    StackNode *temp;
    temp = (StackNode *)malloc(sizeof(StackNode));
    if(temp == NULL) return FALSE;
    temp->name = *trgcode;
    temp->data = element;
    temp->next = top->next;
    top->next = temp;
    return TRUE;
}

/*移除栈顶并作为此函数的值返回该对象*/

int Pop_Stack (LinkStack top, char *trgcode,double *element)
{
    StackNode *temp;
    if(Empty_Stack(top)) return FALSE;
    temp = top->next;
    *trgcode = temp->name;
    *element = temp->data;
    top->next = temp->next;
    free(temp);
    return TRUE;
}

/*查看栈顶并作为此函数的值返回该对象*/

int Peek_Stack (LinkStack top, char *trgcode,double *element)
{
    if(Empty_Stack(top)) return FALSE;  
    else
    *trgcode = top->next->name;
    *element = top->next->data;
}

/*销毁栈*/
void Destroy_Stack (LinkStack top)
{
    StackNode *cp, *np;
    cp = top->next;                             /* 使cp指向栈顶结点 */
                                             /* 从栈顶依次删除每个结点 */
    while(cp != NULL){
        np = cp->next;
        free(cp);
        cp = np;
    }
    top->next = NULL;                         /* 置链栈为空 */
    return;
}

/*测试main函数*/
void main()
{
    LinkStack s;
    double rslt;
    double i;
    double pushe;
    char *ss;
    char *sss;
    char *ssss;
    s = (LinkStack)malloc(sizeof(StackNode));
    Init_Stack(s);
    ss = "abh0000001";
    i = 99993333333333333.24;
    Push_Stack(s,ss,i);
    sss = "abh0000002";
    i = 12456.45;
    Push_Stack(s,sss,i);

    printf("you pushed data is:");
    Pop_Stack(s,ssss,&pushe);
    printf("%s %f\n ",ssss,pushe);
    Peek_Stack(s,ssss,&pushe);
    printf("%s %f\n ",ssss,pushe);
    getch();
}
------------------
以上是源码,压入栈的是一个结构体(1.字符串,2.浮点型)
问题1:我printf栈顶元素时为什么字符串只显示第一个字符?程序哪写错了。另外源码哪有不正确的地方帮我修改一下吧。
问题2:如果我想栈既可以存(1.字符串,2.浮点型)又可以存(1.字符串,2.整型)定义结构体的时候第二个成员应该定义成void *data,但是具体其他的不知道怎么写,对void不熟悉,能帮我把其他的函数修改一下好吗?
很着急用,希望朋友们帮忙看一下,谢谢。

论坛徽章:
0
2 [报告]
发表于 2010-09-29 19:56 |只看该作者
temp->name = *trgcode;
这句改成: temp->name = trgcode;
指针前加*号表示的是值,这里*trgcode相当于trgcode[0]的意思

论坛徽章:
0
3 [报告]
发表于 2010-09-29 20:08 |只看该作者
回复 2# whosy


    改了,运行。结果还是不对。在帮忙看看,谢谢。

论坛徽章:
0
4 [报告]
发表于 2010-09-29 20:22 |只看该作者
本帖最后由 whosy 于 2010-09-29 20:35 编辑

看下面的吧

论坛徽章:
0
5 [报告]
发表于 2010-09-29 20:28 |只看该作者
本帖最后由 whosy 于 2010-09-29 20:36 编辑

#include <stdlib.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define NULL 0
typedef struct node{
     char *name;
    double data;
    struct node *next;
}StackNode,*LinkStack;

/*初始化一个栈*/

void Init_Stack (LinkStack top)
{
    top->next = NULL;
}
/*判断一个栈是否为空*/

int Empty_Stack (LinkStack top)
{

    if(top->next  == NULL)
    return TRUE;
    return FALSE;
}

/*把项压入栈顶*/

int Push_Stack(LinkStack top, char *trgcode,double element)
{
    StackNode *temp;
    temp = (StackNode *)malloc(sizeof(StackNode));
    if(temp == NULL) return FALSE;
    temp->name = trgcode;
    temp->data = element;
    temp->next = top->next;
    top->next = temp;
    return TRUE;
}

/*移除栈顶并作为此函数的值返回该对象*/

int Pop_Stack (LinkStack top, char *trgcode,double *element)
{
    StackNode *temp;
    if(Empty_Stack(top)) return FALSE;
    temp = top->next;
    while((*(trgcode++)=*(temp->name++))!='\0');
    *element = temp->data;
    top->next = temp->next;
    free(temp);
    return TRUE;
}

/*查看栈顶并作为此函数的值返回该对象*/

int Peek_Stack (LinkStack top, char *trgcode,double *element)
{
    if(Empty_Stack(top))
                return FALSE;  
    else
        {
                while((*(trgcode++) = *(top->next->name++))!='\0');
                *element = top->next->data;
        }
}

/*销毁栈*/
void Destroy_Stack (LinkStack top)
{
    StackNode *cp, *np;
    cp = top->next;                             /* 使cp指向栈顶结点 */
                                             /* 从栈顶依次删除每个结点 */
    while(cp != NULL){
        np = cp->next;
        free(cp);
        cp = np;
    }
    top->next = NULL;                         /* 置链栈为空 */
    return;
}

/*测试main函数*/
void main()
{
    LinkStack s;
    double rslt;
    double i;
    double pushe;
    char *ss;
    char *sss;
    char ssss[20];
        ssss[19]='\0';
    s = (LinkStack)malloc(sizeof(StackNode));
    Init_Stack(s);
    ss = "abh0000001";
    i = 99993333333333333.24;
    Push_Stack(s,ss,i);
    sss = "abh0000002";
    i = 12456.45;
    Push_Stack(s,sss,i);

    printf("you pushed data is:");
    Pop_Stack(s,ssss,&pushe);
    printf("%s %f\n ",ssss,pushe);
    Peek_Stack(s,ssss,&pushe);
    printf("%s %f\n ",ssss,pushe);
    getch();
}


结果:
you pushed data is:abh0000002 12456.450000
abh0000001 99993333333333328.000000

论坛徽章:
0
6 [报告]
发表于 2010-09-29 23:55 |只看该作者
#include
#include
#define TRUE 1
#define FALSE 0
#define NULL 0
typedef struct node{
     ch ...
whosy 发表于 2010-09-29 20:28



    非常感谢。。。

论坛徽章:
0
7 [报告]
发表于 2010-09-30 22:32 |只看该作者
今天有时间找了些资料,把第二个问题解决了下:
#include <stdlib.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define NULL 0
typedef struct node{
     char *name;
    void *data;
    struct node *next;
}StackNode,*LinkStack;

/*初始化一个栈*/

void Init_Stack (LinkStack top)
{
    top->next = NULL;
}
/*判断一个栈是否为空*/

int Empty_Stack (LinkStack top)
{

    if(top->next  == NULL)
    return TRUE;
    return FALSE;
}

/*把项压入栈顶*/

int Push_Stack(LinkStack top, char *trgcode,void *element)
{
    StackNode *temp;
    temp = (StackNode *)malloc(sizeof(StackNode));
    if(temp == NULL) return FALSE;
    temp->name = trgcode;
    temp->data = element;
    temp->next = top->next;
    top->next = temp;
    return TRUE;
}

/*移除栈顶并作为此函数的值返回该对象*/

int Pop_Stack_double (LinkStack top, char *trgcode,double *element)
{
    StackNode *temp;
    if(Empty_Stack(top)) return FALSE;
    temp = top->next;
        while((*(trgcode++)=*(temp->name++))!='\0');
    *element = *(double *)temp->data;
    top->next = temp->next;
    free(temp);
    return TRUE;
}

int Pop_Stack_int (LinkStack top, char *trgcode,int *element)
{
    StackNode *temp;
    if(Empty_Stack(top)) return FALSE;
    temp = top->next;
        while((*(trgcode++)=*(temp->name++))!='\0');
    *element = *(int *)temp->data;
    top->next = temp->next;
    free(temp);
    return TRUE;
}
/*查看栈顶并作为此函数的值返回该对象*/

int Peek_Stack_double (LinkStack top, char *trgcode,double *element)
{
    if(Empty_Stack(top))
                return FALSE;  
    else
        {
                while((*(trgcode++) = *(top->next->name++))!='\0');
                *element = *(double *)top->next->data;
        }
}

int Peek_Stack_int (LinkStack top, char *trgcode,int *element)
{
    if(Empty_Stack(top))
                return FALSE;  
    else
        {
                while((*(trgcode++) = *(top->next->name++))!='\0');
                *element = *(int *)top->next->data;
        }
}
/*销毁栈*/
void Destroy_Stack (LinkStack top)
{
    StackNode *cp, *np;
    cp = top->next;                             /* 使cp指向栈顶结点 */
                                             /* 从栈顶依次删除每个结点 */
    while(cp != NULL){
        np = cp->next;
        free(cp);
        cp = np;
    }
    top->next = NULL;                         /* 置链栈为空 */
    return;
}

/*测试main函数*/
void main()
{
    LinkStack s;
    double rslt,i,pushe;
        int j,k;
    char *ss,*sss;
    char ssss[20];
        ssss[19]='\0';
    s = (LinkStack)malloc(sizeof(StackNode));
    Init_Stack(s);
    ss = "abh0000001";
    i = 99993333333333333.24;
    Push_Stack(s,ss,&i);
    sss = "abh0000002";
    j = 12456;
    Push_Stack(s,sss,&j);

    printf("you pushed data is:");
    Pop_Stack_int(s,ssss,&k);
    printf("%s %d\n ",ssss,k);
    Peek_Stack_double(s,ssss,&pushe);
    printf("%s %f\n ",ssss,pushe);
    getch();
}

结果:
you pushed data is:abh0000002 12456
abh0000001 99993333333333328.000000
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP