#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct node
{
int data;
struct node *next;
};
struct node *top;
int count=0;
void push(int n);
void Print();
void permute();
int main()
{
int no, ch, e;
printf("\n1 - Push");
printf("\n4 - Print");
printf("\n7 - Permute first and last element");
while (1)
{
printf("\n Enter choice : ");
scanf("%d", &ch);
switch (ch)
{
case 1:
printf("Enter data : ");
scanf("%d", &no);
push(no);
break;
case 4:
Print();
break;
case 7:
permute();
break;
default :
printf(" Wrong choice, Please enter correct choice ");
break;
}
}
}
void push(int no)
{
struct node *temp=(struct node*)malloc(sizeof(struct node));
temp->data=no;
temp->next=top;
top=temp;
count++;
}
void Print()
{
struct node *temp=top;
printf("List is:");
while(temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
void permute()
{
int i;
struct node *temp=(struct node*)malloc(sizeof(struct node));
struct node *temp1=(struct node*)malloc(sizeof(struct node));
struct node *temp2=(struct node*)malloc(sizeof(struct node));
temp=top;
temp1=NULL;
for(i=0;i<count-1;i++)
{
temp1=temp1->next;
}
temp1->next=temp2;
temp2->data=temp1->next->data;
temp1->next=temp;
temp->data=top->data;
temp=NULL;
temp2->next=top;
top=temp2;
}
所以我的堆栈实现与推送和打印堆栈中的元素一样正常,但是当我想用top元素置换底部元素时程序崩溃了。我想我的置换功能搞砸了。谢谢你的帮助。
答案 0 :(得分:3)
如果我已经正确理解,只需交换两个节点的数据成员data
的值即可。该功能可以通过以下方式定义
void permute()
{
if ( top && top->next )
{
int data = top->data;
struct node *last = top->next;
while ( last->next ) last = last->next;
top->data = last->data;
last->data = data;
}
}
答案 1 :(得分:1)
如果您希望置换节点,这是一个解决方案。由于在执行置换时堆栈中没有新节点,因此不需要分配内存。它只是指针处理。
注意附加测试以处理空堆栈或具有单个元素的堆栈。
删除了malloc()
中push()
的归还广告,并测试了malloc()
的返回值。如果没有足够的可用内存,malloc()
可能会失败。
以下代码由gcc main.c -o main -Wall
编译:
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
struct node
{
int data;
struct node *next;
};
struct node *top;
int count=0;
void push(int n);
void Print();
void permute();
int main()
{
int no, ch;
printf("\n1 - Push");
printf("\n4 - Print");
printf("\n7 - Permute first and last element");
while (1)
{
printf("\n Enter choice : ");
scanf("%d", &ch);
switch (ch)
{
case 1:
printf("Enter data : ");
scanf("%d", &no);
push(no);
break;
case 4:
Print();
break;
case 7:
permute();
break;
default :
printf(" Wrong choice, Please enter correct choice ");
break;
}
}
}
void push(int no)
{
struct node *temp=malloc(sizeof(struct node));
if(temp==NULL){printf("malloc failed\n");exit(1);}
temp->data=no;
temp->next=top;
top=temp;
count++;
}
void Print()
{
struct node *temp=top;
printf("List is:");
while(temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
void permute()
{
if(count<2){return;}
int i;
struct node *temp1=top;
struct node *temp2;
for(i=0;i<count-2;i++)
{
temp1=temp1->next;
}
temp2=temp1->next;
temp1->next=top;
temp2->next=top->next;
top->next=NULL;
top=temp2;
}