【发布时间】:2013-11-16 15:12:17
【问题描述】:
任务:使用此头文件在 C (C++) 中创建列表:
#include <stdio.h>
#include <stdlib.h>
const unsigned int N = 100;
const short ListOk = 0;
const short ListNotMem = 1;
const short ListEmpty = 2;
const short ListFull = 3;
typedef void * base;
typedef struct element * ptrel;
typedef struct element {
base data;
ptrel next;
} element;
typedef struct{
ptrel Start;
ptrel ptr;
unsigned int N;
} List;
static short ListError;
void InitList(List *L);
void PutList(List *L, base E);
void GetList(List *L, base *E);
void ReadList(List *L, base *E);
int EmptyList(List *L);
int FullList(List *L);
unsigned int Count(List *L);
void BeginPtr(List *L);
void EndPtr(List *L);
void MovePtr(List *L);
void MoveTo(List *L, unsigned int n);
void ClearList(List *L);
void CopyList(List *L1, List *L2);
所以,这就是我已经写的:
#include "list.h"
void InitList(List *L) {
L->Start = (ptrel)malloc(sizeof(element));
if (L->Start == NULL) {
ListError = ListNotMem;
return;
}
L->ptr = L->Start;
L->ptr->next = NULL;
ListError = ListOk;
}
void PutList(List *L, base E) {
ptrel tmp = (ptrel)malloc(sizeof(element));
if (tmp == NULL) {
ListError = ListNotMem;
return;
}
if (Count(L) == L->N) {
ListError = ListFull;
free(tmp);
return;
}
tmp->data = E;
tmp->next = L->ptr->next;
L->ptr->next = tmp;
L->ptr = L->ptr->next;
}
void GetList(List *L, base *E) {
if (L->Start == NULL) {
ListError = ListEmpty;
return;
}
*E = L->ptr->next->data;
L->ptr->next = L->ptr->next->next;
}
现在我有一些问题:
- 如何在主程序中使用
PutList?什么是第二个参数?例如,如果我想将 5 放入列表中,我应该使用附加变量吗?像这样:x = 5; PutList(&l, (base)x)。对吧? - 如何使用
GetList?同样,第二个参数是什么?(base)&x还是什么?
【问题讨论】:
-
不相关:如果您认为类型定义指针指向的东西在任何情况下都不再类似于指针 except 将指针隐藏为不透明的“句柄”会以某种方式带来清晰你的代码,你不可能更错了。大多数工程师希望看到星号。也就是说,选择一种语言:C 或 C++,然后删除另一个标签。
-
@WhozCraig 你说的是
void * base,对吧?这不是我的心血来潮,这是任务。我删除了 c++ 标签。 -
关于所有个。除了在 API 中使用不透明句柄隐藏间接性之外,
typedef Type *ptrType;形式的代码的唯一原因是防止在多变量列表中意外声明。 IE。Type* a,b;不声明两个指针,而ptrType a,b;声明。但这是一个最弱的原因,因为如果您犯了Type* a,b;错误,几乎可以保证代码不会正确编译,然后使用b作为指向@987654333 的指针@某处。它只是一个坏习惯,实际上使代码更难阅读。抱歉,如果这是您的预先退出要求。哎哟。 -
@WhozCraig :你再正确不过了。我最近一直在使用 Glib,而且到处都看到
gpointers 而不是void*s 真是令人困惑。
标签: c list linked-list