我的任务是创建一个使用链表在 C 语言中实现堆栈模型的库。我所做的是为堆栈创建一个用户界面,它允许将其与控制台输入一起使用,但我的老师说我实际上必须创建它,因此它只能作为一个库使用。 我遇到的问题是,我的堆栈头是一个全局变量,因此我的所有空隙都是空的。我不知道如何使其仅在主程序中启动。此外,如果需要,该程序应该与多个堆栈一起工作,显然对于全局头这是不可能的。这是我的程序和附加文件:
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;
}
现在是带有所有开关的部分(不一定存在,我只是不想搞乱正在运行的程序,所以你可以看到完整的 View 。
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 将自行启动库。
main.c
#include <stdio.h>
#include <stdlib.h>
#include "allinone.c"
int main()
{
stackas();
}
因此,正如您可能看到的那样,这是一种用户界面方法,我只需要重新制作它,以便它作为一个库可以理解 create、push、pop、topelement、destroy 命令,并返回值 + 0/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()
的返回值。
关于c - 使栈头不是全局的并添加多个栈的可能性(使用链表在 C 中实现栈),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36024374/