rsZheng4916 2022-01-27 22:47 采纳率: 60%
浏览 33

不带头结点的链栈获取长度错误

#include<stdio.h>
#include<stdlib.h>

typedef struct StackNode{
    int data;
    struct StackNode *next;
}StackNode,*LinkStack;

int initStack(LinkStack s){
    s = NULL;
    return 0;
}

int getLength(LinkStack s){
    int n = 0;
    LinkStack p = s;
    while(p){
        n++;
        p = p->next;
    }
    return n;
}

int push(LinkStack s,int e){
    LinkStack p = (LinkStack)malloc(sizeof(StackNode));
    if(!p){
        return -1;
    }
    p->data = e;
    p->next = s;
    s = p;
    printf("元素%d进栈!\n",e);
    return 0;
}

int pop(LinkStack s,int e){
    if(!s){
        return -1;
    }
    LinkStack p = s;
    e = p->data;
    s = s->next;
    free(p);
    printf("元素%d出栈!\n",e);

}

int emptyStack(LinkStack s){
    if(s){
        printf("链栈不为空!\n");
        return 1;
    }else{
        printf("链栈为空!\n");
        return 0;
    }
}

int getTop(LinkStack s){
    if(!s){
        return -1;
    }
    return s->data;
}

int clearStack(LinkStack s){
    if(!s){
        return -1;
    }
    LinkStack q;
    while(s){
        q = s;
        s = s->next;
        free(q);
    }
    return 0;
}

int destroyStack(LinkStack s){
    if(!s){
        return -1;
    }
    LinkStack q;
    while(s){
        q = s;
        s = s->next;
        free(q);
    }
    return 0;
}

int main(){
    int initStatus;
    int popElem;
    LinkStack s;
    // 初始化
    initStatus = initStack(s);
    if(initStatus == 0){
        printf("init successful!\n");
    }else{
        printf("init failure!\n");
    }
    // 长度 判空
    printf("length: %d\n",getLength(s));
    emptyStack(s);
}
```c

请问各位朋友,这个main方法中执行getLength函数总是卡在while上,不知道什么原因,请各位朋友指教一下。
  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-01-28 00:03
    关注

    修改见注释,供参考:

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct StackNode{
        int data;
        struct StackNode *next;
    }StackNode,*LinkStack;
    
    int initStack(LinkStack* s){ //修改
        (*s) = NULL;             //修改
        return 0;
    }
    
    int getLength(LinkStack s){
        int n = 0;
        LinkStack p = s;
        while(p){
            n++;
            p = p->next;
        }
        return n;
    }
    
    int push(LinkStack* s,int e){ //修改
        LinkStack p = (LinkStack)malloc(sizeof(StackNode));
        if(!p){
            return -1;
        }
        p->data = e;
        p->next = (*s);        //修改
        (*s) = p;              //修改
        printf("元素%d进栈!\n",e);
        return 0;
    }
    
    int pop(LinkStack* s,int* e){ //修改
        if(!s){
            return -1;
        }
        LinkStack p = (*s);
        *e = p->data;         //修改
        (*s) =  p->next;      //修改
        free(p);
        printf("元素%d出栈!\n",*e);
        return 0;
    }
     
    int emptyStack(LinkStack s){
        if(s){
            printf("链栈不为空!\n");
            return 1;
        }else{
            printf("链栈为空!\n");
            return 0;
        }
    }
     
    int getTop(LinkStack s){
        if(!s){
            return -1;
        }
        return s->data;
    }
     
    int clearStack(LinkStack* s){ //修改
        if(!(*s)){                //修改
            return -1;
        }
        LinkStack q;
        while((*s)){              //修改
            q = (*s);             //修改
            (*s) = q->next;       //修改
            free(q);
        }
        return 0;
    }
     
    int destroyStack(LinkStack* s){  //修改
        if(!(*s)){                   //修改
            return -1;
        }
        LinkStack q;
        while((*s)){                 //修改
            q = (*s);                //修改
            (*s) = q->next;          //修改
            free(q);
        }
        return 0;
    }
    
    int main(){
        int initStatus;
        int popElem;
        LinkStack s;
        // 初始化
        initStatus = initStack(&s); //修改
        if(initStatus == 0){
            printf("init successful!\n");
        }else{
            printf("init failure!\n");
        }
        push(&s,1);
        push(&s,2);
        // 长度 判空
        printf("length: %d\n",getLength(s));
        emptyStack(s);
    
        printf("\n");
    
        pop(&s,&popElem);
        pop(&s,&popElem);
        //clearStack(&s);
        //destroyStack(&s);
        printf("length: %d\n",getLength(s));
        emptyStack(s);
    
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 1月27日

悬赏问题

  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥50 win10链接MySQL
  • ¥35 跳过我的世界插件ip验证
  • ¥15 抖音看过的视频,缓存在哪个文件
  • ¥15 自定义损失函数报输入参数的数目不足
  • ¥15 如果我想学习C大家有是的的资料吗
  • ¥15 根据文件名称对文件进行排序
  • ¥15 deploylinux的ubuntu系统无法成功安装使用MySQL❓
  • ¥15 有人会用py或者r画这种图吗