【发布时间】:2017-12-08 08:55:35
【问题描述】:
我有这个学校作业要做,但我被要求做的功能弄糊涂了。和我做单链表的风格不一样。
我做这样的单链表:
typedef struct structNode{
int data;
struct structNode *next;
} node;
typedef struct structList{
int count;
struct structNode *head, *tail;
} list;
void insertFront(list *L, int x);
void insertRear(list *L, int x);
void insertAt(list *L, int x, int p);
void deleteFront(list *L);
void deleteRear(list *L);
void deleteAt(list *L, int p);
void displayAll(list *L);
所有参数都接收一个指针,但我的作业需要我像这样执行我的代码:
typedef struct node *nodePtr;
struct node {
int item;
nodePtr next;
};
typedef nodePtr Statistician;
Statistician newStatistician();
//allocates memory to the structure. Dynamic allocation
void destroyStatistician(Statistician *s);
//destroys statistician
void add(Statistician s, int x);
//Adds data to the rear
void remove(Statistician s, int x);
//removes data
void displayData(Statistician s);
所以我很困惑有什么区别,因为我习惯了接收指针并且作业风格不同。
我认为带有接收指针的那个是通过引用调用的,这就是为什么我在本地编辑的内容可以全局编辑...
还有我的结构实现与我必须做的有什么不同?
【问题讨论】:
-
您需要了解
typedef struct node *nodePtr;的含义。检查cdecl.org。 -
符号
Statistician是一个类型名,是类型名nodePtr的别名,而nodePtr又是类型struct node *的别名。所以Statistician是一个指针类型。例如add参数s是 一个指针。这非常清楚地显示了定义指针类型别名的危险:它使代码变得不清晰,更难阅读、理解和维护。 -
@Jezreel Tan 我确信这个声明 void add(Statistician s, int x);是错的。相反,它应该看起来像 void add(Statistician *s, int x);
-
@Jezreel Tan :本练习引入information hiding 的合理性。这些用户的 Statistician.h 文件将不包含
struct node { int item; nodePtr next; };- 那里不需要。目标是使Statistician成为opaque pointer type。
标签: c function pointers linked-list structure