使用链表将字符串插入堆栈
inserting string in stack using linked list
我对下面的代码感到困惑。为什么输入会覆盖栈中的元素
比如我先输入"abc"
那么堆栈将是“123”
但是当我输入另一个字符串时,假设是“234”
堆栈将是“234”“234”
但是当我使用 int 数据类型而不是 char 作为输入时,没有错误。
谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
char* info;
struct node *ptr;
}*top,*top1,*temp;
int count = 0;
/* Push data into stack */
void pushy(char* data){
if (top == NULL)
{
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
strcpy(top->info, data);
}
else
{
temp =(struct node *)malloc(1*sizeof(struct node));
temp->ptr = top;
strcpy(temp->info, data);
top = temp;
}
count++;
}
/* Display stack elements */
void display(){
top1 = top;
if (top1 == NULL)
{
printf("Stack is empty");
return;
}
while (top1 != NULL)
{
printf("%s ", top1->info);
top1 = top1->ptr;
}
}
/* Pop Operation on stack */
void pop(){
top1 = top;
if (top1 == NULL)
{
printf("\n Error : Trying to pop from empty stack");
return;
}
else
top1 = top1->ptr;
printf("\n Popped value : %s", top->info);
free(top);
top = top1;
count--;
}
/* Return top element */
char* topelement(){
return(top->info);
}
int main()
{
int ch=0;
printf("\n 1 - Push");
printf("\n 2 - Pop");
printf("\n 3 - Top");
printf("\n 4 - Display");
printf("\n 5 - Exit");
top = NULL;
while (1)
{
char no[10]={NULL};
char* e;
printf("\n Enter choice : ");
scanf("%d", &ch);
if(ch==1){
printf("Enter data : ");
scanf("\n\n%s", &no);
pushy(no);
}
else if(ch==2){
pop();
}
else if(ch==3){
if (top == NULL)
printf("No elements in stack");
else
{
e = topelement();
printf("\n Top element : %d", e);
}
}
else if(ch==4)
display();
else if(ch==5)
exit(0);
else
printf("Invalid");
}
}
scanf("\n\n%s", &no);
从上面的语句中删除“&”。
此外,根据您的代码,最好将信息作为 char array
而不是 char *
struct node{
char info[20];
struct node *ptr;
}*top,*top1,*temp;
没有为节点中的字符串分配内存:
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
strcpy(top->info, data);
调用strcpy时top->info指针无效。您将必须分配内存,将其分配给指针 top->info,然后将字符串复制到该内存中。
在释放整个节点之前,不要忘记释放我的信息指针所在的内存。
至少函数 pushy
有未定义的行为,因为它试图覆盖函数
未分配的内存
void pushy(char* data){
if (top == NULL)
{
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
strcpy(top->info, data);
^^^^^^^^^^^^^^^^^^^^^^^
}
//...
你应该首先分配数据成员top->info
指向的内存,你要复制参数data
指向的字符串
例如
void pushy(char* data){
if (top == NULL)
{
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
top->info = malloc( ( strlen( data ) + 1 ) * sizeof( char ) );
strcpy(top->info, data);
}
//...
函数可以这样写
void pushy( const char* data )
{
temp = ( struct node * )malloc( sizeof( struct node ) );
temp->ptr = top;
temp->info = ( char * )malloc( ( strlen( data ) + 1 ) * sizeof( char ) );
strcpy( temp->info, data );
top = temp;
++count;
}
当然,当您在函数 pop()
.
中释放节点本身时,您还必须释放为 top->info
分配的内存
考虑到不需要像 global.
那样声明变量 top1
和 temp
也在这次通话中
scanf("\n\n%s", &no);
第二个参数应该简单地指定为 no
而不是 &no
并且在这次通话中
printf("\n Top element : %d", e);
您必须使用格式说明符 %s
而不是 %d
我对下面的代码感到困惑。为什么输入会覆盖栈中的元素
比如我先输入"abc" 那么堆栈将是“123” 但是当我输入另一个字符串时,假设是“234” 堆栈将是“234”“234”
但是当我使用 int 数据类型而不是 char 作为输入时,没有错误。
谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
char* info;
struct node *ptr;
}*top,*top1,*temp;
int count = 0;
/* Push data into stack */
void pushy(char* data){
if (top == NULL)
{
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
strcpy(top->info, data);
}
else
{
temp =(struct node *)malloc(1*sizeof(struct node));
temp->ptr = top;
strcpy(temp->info, data);
top = temp;
}
count++;
}
/* Display stack elements */
void display(){
top1 = top;
if (top1 == NULL)
{
printf("Stack is empty");
return;
}
while (top1 != NULL)
{
printf("%s ", top1->info);
top1 = top1->ptr;
}
}
/* Pop Operation on stack */
void pop(){
top1 = top;
if (top1 == NULL)
{
printf("\n Error : Trying to pop from empty stack");
return;
}
else
top1 = top1->ptr;
printf("\n Popped value : %s", top->info);
free(top);
top = top1;
count--;
}
/* Return top element */
char* topelement(){
return(top->info);
}
int main()
{
int ch=0;
printf("\n 1 - Push");
printf("\n 2 - Pop");
printf("\n 3 - Top");
printf("\n 4 - Display");
printf("\n 5 - Exit");
top = NULL;
while (1)
{
char no[10]={NULL};
char* e;
printf("\n Enter choice : ");
scanf("%d", &ch);
if(ch==1){
printf("Enter data : ");
scanf("\n\n%s", &no);
pushy(no);
}
else if(ch==2){
pop();
}
else if(ch==3){
if (top == NULL)
printf("No elements in stack");
else
{
e = topelement();
printf("\n Top element : %d", e);
}
}
else if(ch==4)
display();
else if(ch==5)
exit(0);
else
printf("Invalid");
}
}
scanf("\n\n%s", &no);
从上面的语句中删除“&”。
此外,根据您的代码,最好将信息作为 char array
而不是 char *
struct node{
char info[20];
struct node *ptr;
}*top,*top1,*temp;
没有为节点中的字符串分配内存:
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
strcpy(top->info, data);
调用strcpy时top->info指针无效。您将必须分配内存,将其分配给指针 top->info,然后将字符串复制到该内存中。
在释放整个节点之前,不要忘记释放我的信息指针所在的内存。
至少函数 pushy
有未定义的行为,因为它试图覆盖函数
void pushy(char* data){
if (top == NULL)
{
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
strcpy(top->info, data);
^^^^^^^^^^^^^^^^^^^^^^^
}
//...
你应该首先分配数据成员top->info
指向的内存,你要复制参数data
例如
void pushy(char* data){
if (top == NULL)
{
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
top->info = malloc( ( strlen( data ) + 1 ) * sizeof( char ) );
strcpy(top->info, data);
}
//...
函数可以这样写
void pushy( const char* data )
{
temp = ( struct node * )malloc( sizeof( struct node ) );
temp->ptr = top;
temp->info = ( char * )malloc( ( strlen( data ) + 1 ) * sizeof( char ) );
strcpy( temp->info, data );
top = temp;
++count;
}
当然,当您在函数 pop()
.
中释放节点本身时,您还必须释放为 top->info
分配的内存
考虑到不需要像 global.
top1
和 temp
也在这次通话中
scanf("\n\n%s", &no);
第二个参数应该简单地指定为 no
而不是 &no
并且在这次通话中
printf("\n Top element : %d", e);
您必须使用格式说明符 %s
而不是 %d