为什么显示从s1->顶部开始?

时间:2017-04-10 10:00:27

标签: c stack

为什么s1->top是显示功能的开头?

typedef struct node* Nodeptr;
typedef char dataitem;

typedef struct node{
dataitem data;
Nodeptr next;
}Node;

typedef struct{
int count;
Nodeptr top;
}Stack_Head;

typedef Stack_Head* Stack;

Stack createStack() {
  Stack s1;
  s1 = (Stack) malloc(sizeof(Stack_Head));
  s1 - > count = 0;
  s1 - > top = NULL;
  return s1;
}

Nodeptr createNode(dataitem item) {
  Nodeptr temp;
  temp = (Nodeptr) malloc(sizeof(Node));
  temp - > data = item;
  temp - > next = NULL;
  return temp;
}

void push(Stack s1, dataitem item) {
  Nodeptr temp = createNode(item);
  temp - > next = s1 - > top;
  s1 - > top = temp;
  s1 - > count++;
}

void display(Stack s1) {
  Nodeptr ptr = s1 - > top;
  while (ptr != NULL) {
    printf("%d", ptr - > data);
    ptr = ptr - > next;
  }
  printf("\n");
}

void pop(Stack s1) {
    Nodeptr temp;
    if (isEmpty(s1))
      printf("List is Empty");
    else {
      temp = s1 - > top;
      s1 - > top = temp - > next;
      temp - > next = NULL;
      free(temp);
      s1 - > count;
    }

    int isEmpty(Stack s1) {
      return s1 - > top == NULL;
    } 

2 个答案:

答案 0 :(得分:0)

display只显示(打印)堆栈。它是从顶部开始显示它的实现者的选择。堆栈通常从顶部LIFO开始工作。

请注意,如果s1为空,则Nodeptr ptr = s1 - > top;的访问权限无效,并可能导致分段错误。

答案 1 :(得分:0)

因为display函数将显示堆栈中的所有元素,并且它必须从顶部开始,因为这是唯一可用的元素。

ptr是一个循环变量。它从堆栈的顶部开始,在每次迭代时,它被移动到下一个元素,直到它到达堆栈的底部,即具有NULL下一个指针的节点。

修改

为什么从顶部开始而不是从底部开始?主要是因为它更容易。您可以访问堆栈顶部,每个节点都可以访问它下面的节点,但不能访问它上面的节点。

如果你想从下往上打印,那就更难了。你如何从底部项目到上面的项目?除非你记得它的前身,否则你无法做到。

从底部开始的最简单方法是首先反转堆栈,即从顶部迭代它并创建一个新的堆栈,但它仍然比仅仅说"我们和#39;将从顶部打印"。