我的代码
#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");
}
我的程序应该为用户获取一个字符串,然后每个字符都会被放在一个堆栈中,我会打印回字符串。当我运行代码时,它只能显示第一个字符。我是不是错过了什么?
第二次按下_back()时,会立即覆盖first
else {
first = new node(); //oops
top1->next = first;
top1->ch = data;
first = top1;
丢失了它以前指向的数据。
问题是top1
未初始化,因此您的程序显示出未定义的行为。你很可能在first
应该是top1
:的地方打错了字
void push_back(char data) { //Pushes data into the stack
// ...
else {
top1 = new node();
top1->next = first;
top1->ch = data;
first = top1;
}
push_back函数和display函数中都有错误。在跳转到堆栈和链表之前,必须在指针和内存分配方面建立一个强大的基础。我推荐这篇文章: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");
}