【问题标题】:Make head of stack not global and add possibility of several stacks (Stack implementation in C using linked lists)使堆栈头不是全局的并添加多个堆栈的可能性(使用链表在 C 中实现堆栈)
【发布时间】:2016-03-15 23:47:29
【问题描述】:

我的任务是创建一个使用链表在 C 中实现堆栈模型的库。我所做的是为堆栈创建一个用户界面,它允许将它与控制台输入一起使用,但我的老师说我实际上必须创建它,所以它只能作为一个库工作。 我遇到的问题是我的堆栈头是一个全局变量,因此我所有的 void 都是空的。我不知道如何使它只能在 main 中启动。此外,如果需要,该程序应该使用多个堆栈,并且显然使用全局头是不可能的。这是我的带有附加文件的程序:

H.h

#ifndef H_H_INCLUDED
#define H_H_INCLUDED
typedef struct Node
{
    int data;
    struct Node* next;
} Node;
Node* head;
int counter = 0;



#endif // H_H_INCLUDED

funct.c

#include <stdio.h>
#include <stdlib.h>
#include "H.h"
void create ()
{
    head = NULL;
}
void push ()
{
    int x;
    scanf("%d", &x);
    Node* temp = (Node*)malloc(sizeof(Node));
    (*temp).data = x; // temp ->data = x;
    (*temp).next = NULL;
    if(head != NULL) (*temp).next = head;
    head = temp;
}
void pop ()
{
    Node* htemp = (Node*)malloc(sizeof(Node));
    htemp = head;
    if (htemp == NULL)
    {
        printf("STACK EMPTY \n");
        return;
    }
    else
    {
        htemp = (*htemp).next;
        printf("ELEMNT TAKEN OUT: %d \n", (*head).data);
        free(head);
        head = htemp;
    }
}
void print ()
{
    Node* temp = head;
    printf("Stack: ");
    while (temp != NULL)
    {
        printf(" %d", (*temp).data);
        temp = (*temp).next;
    }
    printf("\n");
}
void emptycheck ()
{
    if (head == NULL) printf("Stack is empty \n");
        else printf ("Stackas is not empty \n");
}
void topelement()
{
    if (head != NULL)
    printf("top elemnt %d \n", (*head).data);
    else printf ("Stack empty");
}
void destroy()
{
   Node* htemp = (Node*)malloc(sizeof(Node));
   htemp = head;
   while (htemp != NULL)
   {
       htemp = (*head).next;
       free(head);
       head = htemp;
   }
   free(htemp);
   head = NULL;
}

现在是带有所有开关的部分(它不一定存在,我只是不想弄乱一个工作程序,所以你可以得到一个完整的视图。

allinone.c

#include <stdio.h>
#include <stdlib.h>
#include "funct.c"
void stackas(){
    int choice,z;
    printf("1 - create new stack \n");
    printf("2 - push new element to stack \n");
    printf("4 - pop element from stacl \n");
    printf("5 - check if stack is empty \n");
    printf("6 - check top element of stack \n");
    printf("8 - show stack elements on screen \n");
    printf("9 - destroy stack \n");
    printf("10 - end program \n");
    while (z != 1){
    scanf("%d", &choice);
    switch(choice)
    {
        case 1 :
            create();
            break;
        case 2 :
            push();
            break;
        case 4 :
            pop();
            break;
        case 5 :
            emptycheck();
            break;
        case 6 :
            topelement();
            break;
        case 8 :
            print();
            break;
        case 9 :
            destroy();
            break;
        case 10 :
            z = 1;
            break;
    }
    }
}

最后是我的 main,它启动程序(在最终版本中将没有“allinone”,main 将自行启动库。

ma​​in.c

#include <stdio.h>
#include <stdlib.h>
#include "allinone.c"
int main()
{
    stackas();
}

所以你可能会看到这是一种带有用户界面的方法,我只需要重新制作它,以便它作为一个库工作,它可以理解 create、push、pop、topelement、destroy 命令,并返回值 + 0/1,具体取决于如果手术成功。我遇到了麻烦,因为我不知道如何将全局头重新制作成非全局的,并且在这样做之后究竟要发送什么功能。

提前谢谢你。



解决了!感谢您的建议。

【问题讨论】:

  • 1) 使用原型函数声明符:void pop () -> void pop(void) 等 2) 你应该已经学会了如何继续。这不是编码/辅导网站。如果你有这样一个基本的问题,你应该和你的老师谈谈。 3) 提示:函数可以带参数。 4) 模块的标头应与模块同名(扩展名除外)。 5) 使用箭头运算符 6) 不要在 C 中转换 malloc 和朋友的结果。
  • 您的代码中有很多错误。太多了,无法列出。

标签: c list stack


【解决方案1】:

首先声明一个Stack 类型:

typedef struct {
    Node *head;
    int counter;
} Stack;

写一个构造函数:

Stack *Stack_create(void)
{
    Stack *stack = malloc(sizeof(Stack));
    if (stack) {
        stack->head = NULL;
        stack->counter = 0;
    }
    return stack;
}

然后定义以Stack 作为参数并对其进行操作的函数,例如:

void Stack_push (Stack*stack)
{
    /* Work with stack->head, stack->counter etc, here */
}

您还需要写Stack_delete() 来删除一个列表。

我没有检查你的代码的逻辑,所以你需要。你需要添加更多的错误检查,并且你不应该转换malloc()的返回值。

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2012-05-24
    • 2019-03-04
    • 2020-01-16
    • 2011-07-29
    • 2012-10-14
    相关资源
    最近更新 更多