解释使用链表实现的堆栈的输出

时间:2014-02-15 12:59:52

标签: c data-structures singly-linked-list

我正在创建一个包含链表的堆栈。我编写了推送和显示堆栈部分,但是当我尝试显示堆栈内容时,它只是将最后输入的数据作为输出。为什么会这样?

struct LinkedStack {
    int data;
    struct LinkedStack* next;
};

struct LinkedStack *first = NULL;
struct LinkedStack *previous = NULL;
struct LinkedStack *current = NULL;

int main(void) {
    int data = 0, choice = 0;
    if(current == NULL) {
         printf("\nNo Memory Allocated");
    }
    while(1) {
        printf("\n1. Push Data");
        printf("\n2. Pop Data");
        printf("\n3. Display The Stack");
        printf("\n4. Exit");
        printf("\nEnter Your Choice::\n");
        scanf("%d", &choice);

        switch(choice) {
            case 1:
                current = (struct node *)malloc(sizeof(struct LinkedStack));
                printf("Enter the data:: ");
                scanf("%d", &data);
                push(&current, data);
                break;

            case 3:
                printf("\n\n Stack Contents::");
                displayStack(current);
                break;
           case 4:
                exit(1);
           default:
                printf("\nWrong Choice.Enter Again");

        }
    }

}

void push(struct LinkedStack **s, int usrdata) {
    if(first == NULL) {
        first = *s;
    }  
    if(previous != NULL) {
          previous->next = *s;
    } 

    (*s)->data = usrdata;;
    (*s)->next = NULL;
    previous = *s;
}

void displayStack(struct LinkedStack *s) {
    struct LinkedStack *temp = (struct LinkedStack *)malloc(sizeof(struct LinkedStack));
    if(temp == NULL) {
        printf("No Memory Allocated");
    }
    temp = s;
    while(temp != NULL) {
        printf("\n %d", temp->data);
        temp = temp->next;
    }
} 

2 个答案:

答案 0 :(得分:1)

如果您正确推送数据,请尝试

  case 3:
         printf("\n\n Stack Contents::");
         displayStack(first);
         break;

而不是

     case 3:
         printf("\n\n Stack Contents::");
         displayStack(current);
         break;

displayStack()函数需要引用链接列表的前面。

我希望这能解决你的问题。

答案 1 :(得分:0)

我的建议是从删除那些全局变量开始。尝试将堆栈视为LinkedStack *类型的单个变量。

然后就此实施pushpop。没有全局变量:这些函数的调用者传入指向该变量的指针,即函数应该有签名:

void push(LinkedStack **stack, int data);
int pop(LinkedStack **stack);

这就是你已经在做的事情,所以我猜你至少有一些正确的想法。 ;)

问自己的问题:

  • 空堆栈是什么样的?
  • 如果我push到空堆栈会怎么样? (不要担心在这个阶段从空堆栈弹出;当其他所有工作正常时,请担心。)
  • 当弹出某个内容时,LinkedStack节点的内存如何被释放?
  • 来电者的LinkedStack *变量如何按pushpop进行更新?