使用堆叠中的顶部元素置换底部元素

时间:2015-03-29 11:40:58

标签: c data-structures

#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元素置换底部元素时程序崩溃了。我想我的置换功能搞砸了。谢谢你的帮助。

2 个答案:

答案 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;

}