【问题标题】:Error while printing a string in a reverse order using stack使用堆栈以相反顺序打印字符串时出错
【发布时间】:2015-08-20 06:12:59
【问题描述】:

朋友们好,这是我第一次发帖,我发帖时可能做错了什么,抱歉。

我正在尝试使用堆栈以相反的顺序打印字符串。我试图将最高值放入字符数组的地方我在该部分遇到错误,请帮忙。

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

struct StackNode
{
char data;
struct StackNode* next;
};

struct StackNode* createNode(char data){
struct StackNode* stack=(struct StackNode*)malloc(sizeof(struct StackNode));
stack->data=data;
stack->next=NULL;
return stack;
}

void push(struct StackNode** root,char data)
{
struct StackNode* stack=createNode(data);
stack->next=*root;
*root=stack;
}


char top(struct StackNode** root)
{
return (*root)->data;
}
void pop(struct StackNode** root, char c[],int k)
{
int i;
for(i=0;i<=k;i++)
{
c[i]=top(&root);
*root=(*root)->next;
}
}

    void print(struct StackNode* root)
    {
    while(root!=NULL)
    {
    printf("%c",root->data);
    root=root->next;
    printf(" ");
    }
    printf("\n");
    }

int main()
{
struct StackNode* root=NULL;
char c[]="Sherry";
int k=strlen(c);
int i;
for(i=0;i<=k;i++)
{
push(&root,c[i]);
}

pop(&root,c,k);
for(i=0;i<=k;i++)
{
printf("%c",c[i]);
printf(" ");
}




return 0;
}

stackreviseLinkedList.c: In function ‘pop’:
stackreviseLinkedList.c:36:1: warning: passing argument 1 of ‘top’ from incompatible pointer type [enabled by default]
 c[i]=top(&root);
 ^
stackreviseLinkedList.c:26:6: note: expected ‘struct StackNode **’ but argument is of type ‘struct StackNode ***’
 char top(struct StackNode** root)

【问题讨论】:

  • 可能是c[i]=top(&amp;root); 导致错误?您可能需要删除 & 运算符。如c[i]=top(root); ?
  • 请更正缩进并说明错误所在行
  • @Giorgi 他也应该只进行迭代,直到他到达堆栈的底部。
  • 分段错误发生在您最后的printf:当rootNULL 时,您尝试打印top(&amp;root)。您应该实施一些方法来检测堆栈下溢。
  • 请格式化您的代码。

标签: c data-structures struct compiler-errors


【解决方案1】:

编译器在这里明确指出了错误(免责声明:除了编译器错误可能还有其他问题,我没有尝试运行程序!)

c[i]=top(&root); is the culprit

应该是

c[i]=top(root); // no & required

查看第 36 行

stackreviseLinkedList.c: In function ‘pop’:
stackreviseLinkedList.c:36:1: warning: passing argument 1 of ‘top’ from incompatible pointer type [enabled by default]
 c[i]=top(&root);
 ^
stackreviseLinkedList.c:26:6: note: expected ‘struct StackNode **’ but argument is of type ‘struct StackNode ***’
 char top(struct StackNode** root)

【讨论】:

  • 请考虑上面@M Oehm 的评论,更多指针更多问题:))
  • @Singh: 在main 中,rootstruct StackNode*,所以你需要获取它的地址才能得到struct StackNode**。在pop 中,root 已经是struct StackNode**,因此您可以将它按原样传递给top - 它是指向main 中的局部变量toppop 中的局部变量的指针。
【解决方案2】:

让你失望的主要问题是:

行:

c[i]=top(&root);

应该是:

c[i]=top(root);

目前不会伤害您但只是糟糕的编程的其他问题:

  • pop() 应该只处理一个字符,应该是对称推送
  • 您有内存泄漏。你应该把StackNode放在一个临时指针中,改变根指针,然后释放StackNode
  • 正如我评论的那样,缩进。它有助于发现编码问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-20
    • 2019-01-07
    • 2021-08-14
    • 2020-08-18
    • 1970-01-01
    • 2022-01-17
    • 2016-09-25
    • 2016-02-17
    相关资源
    最近更新 更多