任务:使用以下头文件在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
还是什么
-
您是对的,在
PutList
中,第二个参数应该是指向您要放入的数据的指针。因此,在您的示例中,如果要保存的数据是一个数字,则需要指向它。但请注意,您的实现似乎没有保留内存,因此您必须自己执行。 -
GetList
的第二个参数是指向结果的指针的指针。当您调用GetList
时,它尚未设置。GetList
会为您设置。
示例:
int x = 8;
List l;
PutList(l, &x); // put a pointer to x into the list
int *y; // y isn't set yet.
GetList(l, &y); // now, y points to x
printf("x is %d. y points to %d.n", x, *y);
希望这能有所帮助!