C 使用链表在堆栈中插入字符串
我对下面的代码感到困惑。为什么输入会覆盖堆栈中的元素 例如,我首先输入“abc” 那么堆栈将是“123” 但当我输入另一个字符串时,让我们说“234” 堆栈将为“234”“234” 但是当我在输入中使用int数据类型而不是char时,没有错误 谢谢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
#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
,以自动分配内存并创建