我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char ch;
struct node *next;
};
struct node *first,*top1,*newptr;
void push_back(char data) { //Pushes data into the stack
if (first == NULL) {
first = new node();
first->next = NULL;
first->ch = data;
}
else {
first = new node();
top1->next = first;
top1->ch = data;
first = top1;
}
}
void display() {
top1 = first;
if (top1 == NULL){
printf("Stack is empty");
return;
}
while (top1 != NULL){
printf("%c ", top1->ch);
top1 = top1->next;
}
}
main() {
first = NULL;
char EXP[100];
scanf("%s",&EXP);
system("cls");
int len = strlen(EXP);
for(int i=0;i<len;i++)
push_back(EXP[i]);
display();
system("pause");
}
我的程序应该为用户提供一个字符串,然后将每个字符放在一个堆栈中,然后我将字符串打印回来。当我运行我的代码时,它只能显示第一个字符。我错过了什么吗?
答案 0 :(得分:3)
第二次push_back()时,会立即覆盖first
else {
first = new node(); //oops
top1->next = first;
top1->ch = data;
first = top1;
丢失了之前指出的数据。
答案 1 :(得分:1)
问题是top1
未初始化,因此您的程序显示未定义的行为。您最有可能在first
top1
{/ 1}}中输入错字。
void push_back(char data) { //Pushes data into the stack
// ...
else {
top1 = new node();
top1->next = first;
top1->ch = data;
first = top1;
}
答案 2 :(得分:0)
push_back函数和显示功能都有错误。
在跳转到堆栈和链接列表之前,必须在指针和内存分配中构建一个强大的基础。我推荐这篇文章:http://cslibrary.stanford.edu/102/PointersAndMemory.pdf
首先,正如remyabel所提到的,top1应该是你的新节点,而不是第一个节点。首先只是指向堆栈顶部的指针。我希望你能照顾到这一点。来到你的显示功能,你是从最顶层的元素迭代,即,首先它没有意义,因为它指向null并且堆栈从下到上构建,反之则不然。
您必须维护指向堆栈底部的指针。这是一个有效的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char ch;
struct node *next;
};
struct node *first,*top1,*newptr,*stackbottom;
void push_back(char data) { //Pushes data into the stack
if (first == NULL) {
first = new node();
first->next = NULL;
first->ch = data;
stackbottom=first;
}
else {
top1 = new node();
top1->ch = data;
first->next = top1;
first=top1;
}
}
void display(){
//top1 = first;
struct node *curr;
curr=stackbottom;
if (stackbottom == NULL){
printf("Stack is empty");
return;
}
while (curr != NULL){
printf("%c ", curr->ch);
curr = curr->next;
}
}
main() {
first = NULL;
char EXP[100];
scanf("%s",EXP);
//system("cls");
int len = strlen(EXP);
for(int i=0;i<len;i++)
push_back(EXP[i]);
//printf("%c",stackbottom->ch);
//push_back(EXP[1]);
display();
//system("pause");
}