gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:05 24 4
gpt4 key购买 nike

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

例如我先输入“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");
}
}

最佳答案

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

也在这次通话中

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

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

在这次通话中

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

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

关于c - 使用链表将字符串插入堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31522711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com