不同参数类型的函数 c语言 抽象,关于抽象数据类型的有关问题

本文探讨了在《现代C语言程序设计》中关于抽象数据类型Stack的设计选择,解释了为何定义两个结构体以保持接口稳定并便于未来扩展。同时,解答了如何在Visual Studio中实现多文件编译的问题,涉及头文件包含和编译步骤。
摘要由CSDN通过智能技术生成

关于抽象数据类型的问题

今天看《C语言程序设计现代方法》中的大型程序设计,有很多小问题,请教各位高手

问题1.上面说

C/C++ codestruct node

{

int data;

struct node *next;

};

struct stack_type

{

struct node *top;

};

不要放在头文件里,这样用户就知道了具体是怎样实现的,不好。但是为什么要定义两个结构体呢?

书上是这样说的:

乍一看,这个结构似乎有点冗余:我们可以简单的把Stack定义为struct node * 同时让Stack的值为指向链表首节点的指针。但是,我们仍然需要这个stack_type结构,这样可以使栈的接口保持不变。(如果不这样做,任何一个对栈进行修改的函数都需要Stack * 类型的参数而不是Stack参数)。此外,如果将来我们想存储更多的信息,stack_type结构的存在可以简化对实现的修改。例如,如果我们以后想给stack_type结构增加栈数据项的计数器,可以很容易的为stack_type结构增加栈数据项的计数器,可以很容易的为stack_type增加一个成员来存储该信息。

仅仅是使接口不变么?应该还有深意吧,但是我不太了解。

问题2.弱智多了的一个问题:怎样在VC下实现多文件编译啊,我新建了一个空的控制台程序,把头文件和源文件都添加进去,这个时候是不是应该对单个文件分别编译呢?linux下可以gcc,但是在VC下呢?

还望高手不吝赐教。

stackADT.h

C/C++ code#include

#ifdef STACKADT_H

#define STACKADT_H

typedef struct stack_type *Stack;

Stack creat(void);

void destroy(Stack s);

void make_empty(Stack s);

bool is_empty(Stack s);

bool is_full(Stack s);

void push(Stack s,int i);

int pop(Stack s);

#endif

stackADT.c

C/C++ code#include

#include

#include"stackADT.h"

struct node

{

int data;

struct node *next;

};

struct stack_type

{

struct node *top;

};

static void terminate(const char *message)

{

printf("%s\n",message);

exit(EXIT_FAILURE);

}

Stack create(void)

{

Stack s = malloc(sizeof(struct stack_type));

if(s == NULL)

terminate("Error ... ");

s -> top = NULL;

retutn s;

}

void destroy(Stack s)

{

make_empty(s);

free(s);

}

void make_empty(Stack s)

{

while(!is_empty(s))

pop(s);

}

int is_empty(Stack s)

{

return s -> top == NULL;

}

int is_full(Stack s)

{

return false;

}

void push(Stack s,int i)

{

struct node * new_node = malloc(sizeof(struct node));

if(new_node == NULL)

terminate("Error ...");

new_node -> data = i;

new_node -> next = s -> top;

s -> top = new_node;

}

int pop(Stack s)

{

struct node * old_top;

int i;

if(is_empty(s))

terminate("Error ...");

old_top = s -> top;

i = old_top -> data;

s -> top = old_top -> next;

free(old_top);

return i;

}

stackclient.c

C/C++ code#include

#include"stackADT.h"

int main()

{

Stack s1,s2;

int n;

s1 = create();

s2 = create();

push(s1,1);

push(s1,2);

n = pop(s1);

printf("Popped %d from s1\n,n");

push(s2,n);

n = pop(s1);

printf("Popped %d from s1\n,n");

push(s2,n);

destroy(s1);

while(! is_empty(s2))

printf("Popped %d from s2\n",pop(s2));

push(s2,3);

make_empty(s2);

if(is_empty(s2))

printf("s2 si empty\n");

else

printf("s2 is not empty\n");

destroy(s2);

return 0;

}

------解决方案--------------------

问题1:

书上已经说得很清楚了,不仅是接口的问题。如果定义的栈多了个结构成员,就只需要修改代码。而不需要重新定义了。

问题2:

点编译按钮

------解决方案--------------------

node的结构体不应频繁改变

------解决方案--------------------

对一个对象在不同的层次上的抽象,

------解决方案--------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值