C 使用链表在堆栈中插入字符串

C 使用链表在堆栈中插入字符串,c,linked-list,stack,C,Linked List,Stack,我对下面的代码感到困惑。为什么输入会覆盖堆栈中的元素 例如,我首先输入“abc” 那么堆栈将是“123” 但当我输入另一个字符串时,让我们说“234” 堆栈将为“234”“234” 但是当我在输入中使用int数据类型而不是char时,没有错误 谢谢 #include <stdio.h> #include <stdlib.h> #include <string.h> struct node{ char* info; struct node *p

我对下面的代码感到困惑。为什么输入会覆盖堆栈中的元素

例如,我首先输入“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");
   }
}  
#包括
#包括
#包括
结构节点{
字符*信息;
结构节点*ptr;
}*顶部,*顶部1,*温度;
整数计数=0;
/*将数据推入堆栈*/
void pushy(字符*数据){
if(top==NULL)
{
top=(结构节点*)malloc(1*sizeof(结构节点));
top->ptr=NULL;
strcpy(顶部->信息,数据);
}
其他的
{
temp=(结构节点*)malloc(1*sizeof(结构节点));
温度->ptr=顶部;
strcpy(临时->信息、数据);
顶部=温度;
}
计数++;
}
/*显示堆栈元素*/
无效显示(){
top1=top;
if(top1==NULL)
{
printf(“堆栈为空”);
返回;
}
while(top1!=NULL)
{
printf(“%s”,top1->info);
top1=top1->ptr;
}
}
/*堆栈上的Pop操作*/
void pop(){
top1=top;
if(top1==NULL)
{
printf(“\n错误:试图从空堆栈中弹出”);
返回;
}
其他的
top1=top1->ptr;
printf(“\n弹出值:%s”,顶部->信息);
免费(顶部);
top=top1;
计数--;
}
/*返回顶部元素*/
char*topelement(){
返回(顶部->信息);
}
int main()
{
int ch=0;
printf(“\n 1-推”);
printf(“\n 2-Pop”);
printf(“\n 3-顶部”);
printf(“\n 4-显示”);
printf(“\n 5-退出”);
top=NULL;
而(1)
{
字符编号[10]={NULL};
char*e;
printf(“\n输入选项:”);
scanf(“%d”和“ch”);
如果(ch==1){
printf(“输入数据:”);
scanf(“\n\n%s,&no”);
咄咄逼人(否);
}
否则如果(ch==2){
pop();
}
否则如果(ch==3){
if(top==NULL)
printf(“堆栈中无元素”);
其他的
{
e=topelement();
printf(“\n顶部元素:%d”,e);
}
}
否则如果(ch==4)
显示();
否则如果(ch==5)
出口(0);
其他的
printf(“无效”);
}
}  
从上述语句中删除“&”

另外,根据您的代码,最好将信息作为
char数组
而不是
char*

struct node{
    char info[20];
    struct node *ptr;
}*top,*top1,*temp;
从上述语句中删除“&”

另外,根据您的代码,最好将信息作为
char数组
而不是
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,然后将字符串复制到该内存中


在释放整个节点之前,不要忘记释放my info指针所持有的内存。

没有为节点中的字符串分配内存:

top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
strcpy(top->info, data); 
调用strcpy时,top->info指针无效。您必须分配内存,将其分配到指针top->info,然后将字符串复制到该内存中


在释放整个节点之前,不要忘记释放my 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
的内存 考虑到不需要像全局变量那样声明变量
top1
temp

也在这个电话里

scanf("\n\n%s", &no);
第二个参数的指定方式应与
no
类似,而不是
&no

在这个电话里

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

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

至少函数
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
的内存 考虑到不需要像全局变量那样声明变量
top1
temp

也在这个电话里

scanf("\n\n%s", &no);
第二个参数的指定方式应与
no
类似,而不是
&no

在这个电话里

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

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

快速浏览:您没有为
struct节点的
info
成员分配内存,因此可能所有
info
都指向相同的内存位置。通常你会有一个分割错误。将
strcpy
更改为
strdup
,以自动分配内存并创建字符串的副本。也不要忘记在
pop
函数中的
free(top)
之前释放
top->info
。不要在C中释放
malloc
。快速浏览:你没有为
struct节点的
info
成员分配内存,所以可能所有
info
都指向同一个内存位置。通常你会有一个分割错误。将
strcpy
更改为
strdup
,以自动分配内存并创建