使用链表将字符串插入堆栈

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.

那样声明变量 top1temp

也在这次通话中

scanf("\n\n%s", &no);

第二个参数应该简单地指定为 no 而不是 &no

并且在这次通话中

printf("\n Top element : %d", e);

您必须使用格式说明符 %s 而不是 %d